OpenFeign + Ribbon + Hystrix,超时时间的配置

OpenFeign + Ribbon + Hystrix时,超时时间的配置

参考博文:https://www.cnblogs.com/WaterGe/p/11687118.html

​ 当我们的系统,同时使用到上面三者时,必定需要进行一些相关的配置,否则有可能会因为优先级和默认值等关系出现和预料的结果不同的情况,特别是在超时时间上。

(1)Hystrix可配置的部分
# false表示hystrix不进行超时控制,也就是超时控制交给了Ribbon处理
# true则表示hystrix、ribbon都会进行超时控制,谁配置的超时时间小谁生效,默认值位true
hystrix.command.default.execution.timeout.enable=true

# hystrix的超时时间(无论是熔断还是降级,都起作用),默认值为1秒(太短了,这个配置绝大多数情况都需要修改)
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=9000

# 10s内触发熔断的最小请求次数,默认值为20
circuitBreaker.requestVolumeThreshold=30

# 10s内请求达到上面配置的次数时,如果这些请求超过70%是失败的,则触发熔断。默认值为50%
circuitBreaker.errorThresholdPercentage=70

# 触发熔断后,休眠时间,这段时间内都是走fallback方法。默认值为5秒
# 休眠结束后,会开启半试探,尝试放一部分请求进入,只要有一个请求成功,则熔断关闭,恢复正常
circuitBreaker.sleepWindowInMilliseconds=10

​ 上面的配置中,后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(), "所调用接口超时,服务熔断中……");
}
(2)Ribbon可配置的部分
# 请求处理超时时间
ribbon.ReadTimeout=1000 			
	# 请求连接超时时间
ribbon.ConnectTimeout=1000				
# 最大连接数
ribbon.MaxTotalConnections=				
# 本主机最大连接数
ribbon.MaxConnectionsPerHost=			
# 同一台实例的最大重试次数,默认为1
ribbon.MaxAutoRetries=1					
# 重拾负载均衡其他实例的最大重试次数,默认为0
ribbon.MaxAutoRetriesNextServer=0		

# 是否对所有操作都重试,默为false。false表示GET请求,连接、请求失败都会重试,非GET请求只有连接失败才会重试
ribbon.OkToRetryOnAllOperations=false	
(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  

如果上面各种超时配置都生效,则时间小的配置生效

  • 如果使用到了Feign,因为Feign默认配置是不会启动Hystrix的,并且Feign底层是调用Ribbon来实现负载均衡,所以为了不和Ribbon的重试机制冲突,所以Feign也不会启动重试机制。所以,如果在有Feign的情况下,还要在配置文件中配置Hystrix,或者说Feign需要使用到Hystrix功能(服务降级),那么就需要Feign就需要开启Hystrix

    feign.hystrix.enabled=true
    
  • Feign的超时时间比较长,所以一般超时时间在Ribbon和Hystrix之间权衡。(当然如果他们设置的时间比Feign的还要就,那么就是Feign的生效了)

    • Hystrix的默认超时时间1秒,太短了,这个经常需要修改

      # 包含连接和请求时间
      hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=9000
      
    • Ribbon的超时时间,可以配置连接超时和请求超时,默认都是1秒,并且Ribbon默认有1次重试机会,所以对于Ribbon来说,默认的超时时间为**(连接超时时间 + 请求超时时间)* 重试次数** = (1+1)* 2 = 4秒

总结:
  • 在使用Feign的情况下还要结合使用Hystrix,那么首先需要Feign开启Hystrix支持
  • 配置Hystrix超时时长
  • 配置Ribbon的ConnectTimeout和ReadTimeout(4秒有时也不够,可能需要配置久一些)
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值