微服务SpringCloudAlibaba组件sentinel教程【详解sentinel的使用以及流量控制、熔断降级、热点参数限流等,附有示例+代码】
文章目录
- 四.Sentinel限流熔断
- 4.1 sentinel介绍
- 4.2 Sentinel 的历史
- 4.3 Sentinel 基本概念
- 资源
- 规则
- 4.4 Sentinel 功能和设计理念
- 4.4.1 流量控制
- 4.4.2熔断降级
- 什么是熔断降级
- 熔断降级设计理念
- 系统负载保护
- 4.5 Sentinel 是如何工作的
- 4.6 Sentinel使用
- 4.7 Sentinel 控制台
- 4.8 SpringBoot 整合 sentinel-dashboard
- 基础搭建
- 流量控制
- 流控模式与流控效果
- 熔断降级
- 响应时间比例
- 异常比例
- 其他解释
- 热点参数限流
- @SentinelResource注解
- fallback属性
- blockHandler属性
- 4.9 基于nacos配置中心进行规则持久化
- 基本使用配置
- 流量控制参数:
- 熔断降级配置:
- 热点参数配置:
- 另:
四.Sentinel限流熔断
官网:https://sentinelguard.io/zh-cn/docs/introduction.html
github文档:https://github.com/alibaba/Sentinel/wiki
学习参考地址:
https://www.cnblogs.com/21CHS/p/18528825
https://developer.aliyun.com/article/1392703
4.1 sentinel介绍
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
在基于 SpringCloud 构建的微服务体系中,服务间的调用链路会随着系统的演进变得越来越长,这无疑会增加了整个系统的不可靠因素。在并发流量比较高的情况下,由于网络调用之间存在一定的超时时间,链路中的某个服务出现宕机都会大大增加整个调用链路的响应时间,而瞬间的流量洪峰则会导致这条链路上所有服务的可用线程资源被打满,从而造成整体服务的不可用,这也就是我们常说的 “雪崩效应”。而在微服务系统设计的过程中,为了应对这样的糟糕情况,最常用的手段就是进行 ”流量控制“ 以及对网络服务的调用实现“熔断降级”。因此,Sentinel 就因运而生了。
Sentinel 是一款面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来保障服务的稳定性,核心思想是:根据对应资源配置的规则来为资源执行相应的流控/降级/系统保护策略
4.2 Sentinel 的历史
- 2012 年,Sentinel 诞生,主要功能为入口流量控制。
- 2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。
- 2018 年,Sentinel 开源,并持续演进。
- 2019 年,Sentinel 朝着多语言扩展的方向不断探索,推出 C++ 原生版本,同时针对 Service Mesh 场景也推出了 Envoy 集群流量控制支持,以解决 Service Mesh 架构下多语言限流的问题。
- 2020 年,推出 Sentinel Go 版本,继续朝着云原生方向演进。
- 2021 年,Sentinel 正在朝着 2.0 云原生高可用决策中心组件进行演进;同时推出了 Sentinel Rust 原生版本。同时我们也在 Rust 社区进行了 Envoy WASM extension 及 eBPF extension 等场景探索。
- 2022 年,Sentinel 品牌升级为流量治理,领域涵盖流量路由/调度、流量染色、流控降级、过载保护/实例摘除等;同时社区将流量治理相关标准抽出到 OpenSergo 标准中,Sentinel 作为流量治理标准实现。
4.3 Sentinel 基本概念
资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
4.4 Sentinel 功能和设计理念
4.4.1 流量控制
流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状。
其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
流量控制有以下几个角度:
- 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
- 运行指标,例如 QPS、线程池、系统负载等;
- 控制的效果,例如直接限流、冷启动、排队等。
Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。
4.4.2熔断降级
什么是熔断降级
除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。这个问题和 Hystrix 里面描述的问题是一样的。
Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。
熔断降级设计理念
在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。
Hystrix 通过线程池的方式,来对依赖(在我们的概念中对应资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本,还需要预先给各个资源做线程池大小的分配。
Sentinel 对这个问题采取了两种手段:
- 通过并发线程数进行限制:
和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。
- 通过响应时间对资源进行降级:
除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。
系统负载保护
Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。
针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。
4.5 Sentinel 是如何工作的
Sentinel 的主要工作机制如下:
- 对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。
- 根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。
- Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。
4.6 Sentinel使用
Sentinel 的使用可以分为两个部分:
- 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。
4.7 Sentinel 控制台
下载jar sentinel-dashboard-1.8.0.jar
使用以下命令直接运行 jar 包(JDK 版本必须≥ 1.8):
cmd运行java -jar -Dserver.port=9999 sentinel-dashboard-1.8.0.jar
java -jar -Dserver.port=9999 sentinel-dashboard-1.8.0.jar
控制台访问地址:http://localhost:9999,默认账号密码都为 sentinel/sentinel
4.8 SpringBoot 整合 sentinel-dashboard
基础搭建
【1.引入依赖】
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.在bill-provider-consumer-7790项目的application.yml编写代码
server:port: 7790spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNullusername: rootpassword: sa123456application:name: bill-consumercloud:sentinel: # sentinel看板的地址transport:dashboard: 127.0.0.1:9999 #sentinel控制台地址 连接dashboardport: 8719 #TCP协议 与dashboard通信的端口enable: true #开启sentinel 默认trueearly: true #取消控制台懒加载 立即初始化dashboard与sentinelnacos:discovery:server-addr: 127.0.0.1:8848feign: #开启熔断处理circuitbreaker:enabled: true
(增加个方法,为了方便测试)
启动bill-consumer-7790
流量控制
一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:
- resource :资源名,即限流规则的作用对象 (访问路径,即controller中的访问路径)
- count : 限流阈值(最大接受数,超过阈值拒绝访问)
- grade : 限流阈值类型(QPS 或并发线程数)
- limitApp : 流控针对的调用来源,若为 default 则不区分调用来源(哪个服务调用资源名时进行限流,default不区分。)
- strategy : 调用关系限流策略
- controlBehavior : 流量控制效果(直接拒绝、Warm Up、匀速排队)
当每秒钟请求两次及以上会失败,如图:
注意:除了设置QPS外,也可以设置线程数。(可让业务代码进行休眠,或使用压力测试工具就
jmeter)
当设置线程数为1时,jmeter测试,5个线程同一时刻发送。
流控模式与流控效果
【关联:(反向关联)】
当/bill/getId的阈值超过到1时,/bill/show不可用,也就是给限流。(把/bill/show的资源节省出来给/bill/getId)
快速失败:抛异常
- 方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出 FlowException 。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时
WarmUp:慢慢增加到阈值
- 即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮
排队等待:匀速排队处理
-
这种方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法 。这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。注意:匀速排队模式暂时不支持 QPS > 1000 的场景。
熔断降级
现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。
熔断分为两种情况:
- 当目标接口的响应时间较差(慢调用的比例、数量超过阈值),
- 基于异常比例、异常数量
响应时间比例
当对指定的资源接口进行访问时,1秒(统计时长)内至少5个请求(最小请求数)。其中80%(比例阈值)的请求对应响应时间超过800ms(最大RT,response time),此时就开始熔断,熔断的时间1Os(熔断时长)。在被熔断的期间,是不允许访问目标接口,此时可以指定降级方案(兜底方法,返回固定的结果)。
当熔断时长到达后(时间到了),放行一个请求去访问目标接口,如果此时RT(响应)时间依然超过800s(最大RT),此时就继续熔断(10s);如果放行的一个请求,响应时间没有超过800s(最大RT),则熔断结束;接下来开始进行下一轮的统计。
注意:熔断规则和流量控制的链路模式不能一起使用
异常比例
1s之内,至少5个请求,其中80%的请求抛出异常,此时熔断就开启。熔断时长10s到达之后,此时熔断器变成”半开启"状态。放行一个请求,如果这个请求依然抛出异常,此时就继续熔断。否则熔断关闭。
其他解释
-
慢调用比例 ( SLOW_REQUEST_RATIO ):选择以慢调用比例作为阈值,需要设置允许的慢调用RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长( statIntervalMs )内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用RT 则会再次被熔断。
-
异常比例 ( ERROR_RATIO ):当单位统计时长( statIntervalMs )内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0] ,代表 0% - 100%。
-
异常数 ( ERROR_COUNT ):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
-
最大RT:默认毫秒,请求超出时长
-
熔断时长:降级多久后再次打开
-
比例阈值: 当每秒请求量>=N(可配置),并且每秒异常总数占通过量的比值超过阈值之后,进入降级状态。取值范围[0.0,1.0] 代表0%-100%(如:设置为0.2,如果请求异常数超过20%则进入降级)
-
最小请求数:请求数小于该值时即使异常比率超出阈值也不会熔断
热点参数限流
热点参数限流是分别统计参数值不相同的请求,判断是否超过QPS阈值,同一个资源接口,针对不同的参数指,执行不同的QPS阈值。
【例1】:userid=1为普通VIP用户,此时对该资源接口的调用每秒最多只允许调用5次。userid=3为超级VIP用户,每秒对该资源接口的访问可以访问8次。其他的普通用户,每秒只允许访问2次。
【例2:】访问资源参数索引(取第1个参数)为0,类型为int,值为1,达到阈值10时进行限流。
需要在bill-consumer-7790中设置@SentinelResource注解
- 单击阈值:单机阈值是指在单个机器上针对某个热点参数设置的阈值,用于控制该参数的访问量。当热点参数的访问量达到或超过设定的阈值时,流控机制将生效,拦截对该资源的访问。单机阈值在 Sentinel 中是用于指定在单个机器上某个热点参数的阈值,即当该参数的访问量达到或超过阈值时触发流控。
- 统计窗口时长:是 Sentinel 中热点规则的一个重要参数,它用于指定在多长时间内统计热点参数的访问量。窗口时长的选择直接影响热点规则的灵敏度和对流量变化的响应速度。
@SentinelResource注解
@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。 @SentinelResource注解包含以下属性:
-
value:资源名称,必需项(不能为空)
-
entryType:entry 类型,可选项(默认为 EntryType.OUT)
-
blockHandler / blockHandlerClass:blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockExceptionblockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 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属性
blockHandler 使用sentinel进行不同规则控制时的默认处理方案fallback:自定义业务出错时默认处理方案defaultFallback 指定一个业务错误时默认方案
blockHandler属性
/*** blockHandler 使用sentinel进行不同规则控制时的默认处理方案* fallback:自定义业务出错时默认处理方案* defaultFallback 指定一个业务错误时默认方案**/@GetMapping("/find")@SentinelResource(value = "find",blockHandler = "blockHandler")//,fallback = "findFallBack"public ResultAJAX find(Integer id){System.out.println("id==="+id);// ParamFlowException 热点参数异常// DegradeException 熔断降级异常// FlowException 流控异常return ResultAJAX.success();}public ResultAJAX blockHandler(Integer id, BlockException e){//异常类型判断if(e instanceof FlowException){return ResultAJAX.error("流量异常处理..."+id);}if(e instanceof ParamFlowException){return ResultAJAX.error("热点参数异常处理..."+id);}if(e instanceof DegradeException){return ResultAJAX.error("熔断降级异常处理..."+id);}return ResultAJAX.error("系统未知异常处理..."+id);}// public ResultAJAX findFallBack(Integer id){// return ResultAJAX.error("findFallBack=="+id);// }
热点规则:
降级规则:
4.9 基于nacos配置中心进行规则持久化
基本使用配置
【引入依赖】
<!--sentinel利用nacos做持久化--><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency>
【在配置中心创建文件:】
[{
"resource": "find",
"limitApp": "default",
"grade": 1,
"count": 2,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false}
]
resource:资源名称
limitApp:来源应用
grade:阈值类型,0表示线程数,1表示QPS
count:单机阈值
strategy:流控模式,0表示直接,1表示关联,2表示链路
controlBehavior:流控效果,0表示快速失败,1表示Warm Up,2表示排队等待
clusterMode:是否集群
【yml配置:】
server:port: 7790spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNullusername: rootpassword: sa123456application:name: bill-consumercloud:sentinel: # sentinel看板的地址transport:dashboard: 127.0.0.1:9999 #sentinel控制台地址 连接dashboardport: 8719 #TCP协议 与dashboard通信的端口enable: true #开启sentinel 默认trueearly: true #取消控制台懒加载 立即初始化dashboard与sentineldatasource:ds1:nacos:server-addr: 127.0.0.1:8848 #nacos地址data-id: ${spring.application.name}-flow #naocs中配置文件名称,对应服务名,可随意填写(和配置中文文件一致即可)group-id: DEFAULT_GROUP #nacos中配置文件分组,data-type: json #使用json格式rule-type: flow #使用flow限流nacos:discovery:server-addr: 127.0.0.1:8848feign: #开启熔断处理circuitbreaker:enabled: true
再次启动bill-consumer,进入sentinel中的流控规则,这里会根据nacos中的配置文件自动配置好,nacos中文件更新,sentiel这里也会更新。
流量控制参数:
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,资源名是限流规则的作用对象 | |
count | 限流阈值 | |
grade | 限流阈值类型,QPS 或线程数模式 | QPS 模式 |
limitApp | 流控针对的调用来源 | default ,代表不区分调用来源 |
strategy | 调用关系限流策略:直接、链路、关联 | 根据资源本身(直接) |
controlBehavior | 流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流 | 直接拒绝 |
同一个资源可以同时有多个限流规则。
熔断降级配置:
0慢调用比例 1异常比例 2异常数
熔断降级规则(DegradeRule)包含下面几个重要的属性:
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,即规则的作用对象 | |
grade | 熔断策略,支持慢调用比例/异常比例/异常数策略 | 慢调用比例 |
count | 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值 | |
timeWindow | 熔断时长,单位为 s | |
minRequestAmount | 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) | 5 |
statIntervalMs | 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) | 1000 ms |
slowRatioThreshold | 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) |
热点参数配置:
热点参数规则(ParamFlowRule
)类似于流量控制规则(FlowRule
):
属性 | 说明 | 默认值 |
---|---|---|
resource | 资源名,必填 | |
count | 限流阈值,必填 | |
grade | 限流模式 | QPS 模式 |
durationInSec | 统计窗口时间长度(单位为秒),1.6.0 版本开始支持 | 1s |
controlBehavior | 流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持 | 快速失败 |
maxQueueingTimeMs | 最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持 | 0ms |
paramIdx | 热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置 | |
paramFlowItemList | 参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型 | |
clusterMode | 是否是集群参数流控规则 | false |
clusterConfig | 集群流控相关配置 |
另:
nacos可以创建多个配置文件,flow流控, degrade 降级,param-flow热点
【yml配置】
server:port: 7790spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNullusername: rootpassword: sa123456application:name: bill-consumercloud:sentinel: # sentinel看板的地址transport:dashboard: 127.0.0.1:9999 #sentinel控制台地址 连接dashboardport: 8719 #TCP协议 与dashboard通信的端口enable: true #开启sentinel 默认trueearly: true #取消控制台懒加载 立即初始化dashboard与sentineldatasource:ds1:nacos:server-addr: 127.0.0.1:8848 #nacos地址data-id: ${spring.application.name}-flow #naocs中配置文件名称,对应服务名,可随意填写(和配置中文文件一致即可)group-id: DEFAULT_GROUP #nacos中配置文件分组,data-type: json #使用json格式rule-type: flow #使用flow限流ds2:nacos:server-addr: 127.0.0.1:8848 #nacos地址data-id: ${spring.application.name}-degrade #naocs中配置文件名称,对应服务名,可随意填写(和配置中文文件一致即可)group-id: DEFAULT_GROUP #nacos中配置文件分组,data-type: json #使用json格式rule-type: degrade #熔断降级规则nacos:discovery:server-addr: 127.0.0.1:8848feign: #开启熔断处理circuitbreaker:enabled: true
【bill-consumer-flow配置】
[{
"resource": "find",
"limitApp": "default",
"grade": 1,
"count": 2,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false}
]
【bill-consumer-degrade配置】
[
{
"resource": "find",
"grade": 0,
"count": 2,
"timeWindow": 1,
"minRequestAmount": 1,
"statIntervalMs": 5
}
]
上述 JSON 示例中的各项含义如下:
- resource :资源名称,对应到你在代码中要进行热点参数限流保护的业务逻辑方法或接口等的标识,可以自定义,但要和代码中的设置一致。
- paramIdx :热点参数的索引位置,从 0 开始计数,表示要基于哪个参数进行热点参数限流判断。比如你的业务方法有多个参数,这里指定要关注哪个参数的热点情况。
- count :限流阈值,即单位时间内允许通过的请求次数。
- burst :突发量,允许在短时间内超过限流阈值的额外请求数量。
- duration :统计的时间窗口单位,这里设置为 1 表示以秒为单位(也可以根据需要设置为其他时间单位,如分钟等,对应的参数值不同)。
- controlBehavior :流控效果,0 表示快速失败(达到限流阈值直接拒绝后续请求),还有其他可选值对应不同的流控策略(比如匀速排队等)。
- maxQueueingTimeMs :最大排队等待时间(毫秒),当使用匀速排队等流控策略时生效,指定请求在排队等待通过限流时的最大等待时长。
相关文章:

