网页右边,向下滑有目录索引,可以根据标题跳转到你想看的内容 如果右边没有就找找左边
分布式防御系统。以流量为切入点,通过动态设置的流量控制、服务熔断等手段达到保护系统的目的,通过服务降级增强服务被拒后用户的体验 阿里巴巴的开源项目,提供了系统负载保护等多个维度来保障服务之间的稳定性。
2012年,Sentinel诞生,主要功能为入口流量控制 2013~2017年,Sentinel在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel也因此积累了大量的流量归整场景以及生产实践。 2018年,Sentinel开源,并持续演进 2019年,Sentinel朝着多语言扩展的方向不断探索,推出C++原生版本,同时针对Service Mesh场景也推出了Envoy集群流量控制支持,以解决Service Mesh架构下多语言限流的问题。 2020年,推出Sentinel Go版本,继续朝着云原生方向演进。
丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等 完备的实时监控:Sentinel同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。 广泛的开源生态:Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与Spring Cloud、Dubbo、GRPC的整合。您只需要引入相应的依赖并进行简单配置即可快速地接入Sentinel。 完善的SPI扩展点:Sentinel提供简单易用、完善的SPI扩展接口。您可以通过实现扩展接口来快速的定制逻辑。例如定制规则管理、适配动态数据源等。
核心库(java 客户端)不依赖任何框架和第三方库,能够运行于所有java运行时环境,同时对Dubbo/Spring Cloud等框架也有较好的支持 控制台(Dashboard)基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器
资源:是关键概念,可以是java应用程序中的任何内容,例如,有应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。后面我们用资源来描述代码块,只要通过Sentinel API定义的代码,就是资源,能够被Sentinel保护起来,大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源 规则:围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
流量控制:在网络传输中的一个常用概念,用于调整网络包的发送数据,然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel作为一个调配器,可以根据需要把随机的请求调整成合适的形状
设计理念(让您自由选择控制角度,并灵活组合,从而达到想要的效果),有以下几个角度
资源的调用关系,例如资源的调用链路,资源和资源之间的关系 运行指标,例如QPS、线程池、系统负载等 控制的效果,例如直接限流、冷启动、排队等。
熔断降级:除了流量控制外,及时对调用链路中的不稳定因素进行熔断也是Sentinel的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,可能会导致请求发生堆积,进而导致级联错误。
当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障(和Hystrix原则一致) 限制手段上,和Hystrix采取完全不一样的方法
Hystrix通过线程池隔离的方式,来对依赖(Sentinel中的资源)进行隔离,好处是资源和资源之间做到最彻底的隔离,缺点是增加了线程切换的成本(过多的线程池导致线程数目过多),还需要预先给各资源做线程池大小的分配。
Sentinel对这个问题采取了两种手段
通过并发线程数进行限制:和资源池隔离不同,Sentinel通过限制并发线程数量,减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池大小。那么当某资源不稳定,线程数逐步堆积到一定数量后,新的请求就会被拒,堆积线程完成任务后,才开始继续接收请求 通过响应时间对资源进行降级:通过响应时间来快速降级不稳定资源。当依赖的资源出现响应时间过长后,所有对改资源的访问都会被直接拒绝,直到过了指定的时间窗口后才重新恢复。
系统自适应保护:Sentinel同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高时,如果还持续让请求进入,可能会导致系统崩溃,无法响应。集群环境下,网络负载均衡会把本应当前机器承载的流量转发到其它机器上,如果这个时候其它机器也处于濒临崩溃的状态,此时Sentinel的对应保护机制将会发挥作用。让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之外处理最多的请求
对主流框架提供适配或者显示API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析 根据预设的规则,结合对资源的实时统计信息,对流量进行控制,同时,Sentinel提供开放的接口,方便您定义及改变规则 Sentinel提供实时的监控系统,方便快速了解目前系统的状态
一、快速入门案例
1. 创建父工程,引入依赖(设置父工程< packaging >pom</ packaging>)
< properties>
< project. build. sourceEncoding> UTF- 8 < / project. build. sourceEncoding>
< maven. compiler. source> 8 < / maven. compiler. source>
< maven. compiler. target> 8 < / maven. compiler. target>
< spring- cloud. version> Hoxton . SR8< / spring- cloud. version>
< springboot. version> 2.3 .2 . RELEASE< / springboot. version>
< springcloudalibaba. version> 2.2 .4 . RELEASE< / springcloudalibaba. version>
< / properties>
< dependencyManagement>
< dependencies>
< dependency>
< groupId> org. springframework. cloud< / groupId>
< artifactId> spring- cloud- dependencies< / artifactId>
< version> ${ spring- cloud. version} < / version>
< type> pom< / type>
< scope> import < / scope>
< / dependency>
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- dependencies< / artifactId>
< version> ${ springboot. version} < / version>
< type> pom< / type>
< scope> import < / scope>
< / dependency>
< dependency>
< groupId> com. alibaba. cloud< / groupId>
< artifactId> spring- cloud- alibaba- dependencies< / artifactId>
< version> ${ springcloudalibaba. version} < / version>
< type> pom< / type>
< scope> import < / scope>
< / dependency>
< / dependencies>
< / dependencyManagement>
< build>
< plugins>
< plugin>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- maven- plugin< / artifactId>
< / plugin>
< / plugins>
< / build>
2. 创建子模块sentinel-test 引入依赖,做相关配置
引入依赖
< dependencies>
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- web< / artifactId>
< / dependency>
< dependency>
< groupId> com. alibaba. csp< / groupId>
< artifactId> sentinel- core< / artifactId>
< / dependency>
< / dependencies>
配置文件
server :
port : 80
servlet :
context-path : "/"
启动类
import com. alibaba. csp. sentinel. Entry ;
import com. alibaba. csp. sentinel. SphU ;
import com. alibaba. csp. sentinel. slots. block. RuleConstant ;
import com. alibaba. csp. sentinel. slots. block. flow. FlowRule ;
import com. alibaba. csp. sentinel. slots. block. flow. FlowRuleManager ;
import org. springframework. web. bind. annotation. RequestMapping ;
import org. springframework. web. bind. annotation. RestController ;
import javax. annotation. PostConstruct ;
import java. util. ArrayList ;
@RestController
public class SentinelController {
@PostConstruct
public void initFlowRules ( ) {
ArrayList < FlowRule > flowRules = new ArrayList < > ( ) ;
FlowRule flowRule = new FlowRule ( ) ;
flowRule. setResource ( "HelloWorld" ) ;
flowRule. setGrade ( RuleConstant . FLOW_GRADE_QPS) ;
flowRule. setCount ( 2 ) ;
flowRules. add ( flowRule) ;
FlowRuleManager . loadRules ( flowRules) ;
}
@RequestMapping ( "helloWorld" )
public String helloWorld ( ) {
try ( Entry entry = SphU . entry ( "HelloWorld" ) ) {
return "Sentinel " + System . currentTimeMillis ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
return "系统繁忙,请稍后!" ;
}
}
}
二、Sentinel dashboard控制台
流量控制、熔断降级规则统一配置和管理入口,它为用户提供了机器自发现、簇点链路自发现、监控、规则配置等功能。在Sentinel控制台上,我们可以配置规则并实时查看流量控制效果。
1. 控制台
通过cmd运行jar包启动,然后访问web页面,用户名密码都是sentinel
java - Dserver . port= 8080 - Dcsp . sentinel. dashboard. server= localhost: 8080 - Dproject . name= sentinel- dashboard - jar sentinel- dashboard. jar
2. java接入控制台
< dependency>
< groupId> com. alibaba. csp< / groupId>
< artifactId> sentinel- transport- simple- http< / artifactId>
< version> 1.8 .0 < / version>
< / dependency>
- Dcsp . sentinel. dashboard. server= localhost: 8080 - Dproject . name= sentinel- helloWorld
3. 设置限流规则
之前我们设置规则,是通过代码设置,不方便修改和维护,推荐使用Sentinel控制台设置规则
4. 定义资源(推荐使用注解方式,掌握抛异常,布尔值,其它了解一下即可)
资源可以是任何东西,服务、服务里面的方法,甚至一段代码,使用Sentinel来进行资源保护,主要步骤如下:
定义资源 定义规则 检验规则是否生效
先把可能需要保护的资源定义好(埋点),之后再配置规则,也可以理解为,只要有了资源,我们就可以在随时灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。对于主流框架,我们提供适配,只需要按照适配中的说明配置,Sentinel就会默认定义提供的服务,方法等资源。
为了减少开发复杂度,大部分主流框架(Web Servlet,Dubbo,Spring Cloud,gRPC、Spring WebFlux、Reactor等)都做了适配,只需要引入对应的依赖即可方便的整合Sentinel。
方法二:抛异常的方式定义资源(就是入门案例中使用的)
SphU包含了try-catch风格的API。这种方式,当资源发生了限流之后会抛出BlockException。这时可以捕捉遗产,进行限流之后的逻辑处理,具体参考快速入门案例中的controller 通过SphU.entry(“资源名”)方法,定义资源。若entry的时候传入热点参数,那么exit的时候也移动要带上对应参数(exit(count,args)),否则会统计错误。 可通过Tracer.trace(ex) 来统计异常信息
SphO提供if-else风格API,用这种方法,当资源发送限流后,返回false,这时根据返回值,进行限流后逻辑处理 小例子
@RequestMapping ( "helloWorld2" )
public String helloWorld2 ( ) {
if ( SphO . entry ( "HelloWorld" ) ) {
try {
return "boolean " + System . currentTimeMillis ( ) ;
} finally {
SphO . exit ( ) ;
}
} else {
return "系统繁忙,请稍后!" ;
}
}
通过@SentinelResource注解定义资源并配置blockHandler和fallback函数来进行限流之后的处理 需要额外依赖,提供注解以及AspectJ的扩展用于自动定义资源,处理BlockException等
< dependency>
< groupId> com. alibaba. csp< / groupId>
< artifactId> sentinel- annotation- aspectj< / artifactId>
< version> 1.8 .0 < / version>
< / dependency>
配置类
import com. alibaba. csp. sentinel. annotation. aspectj. SentinelResourceAspect ;
import org. springframework. context. annotation. Bean ;
import org. springframework. context. annotation. Configuration ;
@Configuration
public class SentinelAspectConfiguration {
@Bean
public SentinelResourceAspect sentinelResourceAspect ( ) {
return new SentinelResourceAspect ( ) ;
}
}
使用注解看效果
@SentinelResource ( value = "HelloWorld" , blockHandler = "blockHandlerForHelloWorld3" )
@RequestMapping ( "helloWorld3" )
public String helloWorld3 ( ) {
return "SentinelResource" + System . currentTimeMillis ( ) ;
}
public String blockHandlerForHelloWorld3 ( BlockException e) {
e. printStackTrace ( ) ;
return "系统繁忙,请稍后!" ;
}
Sentinel支持异步调用链路统计。在异步调用中,需要通过SphU.asyncEntry(xxx)方法定义资源,并通常需要在异步的回调函数中调用exit方法。 启动类添加注解@EnableAsync,让项目支持异步调用支持 创建AsyncService异步调用类以及方法
import org. springframework. scheduling. annotation. Async ;
import org. springframework. stereotype. Service ;
@Service
public class AsyncService {
@Async
public void doSomethingAsync ( ) {
System . out. println ( "async start..." ) ;
try {
Thread . sleep ( 4000 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
System . out. println ( "async end..." ) ;
}
}
controller测试
@Autowired
private AsyncService asyncService;
@RequestMapping ( "helloWorld4" )
public void helloWorld4 ( ) {
AsyncEntry asyncEntry = null ;
try {
asyncEntry = SphU . asyncEntry ( "HelloWorld" ) ;
asyncService. doSomethingAsync ( ) ;
} catch ( BlockException e) {
System . out. println ( "系统繁忙,请稍后!" ) ;
} finally {
if ( asyncEntry!= null ) {
asyncEntry. exit ( ) ;
}
}
}
5. 规则(了解一下即可,掌握web管理器的使用)
Sentinel的所有规则,都可以在内存中动态的查询及修改,修改后立即生效。同时Sentinel也提供相关API,来定制自己的规则策略
1. 流量控制规则
原理就是监控应用流量的QPS或并发线程等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。 重要属性如下(Field字段,代表代码设置时的方法名):
Field 说明 默认值 resource 资源名,限流规则的作用对象 count 限流阈值 grade 限流阈值类型,QPS模式(1)或并发线程数模式(0) QPS模式 limitApp 流控针对的调用来源 default,代表不区分调度来源 strategy 调用关系限流策略:直接、链路、关联 根据资源本身(直接) controlBehavior 流控效果(直接拒绝/WarmUp/均速+排队等待),不支持按调用关系限流 直接拒绝 clusterMode 是否集群限流 否
QPS:每秒请求数限制 线程数:资源使用线程数限制
直接:资源直接限流,这个就是简单的限流 关联:关联模式需要填写关联资源的路径,意为如果关联资源的流量超额之后,限流自己(自己为资源名填写的路径) 链路:如果是链路模式需要填写入口资源,限制入口资源对自己的调用
流控效果(同一个资源可以同时有多个限流规则,检查规则时会依次检查)
快速失败:默认的流控方式,当QPS超过任意规则阈值后,新请求会立即被拒绝,抛出FlowException。此方式适用于对系统处理能力确切已知的情况线下,比如通过压测确定了系统的准确水位时 Warm Up:预热/冷启动方式。当系统长期处于低水位情况下,流量突然增加,直接把系统拉升到高水可能瞬间把系统压垮。通过冷启动,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮 排队等待:严格控制请求通过的间隔时间,也让请求以均匀的速度通过,对应的是漏桶算法
2. 熔断降级规则
对不稳定资源进行熔断降级是保障高可用的重要措施之一,一个服务常常会调用别的模块,可能是远程服务、数据库、第三方API等,例如支付时远程调用支付宝,银联API。然而被依赖服务的稳定性是不能保证的,如果依赖的服务出现不稳定,请求响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用 现代微服务架构都是分布式的,不同服务之间相互调用,组成复杂的调用链路,复杂链路某一环不稳定,就可能会层层级联,最终导致整个链路都不可用,因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。
Field 说明 默认值 resource 资源名,规则的作用对象 grade 熔断策略,支持慢调用比例/异常比率/异常数策略 慢调用比例 count 慢调用比例模式下为慢调用临界RT(超出该值记为慢调用);异常比例/异常数模式下为对应的阈值 QPS模式 timeWindow 熔断时长,单位s minRequestAmount 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断 5 statIntervalMs 统计时长(单位ms),如60*1000代表分钟级 1000ms slowRatioThreshold 慢调用比例阈值,仅慢调用比例模式有效
List < DegradeRule > rules = new ArrayList < > ( ) ;
DegradeRule degradeRule = new DegradeRule ( ) ;
degradeRule. setResource ( "HelloWorld" ) ;
degradeRule. setCount ( 10 ) ;
degradeRule. setGrade ( RuleConstant . DEGRADE_GRADE_RT) ;
degradeRule. setTimeWindow ( 10 ) ;
rules. add ( degradeRule) ;
DegradeRuleManager . loadRules ( rules) ;
慢调用比例(SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用,单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN),若接下来的一个请求响应时间小于设置的慢调用RT则结束熔断,若大于设置的慢调用RT则会再次被熔断 异常比例(ERROR_RATIO):当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是[0.0,1.0]代表0%~100% 异常数(ERROR_COUNT):当单位统计时长内的异常数目超过阈值后会自动进行熔断,经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断 注意:异常降级仅仅针对业务异常,对Sentinel限流降级本身的异常(BlockException)不生效。为了统计异常比率或异常数,需要通过Tracer.trace(ex)记录业务异常,示例如下(开源整合模块,Sentinel Dubbo Adapter,Sentinel Web Servlet Filter或@SentinelResource注解会自动统计业务异常,需要手动调用)
3. 系统保护规则
Sentinel系统自适应限流从整体维度对应入口流量进行控制,结合应用的Load、CPU使用率、总体平均RT、入口QPS和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性
保证系统不被拖垮 在系统稳定的前提下,保持系统的吞吐量
Field 说明 默认值 highestSystemLoad load1触发值,用于触发自适应控制阶段 -1(不生效) avgRt 所有入口流量的平均响应时间 -1(不生效) maxThread 入口流量的最大并发数 -1(不生效) qps 所有入口资源的QPS -1(不生效) highestCpuUsage 当前系统的CPU使用率(0.0~1.0) -1(不生效)
代码设置
ArrayList < SystemRule > rules = new ArrayList < > ( ) ;
SystemRule systemRule = new SystemRule ( ) ;
systemRule. setHighestSystemLoad ( 10 ) ;
rules. add ( systemRule) ;
SystemRuleManager . loadRules ( rules) ;
4. 来源访问控制规则
很多时候,我们需要根据调用来源来判断该次请求是否允许,这时候可以使用此功能。此功能提供黑白名单,配置白名单则只有请求来源位于白名单内时才可通过,若配置黑名单,则请求来源不在黑名单中,才能通过 调用放信息通过ContextUtil.enter(resourceName,origin)方法中的origin参数传入
resource:资源名,限流规则作用的对象 limitApp:对应的黑名单/白名单,不同origin用逗号分隔,如appA,appB. strategy:限制模式,AUTHORITY_WHITE为白名单模式,AUTHORITY_BLACK为黑名单模式,默认白名单模式
示例:希望控制对资源test的访问设置白名单,只有来源为appA和appB的请求才可通过
AuthorityRule authorityRule = new AuthorityRule ( ) ;
authorityRule. setResource ( "test" ) ;
authorityRule. setStrategy ( RuleConstant . AUTHORITY_WHITE) ;
authorityRule. setLimitApp ( "appA,appB" ) ;
AuthorityRuleManager . loadRules ( Collections . singletonList ( authorityRule) ) ;
5. 热点参数规则
热点:经常访问的数据 很多时候,我们希望统计某个热点数据中访问频次最高的Top K数据,并对其访问进行限制
商品ID为参数,统计一段时间内最常购买的商品ID并进行限制 用户ID为参数,针对一段时间内频繁访问的用户ID进行限制
热点参数限流会统计传入参数的热点参数,并根据配置的限流阈值与模式,对包含特点参数的资源调用进行限流,热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。(Sentinel利用LRU策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控,热点参数限流支持集群模式)
ParamFlowRule param1 = new ParamFlowRule ( "param1" ) ;
param1. setParamIdx ( 0 )
. setCount ( 5 ) ;
ParamFlowItem paramFlowItem = new ParamFlowItem ( ) . setObject ( String . valueOf ( param1) ) ;
paramFlowItem. setClassType ( int . class . getName ( ) )
. setCount ( 10 ) ;
param1. setParamFlowItemList ( Collections . singletonList ( paramFlowItem) ) ;
ParamFlowRuleManager . loadRules ( Collections . singletonList ( param1) ) ;
加入依赖
< dependency>
< groupId> com. alibaba. csp< / groupId>
< artifactId> sentinel- parameter- flow- control< / artifactId>
< version> 1.8 .0 < / version>
< / dependency>
编写controller
@RequestMapping ( "helloWorld" )
public String helloWorld ( ) {
Entry entry = null ;
try {
entry = SphU . entry ( "HelloWorld" , EntryType . IN, 1 , param1) ;
System . out. println ( param1) ;
return "Sentinel " + System . currentTimeMillis ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
return "系统繁忙,请稍后!" ;
} finally {
entry. exit ( 0 , EntryType . IN, 1 , param1) ;
}
}
三、Spring Cloud整合Sentinel(重点)
1. 和Spring Cloud集成
Spring Cloud Alibaba默认为Sentinel整合了Servlet、RestTemplate、FeignClient和Spring WebFlux,它不仅补全了Hystrix在Servlet和RestTemplate这一块的空白,还完全兼容了Hystrix在FeignClient中限流降级的用法,并支持灵活配置和调整流控规则
< dependency>
< groupId> com. alibaba. cloud< / groupId>
< artifactId> spring- cloud- starter- alibaba- sentinel< / artifactId>
< / dependency>
server :
port : 80
servlet :
context-path : "/"
spring :
application :
name : sentinel_springcloud
cloud :
sentinel :
transport :
dashboard : localhost: 8080
@RestController
public class SentinelController {
@SentinelResource ( value = "HelloWorld" , blockHandler = "blockHandlerForHelloWorld3" )
@RequestMapping ( "helloWorld3" )
public String helloWorld3 ( ) {
return "SentinelResource" + System . currentTimeMillis ( ) ;
}
public String blockHandlerForHelloWorld3 ( BlockException e) {
e. printStackTrace ( ) ;
return "系统繁忙,请稍后!" ;
}
}
2. 整合nacos实现配置持久化
前面的例子中,每次重启,客户端中数据将会消失,需要重新定义规则,因为默认是将规则放在内存 我们可以将规则保存到Nacos配置中心中,实现持久化
< dependency>
< groupId> com. alibaba. csp< / groupId>
< artifactId> sentinel- datasource- nacos< / artifactId>
< / dependency>
类型选择为json
[
{
"resource" : "HelloWorld" ,
"limitApp" : "default" ,
"grade" : 1 ,
"count" : 2 ,
"strategy" : 0 ,
"controlBehavior" : 0 ,
"clusterMode" : false
}
]
3. 配置文件中配置spring cloud和nacos中获取规则
server :
port : 80
servlet :
context-path : "/"
spring :
application :
name : sentinel_springcloud
cloud :
sentinel :
transport :
dashboard : localhost: 8080
datasource :
ds :
nacos :
server-addr : localhost: 8848
group-id : DEFAULT_GROUP
rule-type : flow
data-id : sentinel- test
data-type : json
四、源码