路由分类
- serviceId路由,指的是ribbon负载均衡路由
routes:
commandKey:
path: /uri
serviceId: service-id
主要核心逻辑在RibbonRoutingFilter类里,如下

这里的RibbonCommandFactory实现类有好几种,默认为HttpClientRibbonCommandFactory

一路下跟

最后核心,也就是设置超时时间的核心逻辑

- url路由,不经过ribbon
routes:
commandKey:
path: /uri
url: http://10.57.1.15:6060
核心类为SimpleHostRoutingFilter,主要是CloseableHttpClient.execute(httpHost, httpRequest);
其实就是新建了个httpClientFactory每次发起一个http请求

超时配置
由于两种路由种类不同,他们的配置也是不一样的
serviceId类型
可以通过Hystrix超时限制,也可以通过ribbon限制,逻辑是这样的
获取ribbonTimeout
if (config配置为空) {
ribbonTimeout = 2000;
} else {
//commandKey:
// ribbon:
// ReadTimeout: 30000
// ConnectTimeout: 30000
int ribbonReadTimeout = 获取commandKey配置的ReadTimeout,默认为1000
int ribbonConnectTimeout = 获取commandKey配置的ConnectTimeout,默认为1000
int maxAutoRetries = 获取commandKey配置的MaxAutoRetries,默认为0
int maxAutoRetriesNextServer = 获取commandKey配置的MaxAutoRetriesNextServer,默认为1
//最后
ribbonTimeout = (ribbonReadTimeout + ribbonConnectTimeout) * (maxAutoRetries + 1) * (maxAutoRetriesNextServer + 1);
}
获取defaultHystrixTimeout,commandHystrixTimeout
if (commandHystrixTimeout > 0) {
//hystrix:
// command:
// commandKey:
// execution:
// isolation:
// thread:
// timeoutInMilliseconds: 60000
hystrixTimeout = commandHystrixTimeout;
} else if (defaultHystrixTimeout > 0) {
hystrixTimeout = defaultHystrixTimeout;
} else {
hystrixTimeout = ribbonTimeout;
}
if (hystrixTimeout < ribbonTimeout) {
LOGGER.warn("ribbonTimeout不能大于hystrixTimeout");
}
return hystrixTimeout;
url类型
可以看到url类型不受限于hystrix和ribbon的配置,是不起作用的
主要是下面的配置起作用

到这,超时配置应该就KO了
ps
- connectTimeoutMillis 从client请求到server连接时间
- socketTimeoutMillis:从client请求到server回应,client接收这整个时间
- 实现自定义的hystrix管理,可以extends RibbonRoutingFilter,extends AbstractRibbonCommandFactory,extends AbstractRibbonCommand<RibbonLoadBalancingHttpClient, RibbonApacheHttpRequest,RibbonApacheHttpResponse> 实现自己的hystrix逻辑
- 实现url的动态超时配置,可以extends SimpleHostRoutingFilter
最后
合理的配置是zuul的连接超时大于hystrix超时或者ribbon超时
zuul
host:
connect-timeout-millis: 15000 #ms HTTP连接超时要比Hystrix的大,否则hystrix不起作用
socket-timeout-millis: 60000 #ms socket通信超时
#ribbonTimeout = (ReadTimeout + ConnectTimeout) * (maxAutoRetries + 1) * (maxAutoRetriesNextServer + 1);
ribbon:
ReadTimeout: 10000
ConnectTimeout: 10000
# int ribbonTimeout = (ReadTimeout + ConnectTimeout) * (maxAutoRetries + 1) * (maxAutoRetriesNextServer + 1);
# int defaultHystrixTimeout = 获取方法;
# int commandHystrixTimeout = 获取方法;
# int hystrixTimeout;
# if (commandHystrixTimeout > 0) { hystrixTimeout = commandHystrixTimeout;
# }else if (defaultHystrixTimeout > 0) { hystrixTimeout = defaultHystrixTimeout;
# }else { hystrixTimeout = ribbonTimeout; }
# if (hystrixTimeout < ribbonTimeout) { warn但啥都不做 }
# return hystrixTimeout;
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 60000
168万+





