流控是对外部来的大流量进行控制,熔断降级的视角是对内部问题进行处理。
Sentinel 降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断 。
这里的降级其实是Hystrix中的熔断
Hystrix的工作流程
策略
Sentinel不会像Hystrix那样放过一个请求尝试自我修复,就是明明确确按照时间窗口来,熔断触发后,时间窗口内拒绝请求,时间窗口后就恢复。
RT(平均响应时间 ):当 1s 内持续进入 >=5 个请求,平均响应时间超过阈值(以 ms 为单位),那么在接下的时间窗口(以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。
异常比例:当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态,即在接下的时间窗口(以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0] ,代表 0% - 100%。
异常数:当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。
时间窗口 >= 60s
@SentinelResource注解类似于Hystrix中的@HystrixCommand注解,@SentinelResource注解中有两个属性需要我们进行区分,blockHandler属性用来指定不满足Sentinel规则的降级兜底方法,fallback属性用于指定Java运行时异常兜底方法 。
(1)在API接口资源处配置
package com.lagou.edu.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.lagou.edu.config.SentinelHandlersClass;
import com.lagou.edu.controller.service.ResumeServiceFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/autodeliver")
public class AutodeliverController {
@Autowired
private ResumeServiceFeignClient resumeServiceFeignClient;
/**
@SentinelResource
value:定义资源名
blockHandlerClass:指定Sentinel规则异常兜底逻辑所在class类
blockHandler:指定Sentinel规则异常兜底逻辑具体哪个⽅法
fallbackClass:指定Java运⾏时异常兜底逻辑所在class类
fallback:指定Java运⾏时异常兜底逻辑具体哪个⽅法
*/
@GetMapping("/checkState/{userId}")
// @SentinelResource注解类似于Hystrix中的@HystrixCommand注解
@SentinelResource(value = "findResumeOpenState",blockHandlerClass = SentinelHandlersClass.class,
blockHandler = "handleException",fallbackClass = SentinelHandlersClass.class,fallback = "handleError")
public Integer findResumeOpenState(@PathVariable Long userId) {
// 模拟降级:
/*try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
// 模拟降级:异常比例
//int i = 1/0;
Integer defaultResumeState = resumeServiceFeignClient.findDefaultResumeState(userId);
return defaultResumeState;
}
}
(2)自定义兜底逻辑类(注意:兜底类中的方法为static静态方法)
package com.lagou.edu.config;
import com.alibaba.csp.sentinel.slots.block.BlockException;
public class SentinelHandlersClass {
// 整体要求和当时Hystrix一样,这里还需要在形参中添加BlockException参数,用于接收异常
// 注意:方法是静态的
public static Integer handleException(Long userId, BlockException blockException) {
return -100;
}
public static Integer handleError(Long userId) {
return -500;
}
}
目前,Sentinel Dashboard中添加的规则数据存储在内存,微服务停掉规则数据就消失,在生产环境下不合适。我们可以将Sentinel规则数据持久化到Nacos配置中心,让微服务从Nacos获取规则数据。
(1) 自动投递微服务的pom.xml中添加依赖
com.alibaba.csp
sentinel-datasource-nacos
(2)自动投递微服务的application.yml中配置Nacos数据源
server:
port: 8098
spring:
application:
name: lagou-service-autodeliver
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
sentinel:
transport:
dashboard: 127.0.0.1:8080 # sentinel dashboard/console 地址
port: 8719 # sentinel会在该端口启动http server,那么这样的话,控制台定义的一些限流等规则才能发送传递过来,
#如果8719端口被占用,那么会依次+1
# Sentinel Nacos数据源配置,Nacos中的规则会自动同步到sentinel流控规则中
datasource:
# 自定义的流控规则数据源名称
flow: # 此处的flow为自定义数据源名
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
data-id: ${spring.application.name}-flow-rules
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow # 类型来自RuleType类
# 自定义的降级规则数据源名称
degrade:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
data-id: ${spring.application.name}-degrade-rules
groupId: DEFAULT_GROUP
data-type: json
rule-type: degrade # 类型来自RuleType类
(3)Nacos Server中添加对应规则配置集(public命名空间—>DEFAULT_GROUP中添加)
流控规则配置集 lagou-service-autodeliver-flow-rules
[
{
"resource":"findResumeOpenState",
"limitApp":"default",
"grade":1,
"count":1,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
所有属性来自源码FlowRule类
降级规则配置集 lagou-service-autodeliver-degrade-rules
[
{
"resource":"findResumeOpenState",
"grade":2,
"count":1,
"timeWindow":5
}
]
所有属性来自源码DegradeRule类
Rule 源码体系结构
注意