SpringCloud Alibaba微服务--Sentinel的使用
一、Sentinel概念及优势
1、Sentinel简介
Sentinel 是阿里巴巴开源的 流量控制、熔断降级、系统保护 的轻量级框架,主要用于 微服务架构 下的高可用防护。 与 Hystrix 类似,但 Sentinel 提供了更丰富的流量控制策略和实时监控能力,适用于 Spring Cloud Alibaba 生态。
2、Sentinel核心功能
功能 | 说明 |
---|---|
流量控制 | 控制 QPS、线程数等,防止系统被突发流量击垮 |
熔断降级 | 当服务不稳定时自动熔断,避免级联故障 |
系统自适应保护 | 根据系统负载动态调整流量 |
实时监控 | 提供 Dashboard 可视化监控 |
热点参数限流 | 对特定参数(如用户ID)进行精细限流 |
集群流控 | 支持分布式集群限流 |
3、Sentinel优势
- 轻量级,高性能
- 丰富的流量控制策略
- 实时监控和动态规则调整
4、Sentinel VS Hystrix
对比项 | Sentinel | Hystrix |
---|---|---|
流量控制 | ✅ QPS、线程数、系统负载 | ❌ 仅支持线程池/信号量 |
熔断策略 | ✅ 慢调用比例、异常比例、异常数 | ✅ 仅异常比例 |
热点限流 | ✅ 支持 | ❌ 不支持 |
实时监控 | ✅ 提供 Dashboard | ❌ 依赖 Turbine |
规则持久化 | ✅ 支持 Nacos、ZooKeeper | ❌ 不支持 |
二、Sentinel安装与使用
1、Sentinel下载
下载地址:Release v1.8.3 · alibaba/Sentinel · GitHubA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件) - Release v1.8.3 · alibaba/Sentinelhttps://github.com/alibaba/Sentinel/releases/tag/1.8.3
解压到指定文件夹下
2、启动Sentinel控制台
(1)cmd启动jar包
java -jar sentinel-dashboard-1.8.3.jar
(2)编写启动Senrinel脚本,文件命名为start.bat
@echo off
title Sentinel Dashboard 1.8.3
java -server -Xms256m -Xmx512m -Dserver.port=8080 -jar sentinel-dashboard-1.8.3.jar
pause
3、登录控制台
地址:Sentinel Dashboardhttp://localhost:8080/#/login
账号/密码:sentinel/sentinel
三、Sentinel使用
1、引入依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
上一篇文章已经为项目引入了sentinel的依赖,以及介绍了feign的使用 感兴趣的可以跳转
SpringCloud Alibaba微服务--Open Feign的使用-CSDN博客https://blog.csdn.net/m0_74399067/article/details/150703402?spm=1001.2014.3001.5502
2、yml文件添加sentinel相关配置
server:port: 8021spring:application:name: jd-shop-usercloud:nacos:discovery:server-addr: 127.0.0.1:8848namespace: jdconfig:server-addr: 127.0.0.1:8848extension-configs:- data-id: ${spring.application.name}.yamlgroup: DEFAULT_GROUPrefresh: truefile-extension: ymlnamespace: jdgroup: DEFAULT_GROUPsentinel:transport:dashboard: localhost:8080 #配置Sentinel dashboard地址feign:sentinel:enabled: true
3、启动服务,Sentinel监控到jd-shop-user服务
访问地址:localhost:8021/user/getOrderNo?userId=T12345
在Sentinel控制台可以看到已经监控到了jd-shop-user服务
四、Sentinel控制规则
1、流控规则
(1)首先了解各个属性代表什么
配置项 | 可选值/说明 | 对应 FlowRule 属性 | 默认值 |
---|---|---|---|
资源名 | 输入框(需与 @SentinelResource 的 value 或接口路径一致) | resource | -(必填) |
针对来源 | default (所有来源)、具体服务名(如 serviceA )、other (非默认来源) | limitApp | default |
阈值类型 | - QPS:按每秒请求数限流- 并发线程数:按当前处理线程数限流 | grade | QPS |
单机阈值 | 输入框(限流阈值,如 QPS=10 表示每秒允许 10 次请求) | count | -(必填) |
是否集群 | 复选框(勾选后启用集群限流,阈值为集群整体阈值) | -(需配合集群组件) | 未勾选(单机) |
流控模式 | - 直接:对当前资源限流- 关联:关联资源触发限流(需填关联资源名)- 链路:指定链路入口限流(需填入口资源) | strategy | 直接 |
流控效果 | - 快速失败:直接拒绝超限请求- Warm Up:冷启动模式(需配预热时间)- 排队等待:匀速排队(需配等待时间) | controlBehavior | 快速失败 |
(2)新增流控规则-直连模式
资源名称填写接口路径
接下来访问地址localhost:8021/user/getOrderNo?userId=T12345
更具规则可以知道,单位时间内发送一次请求不会进行限流
单位时间内点击多次会进行限流,进行单位时间内重复刷新页面操作,可以发现被限流了
(3)新增流控规则-关联模式
关联: 当关联的资源达到阈值时,就限流自己,也就是说关联的资源(接口),QPS为1时,一秒内被多次请求的时候,自己的接口就会被限流。
我们在user服务中创建一个关联接口 /user/getOrderNo2
测试操作:单位时间内,访问地址http://localhost:8021/user/getOrderNo2一次,然后快速访http://localhost:8021/user/getOrderNo?userId=T12345,两次访问在单位时间内完成。
预期结果:当我们访问http://localhost:8021/user/getOrderNo?userId=T12345会发现已经被限流了
2、@SentinelResource注解使用
(1)属性介绍
-
属性 必填 作用 要求 value 是 指定资源名称 需唯一,用于规则匹配 entryType 否 标记流量方向:IN(入口)/OUT(出口) - blockHandler 否 处理BlockException的方法名 1. public方法
2. 返回类型与原方法一致
3. 参数匹配+BlockException参数
4. 默认同class,或通过blockHandlerClass指定
blockHandlerClass 否 存放blockHandler的类 1. 方法必须static
2. public修饰方法
3. 返回类型一致
4. 参数匹配+BlockException
fallback 否 异常降级处理方法 1. 返回类型一致
2. 参数匹配(可加Throwable)
3. 默认同class,或通过fallbackClass指定
fallbackClass 否 存放fallback的类 1. 方法必须static
2. 其他要求同fallback
defaultFallback 否 通用降级处理方法 1. 返回类型一致
2. 无参或Throwable参数
3. 优先级低于fallback
exceptionsToIgnore 否 排除的异常类型 这些异常不触发降级,直接抛出 exceptionsToTrace 否 需要追踪的异常 仅统计这些异常
(2)改写user服务getOrderNo接口,添加@SentinelResource注解
@GetMapping("getOrderNo")@SentinelResource(value = "getOrderNoResource",fallback = "getOrderNoResource", fallbackClass = UserSentinelResourceHandler.class)public String getOrderNo(@RequestParam(value = "userId" ,required = false) String userId, HttpServletRequest request){return userService.getOrderNo(userId, request);}
(3)创建UserSentinelResourceHandler,对限流进行友好处理
@Component
public class UserSentinelResourceHandler {public static String getOrderNoResource(String userId, HttpServletRequest request, BlockException e) {String error = "被限流了";return error;}}
(4)编辑之前创建的规则
资源名改为注解的value值
(4)单位时间内多次访问地址localhost:8021/user/getOrderNo?userId=T12345
3、熔断规则
(1)熔断策略介绍
策略名称 | 详情 |
---|---|
慢调用比例 (SLOW_REQUEST_RATIO) | 1. 设置允许的最大响应时间(RT),超过该时间的请求记为慢调用 2. 当统计时长内请求数>最小请求数且慢调用比例>阈值时触发熔断 3. 熔断时长后进入半开状态(HALF-OPEN) 4. 探测请求响应时间<RT则恢复,否则继续熔断 |
异常比例 (ERROR_RATIO) | 1. 当统计时长内请求数>最小请求数且异常比例>阈值时触发熔断 2. 异常比例阈值范围为[0.0,1.0] 3. 熔断时长后进入半开状态(HALF-OPEN) 4. 探测请求成功则恢复,否则继续熔断 |
异常数 (ERROR_COUNT) | 1. 当统计时长内异常数>阈值时触发熔断 2. 熔断时长后进入半开状态(HALF-OPEN) 3. 探测请求成功则恢复,否则继续熔断 |
(2)user服务新增接口 user/sentinelA
/*** 测试熔断规则 慢调用比例* @return*/@GetMapping("/sentinelA")@SentinelResource(value = "sentinelAResource" , fallback = "sentinelAResource", fallbackClass = UserSentinelResourceHandler.class)public String sentinelA(){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("我是sentinelA");return "我是sentinelA";}
(2)在UserSentinelResourceHandler添加对应的熔断处理
public static String sentinelAResource(Throwable throwable){System.out.println("触发熔断,服务不可用");return "触发熔断,服务不可用";}
(3)新增熔断规则
(2)访问地址 http://localhost:8021/user/sentinelA
统计时间内,访问一次可以看到返回内容
统计时间内,访问多次,当达到阈值,会进入熔断时间,熔断时间过后,进行探测恢复
其他熔断策略可以自己尝试测试,这里就先不介绍了
4、热点规则
(1)概念及属性
热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的数据,并对其访问进行限制,比如对某个商品id进行限制,或者对某个用户id进行限制
参数索引:方法中参数的索引第几个参数
单机阈值:每秒达到单机阈值的数量就会触发兜底方法
(2)user服务新增接口hotspot
/*** 测试centinel热点规则限流* @param userId* @param shopId* @return*/@GetMapping("/hotspot")@SentinelResource(value = "hotspotResource" , blockHandler = "hotspotResource", blockHandlerClass = UserSentinelResourceHandler.class)public String hotspot(@RequestParam(value = "userId" ,required = false) String userId,@RequestParam(value = "shopId" ,required = false) String shopId){System.out.println("我是hotspot");return "我是hotspot";}
(3)在UserSentinelResourceHandler添加热点规则对应的兜底方法
public static String hotspotResource(String userId, String shopId, BlockException blockException){System.out.println("您被认为恶意访问,触发热点限流");return "您被认为恶意访问,触发热点限流";}
(4)新增热点规则
(5)重启服务
访问地址http://localhost:8021/user/hotspot?shopId=4 ,不涉及到参数索引0,也就是userId参数,不会触发限流
窗口时长内,多次访问地址http://localhost:8021/user/hotspot?shopId=4&userId=1,涉及到参数索引0,也就是userId参数,会触发限流
系统规则会对服务所有接口进行限流,这里就不介绍了
五、总结
SpringCloud Alibaba--Sentinel的使用就介绍到这里了,如果你有更好的想法,可以积极评论。同时,创作不易,路过的家人们不要忘记点赞、收藏哟。
上一篇文章:
SpringCloud Alibaba微服务--Open Feign的使用-CSDN博客