微服务SpringCloudAlibaba组件sentinel教程【详解sentinel的使用以及流量控制、熔断降级、热点参数限流等,附有示例+代码】
文章目录 四.Sentinel限流熔断4.1 sentinel介绍4.2 Sentinel 的历史4.3 Sentinel 基本概念资源规则 4.4 Sentinel 功能和设计理念4.4.1 流量控制4.4.2熔断降级什么是熔断降级熔断降级设计理念系统负载保护 4.5 Sentinel 是如何工作的4.6 Sentinel使用4.7 Sentinel 控制台4.8 Sp…...

ScoreFlow:通过基于分数的偏好优化掌握 LLM 智体工作流程
25年2月来自 U of Chicago、Princeton U 和 U of Oxford 的论文“ScoreFlow: Mastering LLM Agent Workflows via Score-based Preference Optimization”。 最近的研究利用大语言模型多智体系统来解决复杂问题,同时试图减少构建它们所需的手动工作量,从…...

数字水印嵌入及提取系统——基于小波变换GUI
数字水印嵌入及提取系统——基于小波变换GUI 基于小波变换的数字水印系统(Matlab代码GUI操作) 【有简洁程序报告】【可作開题完整文档达辩PPT】 本系统主要的内容包括: (1)使用小波变换技术实现二值水印图像的加密、…...

