hystrix是springcloud中扮演断路器的组件,主要是为微服务提供熔断、限流、降级等功能。
本文主要通过代码演示关于hystrix各种超时相关的配置。

演示代码
通过postman调用order服务queryOrderTimeout接口方法,传入一个time参数,用来模拟服务响应时间,使用restTemplate调用logistical服务,睡眠time时间。

order服务接口

@RequestMapping("/queryOrderTimeout")
public String queryOrderTimeout(@RequestParam("time") int time) {
    return orderService.queryOrderTimeout(time);
}

restTemplate调用logistical服务

@HystrixCommand(fallbackMethod = "queryOrderTimeoutFallback",
            commandKey = "queryOrderTimeout")
public String queryOrderTimeout(int time) {
    log.info("queryOrderTimeout request wait time: " + time);
    String url = "http://logistical/logistical/noticeWarehouseTimeout?time=" + time;
    String str = restTemplate.getForObject(url, String.class);
    return str;
}

public String queryOrderTimeoutFallback(int time) {
    log.error("hystrix queryOrderTimeoutFallback...");
    return "queryOrderTimeoutFallback fail: " + time;
}

  

logistical服务接口

@RequestMapping("/noticeWarehouseTimeout")
public String noticeWarehouseTimeout(@RequestParam("time") int time) throws InterruptedException {
    Thread.sleep(time);
    return "sleep time: " + time;
}

 

1、同时开启了ribbon超时与hystrix超时设置

//开启ribbon超时管理
ribbon.http.client.enabled=true
//请求超时时间
ribbon.ReadTimeout=2000
//连接超时时间
ribbon.ConnectTimeout=2000
//开启hystrix超时管理
hystrix.command.default.execution.timeout.enabled=true
//hystrix超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000

   

time参数传入1000,即服务响应需要1秒,能够正常响应。

在这里插入图片描述
 

time参数传入3000,虽然没有达到hystrix设置的5秒,但还是熔断了,因为超过了ribbon的2秒。在这里插入图片描述

 

现在修改如下两个参数,ribbon时间大于hystrix时间,其他不变。

ribbon.ReadTimeout=5000
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000

 

time参数传入3000,得到的结果与上一个测试一样。在这里插入图片描述

time参数传入1000,则正常响应,这里就不再截图了。


到此得出验证,如果ribbon和hystrix同时开启,则以配置最小的为准。

2、同时开启了ribbon超时,关闭hystrix超时设置

ribbon.ReadTimeout=5000
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000
hystrix.command.default.execution.timeout.enabled=false

 

先是time参数传入1000,能够正常响应,没问题。在这里插入图片描述

time参数传入3000,超过了hystrix设置的2000,但是hystrix此时被关闭了,所以也可以正常响应。
在这里插入图片描述

在这里插入图片描述

time参数传入6000,超过了ribbon设置的5000,所以响应失败。
在这里插入图片描述

在这里插入图片描述

到此得出验证,如果关闭了hystrix的超时时间,则请求的超时只依据ribbon中配置的时间。

如果ribbon中配置了重试机制,那么建议hystrix的超时时间为
(1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout,避免在重试完成前被hystrix熔断了。
————————————————
版权声明:本文为CSDN博主「码拉松」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CSDN_WYL2016/article/details/106387369

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