微服务中的限流降级 Sentinel
一、基础
1、特点
二、Sentinel使用
1、服务端安装
-
下载压缩包
java -jar sentinel-dashboard-1.6.3.jar --server.port=19091 访问: <ip>:19091 默认账号密码:sentinel/sentinel
2、客户端
-
引入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
-
增加 yml配置
spring.cloud.sentinel.transport.dashboard=<ip>:19091 #控制台访问地址 spring.cloud.sentinel.transport.port=8719 #应用和sentinel之间传输数据端口默认是 8719 feign.sentinel.enabled=true #激活对 feign的支持
3、限流:对 URI
(1)“簇点链路” 找到对应 URI,设置 “流控”
(2)限流规则
-
QPS:每秒请求数
-
线程数:每秒处理线程
-
流控模式-关联:当关联的资源达到阈值,限流自己
-
流控效果-预热:QPS从 threshold/3 开始,经过多少时长达到 threshold
-
流控效果-排队等待:达到 阈值排队等待,并设置超时时间
4、降级规则
(1)“降级规则” 下点击 “新增降级规则”
(2)限流设置
-
RT 平均响应时间:每秒达到 5请求,且平均响应时间都超过阈值
-
异常比例:每秒达到 5请求,且 每秒异常数 / 通过总量 比值超过阈值
-
异常数:每分钟异常数超过阈值
5、热点规则
(1)“热点规则” 下点击 “新增热点限流规则”
(2)限流设置
-
参数限制:根据配置的参数限制请求量(如参数为 userId,那么如果 userId=1的请求超过了阈值则对它的请求熔断,但 userId=2则不会)
-
参数例外项:在参数限制情况下,可以对某个特殊参数值特殊处理(如 userId=1的参数阈值跟别人不一样)
6、系统规则
(1)“系统规则” 下点击 “新增系统规则”
(2)限流设置
7、自定义保护资源 @SentinelResource(类似 @HystrixCommand)
(1)指定资源(value值),自定义降级方法
-
代码增加如下
@SentinelResource(value = "orderProduct", blockHandler = "blockHandlerMethod", fallback = "blockHandlerMethod") @RequestMapping("/restful") public Object restful(){ String result = providerService.provicer(); return result; } public Object blockHandlerMethod(BlockException ex){ System.out.println("注解降级"); return "注解降级了"; } # 可用以下指定降级类,不跟业务类耦合 // @SentinelResource(value = "orderProduct", blockHandlerClass = BlockException.class, blockHandler = "blockHandlerMethod") # blockHandler 管流量异常,fallback 管业务异常
-
管理端 “新增流控规则”,对资源 orderProduct进行限流配置
8、网关限流
三、持久化规则
-
引入依赖
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>
-
yml 增加
spring: cloud: sentinel: datasource:#关键点在这个配置Nacos ds1: nacos: server-addr: localhost:8848 dataId: cloudalibaba-sentinal-service groupId: DEFAULT_GROUP data-type: json rule-type: flow
-
nacos 增加配置