zuul的超时配置探究

路由分类
  • 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
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值