OpenFeign + + Hystrix时,定制开发小程序超时时间的配置
参考博文:https://www.cnblogs.com/WaterGe/p/11687118.html
定制开发小程序当我们的系统,同时定制开发小程序使用到上面三者时,定制开发小程序必定需要进行一些相关的配置,定制开发小程序否则有可能会因为优先定制开发小程序级和默认值等关系出现定制开发小程序和预料的结果不同的情况,特别是在超时时间上。
(1)可配置的部分
# false表示hystrix不进行超时控制,也就是超时控制交给了Ribbon处理# true则表示hystrix、ribbon都会进行超时控制,谁配置的超时时间小谁生效,默认值位truehystrix.command.default.execution.timeout.enable=true# hystrix的超时时间(无论是熔断还是降级,都起作用),默认值为1秒(太短了,这个配置绝大多数情况都需要修改)hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=9000# 10s内触发熔断的最小请求次数,默认值为20circuitBreaker.requestVolumeThreshold=30# 10s内请求达到上面配置的次数时,如果这些请求超过70%是失败的,则触发熔断。默认值为50%circuitBreaker.errorThresholdPercentage=70# 触发熔断后,休眠时间,这段时间内都是走fallback方法。默认值为5秒# 休眠结束后,会开启半试探,尝试放一部分请求进入,只要有一个请求成功,则熔断关闭,恢复正常circuitBreaker.sleepWindowInMilliseconds=10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
上面的配置中,后4个配置经常用在配置熔断方法的@HystrixCommand注解内。注解内配置的优先级高于配置文件的。
//熔断测试(超时)@GetMapping("/timeoutFusingTest")@HystrixCommand( fallbackMethod = "timeoutFallback", commandProperties = { //开启断路器 @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //10s内达到请求次数达到后,才进行失败阈值判断 //测试设为1 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "1"), //失败阈值判断,超过此失败率就熔断 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"), //触发熔断5秒后,开启半试探(只要有一个通过,熔断关闭) @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "5000"), //指定超时时间(2秒) @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000") })public ResultTemplate<Object> timeoutFusingTest(){ ResultTemplate<Object> res = new ResultTemplate<>(); if(!timeoutFusingFlag){ timeoutFusingFlag = true; try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } return res.success(StatusCode.SUCCESS.getCode(), "没有超时,没有熔断,接口成功调用");}public ResultTemplate<Object> timeoutFallback(){ ResultTemplate<Object> res = new ResultTemplate<>(); return res.error(StatusCode.ERROR.getCode(), "所调用接口超时,服务熔断中……");}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
(2)Ribbon可配置的部分
# 请求处理超时时间ribbon.ReadTimeout=1000 # 请求连接超时时间ribbon.ConnectTimeout=1000 # 最大连接数ribbon.MaxTotalConnections= # 本主机最大连接数ribbon.MaxConnectionsPerHost= # 同一台实例的最大重试次数,默认为1ribbon.MaxAutoRetries=1 # 重拾负载均衡其他实例的最大重试次数,默认为0ribbon.MaxAutoRetriesNextServer=0 # 是否对所有操作都重试,默为false。false表示GET请求,连接、请求失败都会重试,非GET请求只有连接失败才会重试ribbon.OkToRetryOnAllOperations=false
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
(3)OpenFeign可配置的部分
# fFeign是否开启断路器,默认false。如果Feign需要fallback降级,一定要打开feign.hystrix.enabled=true # Feign连接建立超时时间,默认10秒 feign.client.config.default.connectTimeout=10000 # Feign的请求处理超时时间,默认值为60秒feign.client.config.default.readTimeout=60000 # Feign使用默认的超时配置,默认单次请求最大时长1秒,重试5次feign.client.config.default.retryer=feign.Retryer.Default
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
如果上面各种超时配置都生效,则时间小的配置生效
-
如果使用到了,因为Feign默认配置是不会启动Hystrix的,并且Feign底层是调用Ribbon来实现负载均衡,所以为了不和Ribbon的重试机制冲突,所以Feign也不会启动重试机制。所以,如果在有Feign的情况下,还要在配置文件中配置Hystrix,或者说Feign需要使用到Hystrix功能(服务降级),那么就需要Feign就需要开启Hystrix
feign.hystrix.enabled=true
- 1
-
Feign的超时时间比较长,所以一般超时时间在Ribbon和Hystrix之间权衡。(当然如果他们设置的时间比Feign的还要就,那么就是Feign的生效了)
-
Hystrix的默认超时时间1秒,太短了,这个经常需要修改
# 包含连接和请求时间hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=9000
- 1
- 2
-
Ribbon的超时时间,可以配置连接超时和请求超时,默认都是1秒,并且Ribbon默认有1次重试机会,所以对于Ribbon来说,默认的超时时间为**(连接超时时间 + 请求超时时间)* 重试次数** = (1+1)* 2 = 4秒
-
总结:
- 在使用Feign的情况下还要结合使用Hystrix,那么首先需要Feign开启Hystrix支持
- 配置Hystrix超时时长
- 配置Ribbon的ConnectTimeout和ReadTimeout(4秒有时也不够,可能需要配置久一些)