基于海思soc的智能产品开发(图像处理的几种需求)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于一个嵌入式设备来说,如果上面有一个camera,那么就可以有很多的用途。简单的用途就是拍照,比拍照更多一点的…...
【R语言】聚类分析
聚类分析是一种常用的无监督学习方法,是将所观测的事物或者指标进行分类的一种统计分析方法,其目的是通过辨认在某些特征上相似的事物,并将它们分成各种类别。R语言提供了多种聚类分析的方法和包。 方法优点缺点适用场景K-means计算效率高需…...

Spring 项目接入 DeepSeek,分享两种超简单的方式!
⭐自荐一个非常不错的开源 Java 面试指南:JavaGuide (Github 收获148k Star)。这是我在大三开始准备秋招面试的时候创建的,目前已经持续维护 6 年多了,累计提交了 5600 commit ,共有 550 多位贡献者共同参与…...

docker 进阶命令(基于Ubuntu)
数据卷 Volume: 目录映射, 目录挂载 匿名绑定: 匿名绑定的 volume 在容器删除的时候, 数据卷也会被删除, 匿名绑定是不能做到持久化的, 地址一般是 /var/lib/docker/volumes/xxxxx/_data 绑定卷时修改宿主机的目录或文件, 容器内的数据也会同步修改, 反之亦然 # 查看所有 vo…...
机器学习数学基础:29.t检验
t检验学习笔记 一、t检验的定义和用途 t检验是统计学中常用的假设检验方法,主要用于判断样本均值与总体均值间,或两个样本均值间是否存在显著差异。 在实际中应用广泛,例如在医学领域可用于比较两种药物的疗效;在教育领域&…...

