概念说明
消费者order-service需要先调用product-service获取具体的product,然后再处理其他的业务逻辑。但是这个product-service接口不是很稳定,经常抛出异常;或者是响应缓慢,导致order-service的响应变慢;如果置之不理,order-service可能会被product-service拖垮。这时候为了保护order-service,我们需要对product-service接口进行熔断。
总之:熔断是通过限制自己对外部系统的调用, 起到节约响应时间、维护链路稳定的作用。
熔断配置
Sentinel中的熔断降级有三个降级策略:
RT(平均响应时间):
当资源的平均响应时间超过阈值之后,资源进入准降级状态。接下来如果持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口之内,对这个方法的调用都会自动抛出 DegradeException 异常。在下一个时间窗口到来时, 会接着再放入5个请求, 再重复上面的判断.
异常比例
当资源的每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态,即在接下的时间窗口之内,对这个方法的调用都会自动地抛出DegradeException异常。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
异常数
当资源近 1 分钟的异常数目超过阈值之后会进行熔断。
首先我们对原接口进行改造,让其直接抛出Runtimeexception:
@GetMapping(value = "/hello")
@SentinelResource(value = "hello",fallback = "fallbackHandler")
public String hello() {
return "Hello Sentinel";
}
@GetMapping(value = "/hello")
@SentinelResource(value = "hello",fallback = "fallbackHandler")
public String hello() {
log.info("****hello-hello-hello-hello-hello");
i++;
//异常比例为0.667
if (i % 3 != 0) {
throw new RuntimeException();
}
return "Hello Sentinel";
}
/**
* 自定义熔断异常
* 返回值和参数要跟目标函数一样
*/
public String fallbackHandler(){
return ResultData.fail(500,"服务被熔断了,不要调用!");
}
设置如下的熔断规则
如果hello
的异常率超过50%,那么接下来5秒内直接触发熔断降级,默认情况会抛出DegradeException
异常
持久化配置
- 引入
sentinel-datasource-nacos
组件,跟限流一样配置即可
在nacos中建立配置文件sentinel-service-sentinel
,做如下配置
[
{
"resource": "hello",
"count": 0.5,
"grade": 1,
"passCount": 0,
"timeWindow": 5
}
]
可以看到上面配置规则是一个数组类型,数组中的每个对象是针对每一个保护资源的配置对象,每个对象中的属性解释如下:
- resource:资源名,即降级规则的作用对象
- count:阈值
- grade:降级模式 0:RT 1:异常比例 2:异常数
- timeWindow:时间窗口(单位秒)
- 进入sentinel查看dashboard,发现sentinel自动获取nacos的配置