流控是对外部来的大流量进行控制,熔断降级的视角是对内部问题进行处理。
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中添加依赖
- <dependency>
- <groupId>com.alibaba.cspgroupId>
- <artifactId>sentinel-datasource-nacosartifactId>
- dependency>
(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 源码体系结构
注意