一、基本原理
之前的入门文章里面已经详细介绍过,这里就不再赘述,不懂的可以参考之前的文章:
今天,我们是以实战代码的形式模拟一些异常,演练这些原理
二、实战演练
我们来演示什么场景呢?
- 演示熔断器三种状态的转换(close——half-open——open)
- 演示熔断器下的降级策略
1、构建熔断器策略
- withMetricsRollingStatisticalWindowBuckets
注意:这里设置的窗口大小一定要 >= withCircuitBreakerRequestVolumeThreshold,否则断路器始终open不了。默认滑动窗口大小:10
- withMetricsRollingStatisticalWindowInMilliseconds
默认滑动窗口时间窗:10s。
- withCircuitBreakerRequestVolumeThreshold
滑动窗口时间窗内,经过短路器的流量超过了一定的阈值,才执行短路。默认是20次
- withCircuitBreakerErrorThresholdPercentage
滑动窗口时间窗内,断路器统计到的异常调用的占比超过了一定的阈值,才执行短路,默认是50%。
- withCircuitBreakerSleepWindowInMilliseconds
open到half-open状态(试探服务)的时间。默认值:5000ms
本次我们采用的熔断器策略为:我们以该策略来模拟场景验证
.withMetricsRollingStatisticalWindowBuckets(2)
.withMetricsRollingStatisticalWindowInMilliseconds(6000)
.withCircuitBreakerRequestVolumeThreshold(2)
.withCircuitBreakerErrorThresholdPercentage(40)
.withCircuitBreakerSleepWindowInMilliseconds(6000))
简而言之:无非就掌握三种状态的转换(open——half——open)
- open:在滑动窗口内(2个窗),滑动窗口时间窗内(6s),经过断路器的流量 >= 2,且错误比例>40%
- open ~ half-open:再经过6s的时间
- half-open ~ close:成功访问一次
2、异常模拟
if(adId.equals(-1L)) {
// 如果调用失败了,报错了,那么就会去调用fallback降级机制
throw new Exception();
}
即:AdId=-1的请求为异常请求
3、单元测试类
依赖系统启动:spring-boot-hystrix-ad
项目名:spring-boot-hystrix-circuit-breaker
实验实录:
1)open close状态
2)异常统计信息
2)open状态
3)open ~ half-open and half-open ~ close
4、结合hystrix-dashboard测试熔断器原理
启动我们的Tomcat,打开我们的监控仪表盘:http://localhost:8080/hystrix-dashboard/
基本配置:http://localhost:8022/hystrix.stream
从界面上观察熔断器的状态转换:
从界面上,我们可以观察如下几点变化:
- Circuit:Closed ~ Open(界面上是看不到half-open)
- Success:10
- Failure:3
- Reject:3
- Success:3
閱讀更多 極客慧 的文章