Hystrix服务熔断入门案例
2021-08-31 本文已影响0人
CodeYang
一、服务熔断代码实现,及测试
- 新增 Controller 测试控制类 ,CHystrixCircuitBreakerController
/**
* 服务熔断
*/
@RestController
public class CHystrixCircuitBreakerController {
//整体解释:在十秒中,有十次请求,请求错误率达到 60% 跳闸
@HystrixCommand(fallbackMethod = "providerCircuitBreaker_FallBack",commandProperties = {
//是否开启断路器
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
//请求次数
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
//时间窗口期(时间范围)
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
//失败率达到多少后跳闸
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")
})
@GetMapping("/provider/circuitbreaker/{id}")
public String providerCircuitBreaker(@PathVariable("id")Integer id){
if(id<0){
throw new RuntimeException("********id 不能为负数");
}
String serialNumber=String.valueOf(System.currentTimeMillis());
return "调用成功,流水号:"+serialNumber+" 线程号:"+Thread.currentThread().getName();
}
public String providerCircuitBreaker_FallBack(@PathVariable("id")Integer id){
return "调用失败,id 不能为负数,当前 id :"+id;
}
}
- 请求测试
在十秒中,有十次请求,请求错误率达到 60% 跳闸。正确的访问也会收到影响。
正常访问:http://localhost:8001/provider/circuitbreaker/-20
这时狂刷:http://localhost:8001/provider/circuitbreaker/-20
再次访问:http://localhost:8001/provider/circuitbreaker/-20
断路器打开.png断路器在什么情况下开始起作用?
三个重要参数.png涉及到的三个重要参数:快照时间窗、请求总阀值、错误百分比阀值。
-
快照时间窗:断路器确定是否打开,需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。
-
请求总数阀值:在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10秒内,如果该 hystrix 命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。
-
错误百分比阀值:当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过了50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开。
断路器打开之后
-
再有请求调用的时候,将不会调用主逻辑,而是直接调用降级 fallback。 通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。
-
原来的主逻辑要如何恢复?
对于这一问题,Hystrix 也为我们实现了自动恢复功能。
当断路器打开,对于主逻辑进行熔断之后,hystrix 会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑。
当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果此次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。