当前位置 > it书童 > java > 正文

hystrix 服务熔断

java it书童 2020-11-23 09:56:53 0赞 0踩 191阅读 0评论

服务熔断

前文的服务降级会向服务方发起请求,服务熔断连请求都不发起,休眠期后才开启请求

熔断器,也叫断路器,其英文单词为:Circuit Breaker

1525658640314

熔断状态机3个状态:

  • Closed:关闭状态,所有请求都正常访问。

  • Open:打开状态,所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。

  • Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计时

代码示例

为了能够精确控制请求的成功或失败,我们在consumer的调用业务中加入一段逻辑:

@GetMapping
@ResponseBody
@HystrixCommand // 声明需要熔断,必须与熔断方法的返回值一致
public String queryUserById(@RequestParam("id") Long id) {
    if (id == 1) {
        throw new RuntimeException();
    }
    return this.restTemplate.getForObject("http://service-provider/user/" + id, String.class);
}

这样如果参数是id为1,一定失败,其它情况都成功。(不要忘了清空 service 中的休眠逻辑)

我们准备两个请求窗口:

  • 一个请求:http://localhost/consumer/user?id=1 注定失败

  • 一个请求:http://localhost/consumer/user?id=2 肯定成功

当我们疯狂访问id为1的请求时(超过20次),就会触发熔断。断路器会断开,一切请求都会被降级处理。

此时你访问id为2的请求,会发现返回的也是失败,而且失败时间很短,只有几毫秒左右

不过,默认的熔断触发要求较高,休眠时间窗较短,为了测试方便,我们可以通过配置修改熔断策略:

circuitBreaker.requestVolumeThreshold=10
circuitBreaker.sleepWindowInMilliseconds=10000
circuitBreaker.errorThresholdPercentage=50

解读:

  • requestVolumeThreshold:触发熔断的最小请求次数,默认20

  • errorThresholdPercentage:触发熔断的失败请求最小占比,默认50%

  • sleepWindowInMilliseconds:休眠时长,默认是5000毫秒

源码 javaDemo b177499

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/863