微服务组件详解——sentinel

ops/2025/3/5 9:33:29/

1.启动sentinel:

下载jar sentinel-dashboard-1.8.0.jar

使用以下命令直接运行 jar 包(JDK 版本必须≥ 1.8):

java -Dserver.port=9999 -jar D:\sentinel-dashboard-1.8.0.jar

控制台访问地址:http://localhost:9999,默认账号密码都为 sentinel/sentinel

1.导入依赖:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.在alibaba-user-consumer-8090项目的application.yml编写代码
spring:cloud:sentinel:transport:port: 8719 #sentinel控制台端口dashboard: 127.0.0.1:9999 #sentinel控制台地址enable: true #开启sentinel 默认trueeager: true #取消控制台懒加载 立即初始化
3.监控

这个是实时刷新的,所以点击网址之后等几秒就行

2.流量控制

普通流控:

资源名:请求路径

阈值类型: QPS: 即每秒查询率, 线程数:用

因为是用手测试,所以选QPS

效果:会显示429代表 “Too Many Requests”,即 “请求过多”

关联:(反向关联):

点击高级选项

当sout的阈值超过到1时,demo不可用。(吧demo的资源节省出来给sout)

流控效果:

快速失败:抛异常

方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方

式为抛出 FlowException 。

WarmUp:慢慢增加到阈值

WarmUp 旨在避免因为流量突增或系统负载过高导致的拒绝服务问题。通过“热身”过程,系统逐步适应流量的增加,避免瞬间流量过载。

通过动态控制请求的通过率(例如,限制请求的通过比例),逐渐放开流量限制,避免系统立即面对过多请求的压力。

例如,可以设定初始通过率为 20%,然后逐步提升到 100%,这样系统就能平稳适应流量增长。

排队等待:匀速排队处理

排队等待 是 Sentinel 提供的另一种流量控制策略,用于限制并发请求的数量,并确保在系统负载较高时不会直接拒绝请求,而是让请求在队列中等待,直到系统能够处理它们。

注意:匀速排队模式暂时不支持 QPS > 1000 的场景

3.熔断降级:

这里还没写熔断降级的方法,

选项解析:

最大RT:默认毫秒,请求超出时长

比例阈值:: 当每秒请求量>=N(可配置),并且每秒异常总数占通过量的比值超过阈值之后,进入降级状

态。取值范围[0.0,1.0] 代表0%-100%(如:设置为0.2,如果请求异常数超过20%则进入降级)

最小请求数:请求数小于该值时即使异常比率超出阈值也不会熔断

熔断策略:
1.慢调用比例:

当单位统计时长

( statIntervalMs )内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接

下来的熔断时长内请求会自动被熔断降级。

2.异常比例:

请求异常数超过0.2(20%)就降级

3.异常数:

当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断

时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错

误)则结束熔断,否则会再次被熔断。

4.热点参数限流:

热点参数限流例子:比如说id为3的商品特别火爆,需要进行限流,但是其他id的商品一般不需要限流

资源名:需要在consumer中的方法上设置@SentinelResource注解

参数索引:就是第几个参数,从0开始

单机阈值:就是正常情况下允许的点击量

限流阈值:就是限流情况下允许的点击量

5.@SentinelResource

@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。 @SentinelResource

注解包含以下属性:

value:资源名称,必需项(不能为空)

entryTypeentry 类型,可选项(默认为 EntryType.OUT)

blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称,可

选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要

和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需

要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的

类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

fallback:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback

函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。

fallback 函数签名和位置要求:

返回值类型必须与原函数返回值类型一致;

方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异

常。

fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定

fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback

逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所以类型的异常(除了

exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和

defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:

返回值类型必须与原函数返回值类型一致;

方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。

defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定

fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会

进入 fallback 逻辑中,而是会原样抛出

fallback属性:

因为使用热点参数限流以后如果超了阈值就会报500,ParamFlowException异常,所以我们要处理这个异常

注意:
  1. fallback 方法可以在同一个类中定义,也可以在其他类中定义。如果在其他类中定义,则需要通过 fallbackClass 属性指定该类
  2. 返回类型:fallback 方法的返回类型必须与被保护的方法相同
  3. fallback 方法应该为 public,以便 Sentinel 框架能够调用它
  4. 参数列表:fallback 方法可以有以下几种参数组合:不带参数。只有一个 Throwable 类型的参数,用于接收捕获到的异常。包含原始方法的所有参数和一个 Throwable 类型的参数。
    @SentinelResource(value = "demo",fallback = "fallback")@GetMapping("/demo")public ResultAJAX demo(Integer id) {System.out.println("这是方法demo——————————————————————————————"+id);return ResultAJAX.success();}public ResultAJAX fallback(Integer id) {return ResultAJAX.error("这是方法fallback,用来解决ParamFlowException异常");}

这样就不会直接报500,而是报我们自定义设置的message

blockHandler属性:

blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要 和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的 类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

ParamFlowException 热点参数异常

DegradeException熔断降级异常

FlowException流控异常处理

    @SentinelResource(value = "demo",blockHandler = "blockHandler")//@GetMapping("/demo")public ResultAJAX demo(Integer id) {System.out.println("这是方法demo——————————————————————————————"+id);return ResultAJAX.success();}public ResultAJAX blockHandler(Integer id, BlockException e) {//异常类型判断//流控异常if (e instanceof FlowException) {return ResultAJAX.error("ParamFlowException异常流控异常处理");}//熔断降级异常处理if (e instanceof DegradeException) {return ResultAJAX.error("熔断降级处理");}//热点参数异常if (e instanceof ParamFlowException) {return ResultAJAX.error("ParamFlowException异常流控异常处理");}return ResultAJAX.error("系统异常"+id);}

6.基于nacos配置中心进行规则持久化:

sentinel利用nacos做持久化,然后nacos再做持久化

<!--sentinel利用nacos做持久化-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

流量控制配置:

spring:cloud:sentinel:datasource:ds1:nacos:server-addr: 127.0.0.1:8848 #nacos地址data-id: ${spring.application.name}-flow#naocs中配置文件名称,对应服务名,可随意填写(和配置中文文件一致即可)group-id: DEFAULT_GROUP #文件分组data-type: json #使用json格式rule-type: flow #使用flow限流

在配置中心配置:

流量控制,热点参数,熔断降级配置:

resource:资源名称

limitApp:来源应用

grade:阈值类型,0表示线程数,1表示QPS

count:单机阈值

strategy:流控模式,0表示直接,1表示关联,2表示链路

controlBehavior:流控效果,0表示快速失败,1表示Warm Up,2表示排队等待

clusterMode:是否集群

nacos-consume-flow配置:限流配置
[
{
"resource": "demo",
"limitApp": "default",
"grade": 1,
"count": 2,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]

bill-consumer-degrade配置:熔断降级
[
{
"resource": "abc",
"grade": 0,
"count": 2,
"timeWindow": 1,
"minRequestAmount": 1,
"statIntervalMs": 5
}
]

bill-consumer-7790-param-flow 配置:热点参数限流配置
[
{
"resource": "abc",
"paramIdx": 0,
"count": 10,
"burst": 5,
"duration": 1,
"controlBehavior": 0,
"maxQueueingTimeMs": 500
}
]

yml配置:

spring:application:name: nacos-consumecloud:sentinel:transport:port: 8719 #sentinel控制台端口dashboard: 127.0.0.1:9999 #sentinel控制台地址enable: true #开启sentinel 默认trueeager: true #取消控制台懒加载 立即初始化datasource:ds1: #限流配置nacos:server-addr: 127.0.0.1:8848 #nacos地址data-id: "${spring.application.name}-flow" #naocs中配置文件名称,对应服务名,可随意填写(和配置中文文件一致即可)group-id: DEFAULT_GROUP #文件分组data-type: json #使用json格式rule-type: flow #使用flow限流ds2: #熔断降级配置nacos:server-addr: 127.0.0.1:8848data-id: "${spring.application.name}-degrade"group-id: DEFAULT_GROUPdata-type: jsonrule-type: degrade #指定为熔断降级规则ds3: #热点参数限流配置nacos:server-addr: 127.0.0.1:8848data-id: "${spring.application.name}-param-flow"group-id: DEFAULT_GROUPdata-type: jsonrule-type: param-flow

能够在sentinel里面看到持久化的


http://www.ppmy.cn/ops/163269.html

相关文章

自然语言处理:逻辑斯谛回归

介绍 大家好&#xff0c;博主又来给大家分享知识了。上回给大家详细讲解了朴素贝叶斯算法&#xff0c;不知道大家在学习和理解的过程中收获如何呢&#xff1f;相信经过那次分享&#xff0c;大家对朴素贝叶斯算法已经有了比较清晰的认识&#xff0c;说不定在实际应用中也开始尝…

doris: Hive

自 2.1.3 版本开始&#xff0c;Apache Doris 支持对 Hive 的 DDL 和 DML 操作。用户可以直接通过 Apache Doris 在 Hive 中创建库表&#xff0c;并将数据写入到 Hive 表中。通过该功能&#xff0c;用户可以通过 Apache Doris 对 Hive 进行完整的数据查询和写入操作&#xff0c;…

基于Python的非接触式人体测量数据可用性验证分析

标题:基于Python的非接触式人体测量数据可用性验证分析 内容:1.摘要 摘要&#xff1a;在现代人体测量领域&#xff0c;非接触式测量技术凭借其高效、便捷等优势逐渐兴起&#xff0c;Python 作为一种功能强大的编程语言&#xff0c;在处理非接触式人体测量数据方面具有显著优势…

Java 大视界 -- 基于 Java 的大数据流处理容错机制与恢复策略(113)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

C# 基础知识总结(持续更新中...)

C#有哪些数据类型&#xff1f; 值类型 引用类型 整数类型 实数类型 布尔类型 字符类型 结构类型 枚举类型 类 数组 字符串 接口 委托 对象型 C#有哪几种访问修饰符&#xff0c;有何区别&#xff1f; public 公共成员 访问不受限制 private 私有成员 只限于当前类成员…

es检索elasticsearch检索curl实现

在 Elasticsearch(ES)集群中进行搜索时,你可以使用不同的搜索方式,下面为你介绍几种常见搜索场景下的请求体(body)数据示例。假设你使用的是 Elasticsearch 的 RESTful API,并且通过 HTTP 请求来执行搜索操作。 1. 简单的全文搜索 如果你想在指定的字段中进行全文搜索…

养老小程序方案详解居家养老小程序系统

养老小程序&#xff0c;上门居家养老小程序&#xff0c;用户端护工端小程序&#xff0c;管理后台。php开发语言&#xff0c;可源码搭建&#xff0c;二次开发或者定制开发。 一 用户端&#xff1a;小程序 核心功能模块&#xff1a;用户完善个人健康档案&#xff0c;在线选择服…

贪心算法+题目

贪心算法 跳跃游戏跳跃游戏2 跳跃游戏 题目 拿到题目就暴力穷举&#xff0c;我用的是dfs&#xff0c;加上备忘录之后还是超出时间限制。就考虑一下贪心算法。你想 我在[0,n-2]位置遍历求出可以跳跃的最远距离&#xff0c;用farthest更新最大值&#xff0c;如果>终点就返回t…