当前位置: 首页 > 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.dtcms.com/a/358275.html

相关文章:

  • docker 部署Skywalking
  • 基于大模型与 PubMed 检索的光谱数据分析系统
  • 大语言模型的“可解释性”探究——李宏毅大模型2025第三讲笔记
  • Java类加载与JVM详解:从基础到双亲委托机制
  • idea 普通项目转换成spring boot项目
  • Python实现半角数字转全角数字的完整教程
  • 《中国棒垒球》垒球世界纪录多少米·垒球8号位
  • Visual Studio(vs)免费版下载安装C/C++运行环境配置
  • LeetCode 287.寻找重复数
  • Java试题-选择题(23)
  • 【LeetCode 热题 100】62. 不同路径——(解法四)组合数学
  • 聊一聊 .NET 的 AssemblyLoadContext 可插拔程序集
  • rhel-server-7.9-x86_64-dvd.iso
  • 机器学习中KNN算法介绍
  • 笔记共享平台|基于Java+vue的读书笔记共享平台系统(源码+数据库+文档)
  • 数据库原理及应用_数据库基础_第3章数据库编程_常用系统函数
  • 骑行商城怎么开发
  • 【金仓数据库产品体验官】KingbaseES-ORACLE兼容版快速体验
  • 国家统计局数据分析01——机器学习
  • GD32VW553-IOT 基于 vscode 的 bootloader 移植(基于Cmake)
  • 【DreamCamera2】相机应用修改成横屏后常见问题解决方案
  • 阿里云营业执照OCR接口的PHP实现与技术解析:从签名机制到企业级应用
  • LZ4 解压工具(WPF / .NET 8)说明书
  • Java Stream API并行流性能优化实践指南
  • 基于Kubernetes自定义调度器的资源隔离与性能优化实践指南
  • 从 0 到 1 构建零丢失 RabbitMQ 数据同步堡垒:第三方接口数据零丢失的终极方案
  • 人工智能学习:Python相关面试题
  • 人工智能学习:Linux相关面试题
  • 98、23种设计模式之代理模式(7/23)
  • spark.sparkContext.broadcast() 与 org.apache.spark.sql.functions.broadcast 的区别