HarmonyNext上传用户相册图片到服务器
图片选择就不用说了,直接用 无须申请权限 。 上传图片,步骤和android对比稍微有点复杂,可能是为了安全性考虑,需要将图片先拷贝到缓存目录下面,然后再上传,当然你也可以转成Base64,然后和服务…...

WebAssembly 3.0发布:浏览器端高性能计算迎来新突破!
“WebAssembly 3.0来了,浏览器端的高性能计算将彻底改变!”2025年,WebAssembly(Wasm)迎来了重大更新——WebAssembly 3.0正式发布。这次更新不仅支持多线程和SIMD指令集,还优化了内存管理,让浏览…...

计算机组成原理—— 外围设备(十三)
记住,伟大的成就往往诞生于无数次尝试和失败之后。每一次跌倒,都是为了让你学会如何更加坚定地站立;每一次迷茫,都是为了让你找到内心真正的方向。即使前路漫漫,即使困难重重,心中的火焰也不应熄灭。它代表…...
面试题之Vuex,sessionStorage,localStorage的区别
Vuex、localStorage 和 sessionStorage 都是用于存储数据的技术,但它们在存储范围、存储方式、应用场景等方面存在显著区别。以下是它们的详细对比: 1. 存储范围 Vuex: 是 Vue.js 的状态管理库,用于存储全局状态。 数据存储在内…...
window中git bash使用conda命令
window系统的终端cmd和linux不一样,运行不了.sh文件,为了在window中模仿linux,可以使用gui bash模拟linux的终端。为了在gui bash中使用python环境,由于python环境是在anaconda中创建的,所以需要在gui bash使用conda命…...

