当前位置: 首页 > news >正文

SpringCloud Alibaba微服务--Sentinel的使用

一、Sentinel概念及优势

1、Sentinel简介

Sentinel 是阿里巴巴开源的 流量控制、熔断降级、系统保护 的轻量级框架,主要用于 微服务架构 下的高可用防护。 与 Hystrix 类似,但 Sentinel 提供了更丰富的流量控制策略和实时监控能力,适用于 Spring Cloud Alibaba 生态。

2、Sentinel核心功能

功能说明
流量控制控制 QPS、线程数等,防止系统被突发流量击垮
熔断降级当服务不稳定时自动熔断,避免级联故障
系统自适应保护根据系统负载动态调整流量
实时监控提供 Dashboard 可视化监控
热点参数限流对特定参数(如用户ID)进行精细限流
集群流控支持分布式集群限流

3、Sentinel优势

  • 轻量级,高性能
  • 丰富的流量控制策略
  • 实时监控和动态规则调整

4、Sentinel VS Hystrix

对比项SentinelHystrix
流量控制✅ 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(非默认来源)limitAppdefault
阈值类型QPS:按每秒请求数限流- 并发线程数:按当前处理线程数限流gradeQPS
单机阈值输入框(限流阈值,如 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博客

http://www.xdnf.cn/news/1403803.html

相关文章:

  • 【计算机视觉】Pixel逐像素分类Mask掩码分类理解摘要
  • 2025年- H102-Lc210--3658.奇数和与偶数和的最大公约数(gcd最大公约数)--Java版
  • 【Linux基础】深入理解Linux环境下的BIOS机制
  • PostgreSQL:突破关系型数据库的边界
  • AI公司是怎样对权重和损失函数做处理的?
  • nacos3端口漂移问题
  • mysql的内置函数
  • 论《运动战》
  • 个性化导航新体验:cpolar让Dashy支持语音控制
  • Tomcat 企业级运维实战系列(四):Tomcat 企业级监控
  • 数值分析——数据误差对函数值的影响
  • nacos 2.5.1 心跳源码解析
  • 基于单片机商用电子计价秤电子秤系统Proteus仿真(含全部资料)
  • 图解LLM(AI大模型)的工作原理
  • Redis 测试:过期 key 内存释放情况
  • 深入理解shared_ptr与循环引用问题
  • node.js ---文件读写(FS模块)
  • 用【Coze】实现文案提取+创作
  • 蓓韵安禧活性叶酸独立包装日期标注
  • 加密软件哪个好用?加密软件-为数据共享提供安全保障
  • 【基础-单选】例如现在要实现一个广告弹窗,包含图片和文本等信息,使用下面那种弹窗可以实现
  • ROS 2 机器人开发$2
  • 项目管理方法论有哪些流派
  • basic_ostream
  • Linux网络基础1(三)之网络与协议栈and网络传输基本流程
  • Yolov8损失函数:回顾Yolov8-Loss
  • 6.1 Update不能写复杂的逻辑
  • HarmonyOS Router 基本使用详解:从代码示例到实战要点
  • 【随笔】【Debian】【ArchLinux】基于Debian和ArchLinux的ISO镜像和虚拟机VM的系统镜像获取安装
  • 4-ATSAM3X8E-FLASH写入