服务熔断
断路器
一句话就是家里的保险丝
熔断是什么?
马丁福勒,微服务架构设计理念提出者。
服务熔断
熔断器 关闭、半开,开。
实操
- 在PaymentHystrixMain8001下的PaymentService添加一下代码
//===========================服务熔断============================================
@HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallback",commandProperties = {
@HystrixProperty(name="circuitBreaker.enabled",value = "true"),//是否开启断路器
@HystrixProperty(name="requestVolumeThreshold",value = "10"),// 请求次数
@HystrixProperty(name = "sleepWindowInMilliseconds",value = "10000"),//时间窗口期
@HystrixProperty(name = "errorThresholdPercentage",value = "60")//失败率达到多少后跳闸
})
public String paymentCircuitBreaker(@PathVariable("id") Integer id) {
if (id < 0) {
throw new RuntimeException();
} else {
String serialNumber = IdUtil.simpleUUID();
return Thread.currentThread().getName() + "\t " + "调用成功,流水号: " + serialNumber;
}
}
public String paymentCircuitBreakerFallback(@PathVariable("id") Integer id) {
return "id不能为负数,请稍后再试 id:" + id;
}
- 为什么配置这些参数
可以在HystrixCommandProperties类中查看一下源码:
- 在PaymentHystrixController中添加,
// ***************服务熔断************************
@GetMapping("/payment/circuit/{id}")
public String paymentCircuitBreaker(@PathVariable("id") Integer id){
String circuitBreaker = paymentService.paymentCircuitBreaker(id);
log.info("******result: "+circuitBreaker);
return circuitBreaker;
}
测试
http://localhost:8001/payment/circuit/31
http://localhost:8001/payment/circuit/-31
多次错误,然后慢慢正确,发现刚开始不满足条件,就算是正确的访问地址,得到的结果也是错误的返回信息。说明此时熔断机制打开了,慢慢的默认数秒之后,尝试进入半开half-open,发现是正确的,熔断机制则关闭。