1. 为什么要将流控规则持久化
默认的的流控规则是配置在sentinel中的,又因为sentinel是懒加载的,只有当我们访问了一个请求的时候,sentinel才能监控到我们的簇点链路,我们才能对该链路进行流控配置,一旦我们重启应用sentinel将会丢失我们的监控链路,sentinel规则也将会消失,这样对我们的生产服务器的重新部署是非常不友好的。
那么我们能不能将我们配置的流控规则保存在一个地方,让sentinel在任何时候只要需要就能获取到我们配置的流控规则呢?
2. 将流控规则持久化进nacos中
我们知道nacos中是内置了一个轻量化的数据库的,我们就可以将我们的流控规则通过一种方式配置在nacos中的,只要Nacos里面的配置不删除,sentinel上的流控规则就持续有效。
1. 引入sentinel的持久化依赖
<!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2. 在nacos中创建某个微服务的流控配置规则
在nacos中新建流控规则配置文件:
[{
"resource": "customerBlockHandler",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}]
resource可以是请求的映射,也可以是在@SentinelResource中指定的value = "customerBlockHandler"名称
sentinel中的规则配置对照:
3. 在该微服务的application.yaml中添加nacos数据源配置信息
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel dashboard地址
port: 8791 #默认端口
datasource:
ds1:
nacos:
server-addr: localhost:8848 #nacos的服务地址,根据实际情况而定
data-id: cloudalibaba-sentinel-service #在nacos中新建的配置文件的名称
group-id: DEFAULT_GROUP #新建时分配的组别
data-type: json #配置文件的数据格式
rule-type: flow
关闭cloudalibaba-sentinel-service的服务后,sentinel中的流控规则消失,重启后会自动加载