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