象棋掉落动画(局部旋转动画技巧)
1.被撞击阶段:根据被撞击速度,合理设置被撞距离 2.倒地阶段:象棋倒地的同时稍微前移 3.滚地阶段:象棋滚地后停止,在最后5帧内稍微回转一下。这里启用“PRS参数”的旋转来制作局部旋转动画...

Pycharm 2024在解释器提供的python控制台中运行py文件
2024版的界面发生了变化, run with python console搬到了这里:...

课题推荐:高空长航无人机多源信息高精度融合导航技术研究
高空长航无人机多源信息高精度融合导航技术的研究,具有重要的理论意义与应用价值。通过深入研究多源信息融合技术,可以有效提升无人机在高空复杂环境下的导航能力,为无人机的广泛应用提供强有力的技术支持。希望该课题能够得到重视和支持&…...
《DeepSeek训练算法:开启高效学习的新大门》
在人工智能的浪潮中,大语言模型的发展日新月异。DeepSeek作为其中的佼佼者,凭借其独特的训练算法和高效的学习能力,吸引了众多目光。今天,就让我们深入探究DeepSeek训练算法的独特之处,以及它是如何保证模型实现高效学…...
promise用法总结以及手写promise
JavaScript中的 Promise 是用于处理异步操作的对象,它代表了一个异步操作的最终完成(或失败)及其结果值。Promise 是异步编程的一种更简洁和更可读的方式,避免了回调地狱的问题。 Promise 的基本概念 一个 Promise 是一个表示异步…...

春招项目=图床+ k8s 控制台(唬人专用)
1. 春招伊始 马上要春招了,一个大气的项目(冲击波项目)直观重要,虽然大家都说基础很重要,但是一个足够新颖的项目完全可以把你的简历添加一个足够闪亮的点。 这就不得不推荐下我的 k8s 图床了,去年折腾快…...
Android 11.0 系统settings添加ab分区ota升级功能实现二
1.概述 在11.0的系统rom定制化开发中,在进行系统ota升级的功能中,在10.0以前都是使用系统 RecoverySystem的接口实现升级的,现在可以实现AB分区模式来进行ota升级的,但是 必须需要系统支持ab分区升级的模式才可以的,接下来分析下看怎么样进行ota升级功能实现 2.系统sett…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...