Hystrix的使用3服务熔断CircuitBreaker

编程

Hystrix的使用3-服务熔断Circuit Breaker

1.服务熔断的作用

熔断这一概念来源于电子工程中的断路器(Circuit Breaker)。在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。

在固定时间窗口内,接口调用超时比率达到一个阈值,会开启熔断。进入熔断状态后,后续对该服务接口的调用不再经过网络,直接执行本地的默认方法,达到服务降级的效果。

熔断不可能是永久的。当经过了规定时间之后,服务将从熔断状态回复过来,再次接受调用方的远程调用。

2.服务熔断的三种状态

  • 熔断关闭状态(Closed)服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制。
  • 熔断开启状态(Open)在固定时间窗口内(Hystrix默认是10秒),接口调用出错比率达到一个阈值(Hystrix默认为50%),会进入熔断开启状态。进入熔断状态后,后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法。
  • 半熔断状态(Half-Open)在进入熔断开启状态一段时间之后(Hystrix默认是5秒),熔断器会进入半熔断状态。所谓半熔断就是尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断关闭状态。

3.代码实现

在Hystrix的使用2-服务降级fallback代码的基础上增加服务熔断测试代码。

3.1 服务接口PaymentHystrixService

在PaymentHystrixService接口中增加getPaymentBreak熔断测试方法。

    /**

* 熔断方法

* @param id

* @return

*/

public CommonResult getPaymentBreak(Long id);

3.2 服务实现类PaymentHystrixServiceImpl

在实现类中增加熔断测试方法和对应的降级方法。同样是在方法上增加@HystrixCommand注解,在注解中增加服务降级方法配置fallbackMethod,同时通过commandProperties属性增加服务熔断的配置。

下面代码表示:检测次方法最近的10次调用情况,如果错误率超过60%,就进入熔断。进入熔断后10秒钟(10000毫秒),进入半熔断状态,检测此时接口是否正常,如果正常就关闭熔断器。

    /**

* 服务熔断测试方法

* @param id

* @return

*/

@HystrixCommand(fallbackMethod = "getPaymentBreakFallbackMethod", commandProperties = {

@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),//检测最近10次请求

@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),//过多久再次检测是否关闭熔断器

@HystrixProperty(name ="circuitBreaker.errorThresholdPercentage",value = "60")//错误率为60%就开启熔断器

})

@Override

public CommonResult getPaymentBreak(Long id)

{

//id小于0就进入超时逻辑

if (id < 0) {

try

{

//execution.isolation.thread.timeoutInMilliseconds默认是1秒,所以这里会超时

TimeUnit.MILLISECONDS.sleep(5000);

}

catch (InterruptedException e)

{

log.error("执行getPaymentBreak方法超时,请稍后重试");

}

}

//id大于等于0是正常逻辑

return new CommonResult(200, "请求ID为:" + id + ", 当前线程是:" + Thread.currentThread().getName() + ", 服务端口:" +

SERVER_PORT + ", 请求正确");

}

//熔断降级方法

public CommonResult getPaymentBreakFallbackMethod(Long id)

{

return new CommonResult(200, "请求ID为:" + id + ", 当前线程是:" + Thread.currentThread().getName() + ", 服务端口:" +

SERVER_PORT + ", 请求错误,进入降级熔断方法");

}

3.3 测试

启动工程。

3.3.1 测试步骤

  • 先输入id>=0,调用接口,查看是否正常返回。
  • 然后输入id<0,不断的调用接口(大于10次),查看是否进入降级方法。
  • 这时紧接着输入id>=0,调用接口,查看返回结果。
  • 等待10秒,再次输入id>=0,调用接口,查看返回结果。

3.3.2 思考

上述测试步骤的每步的返回结果是什么?

3.3.3 验证

先输入id>=0,调用接口,接口返回正常。


然后输入id<0,不断的调用接口(大于10次),接口每次都是返回降级方法的内容。


从上面的图片我们可以看出:

  • 输入id<0,不断的调用接口(大于10次),接口每次都是返回降级方法的内容。
  • 这时紧接着输入id>=0,调用接口,返回的也是降级方法的内容。说明服务已经熔断。
  • 等到10秒后,输入id>=0,调用接口,接口又返回正常。

4.代码请见

https://github.com/ainydexiaohai/cloud2020

5.参考文章

  • 漫画:什么是服务熔断?
  • CircuitBreaker
  • 尚硅谷SpringCloud培训课程

以上是 Hystrix的使用3服务熔断CircuitBreaker 的全部内容, 来源链接: utcz.com/z/518492.html

回到顶部