文章目录
开源的sentinel 的流控规则都是基于内存的,无论是sentinel的客户端(即我们的微服务)还是sentinel-dashboard(控制台)
当微服务重启之后,原本的流控规则失效了,无持久化的模式,在生产中肯定是无法使用的
sentinel-dashboard规则拉取源码逻辑:
本文使用流控规则进行模拟
点击流控规则
请求到了如下接口
接口逻辑实现源码:
然后一系列操作,实际是根据控制台对应机器信息,使用Http请求,去客户端获取了规则信息
最终调用代码
调用了客户端接口http://10.50.40.113:8719/getrules?type=flow
当控制台将消息发出去后,断点进入到了我们的微服务中(客户端)
类FetchActiveRuleCommandHandler
中的handler
方法,根据规则类型,使用对应的规则管理器,获取当前客户端的所有规则
例如,下方请求的是流控规则,则使用FlowRuleManager
获取当前客户端已有规则
从对应规则管理器获取规则明细
sentinel-dashboard规则添加源码逻辑:
控制台添加,并推送至客户端
最后进入到了客户端中的ModifyRulesCommandHandler
FlowRuleManager进行存储新的流控规则
最后监听者消费保存
保存至本地缓存中
nacos配置流控规则实现
因为我们服务本身就整合了nacos,我们可以使用Nacos客户端监听机制,实现 nacos发布配置>>>nacos客户端读取配置(同时也是sentinel客户端)>>> sentinel集群展示
引入依赖:
compile 'com.alibaba.csp:sentinel-datasource-nacos'
YML配置
spring:
application:
name: app-base-center
cloud:
nacos:
server-addr: http://10.50.40.116:8765
config:
file-extension: yml
discovery:
ip: 10.50.40.113
sentinel:
transport:
dashboard: 10.50.40.113:8080
port: 8719
heartbeat-interval-ms: 5000
datasource:
# 流控策略
ds1:
nacos:
server-addr: ${spring.cloud.nacos.server-addr}
namespace: c0fed0b5-46a6-44b9-b850-44c2ae0d7fe7
data-id: ${spring.application.name}-sentinel-rule-flow
# group-id: DEFAULT_GROUP
# 规则配置类型 默认就是为Json
data-type: json
# 流控规则表示该数据源中的规则属于哪种类型的规则(flow,degrade,authority,system, param-flow, gw-flow, gw-api-group)
rule-type: flow
注意点:
ds1, ds2, ds3, ds4 是ReadableDataSource
的名称,可以任意编码。nacos
指的是具体的数据源 目前 sentinel支持 file
nacos
。apollo
zk
redis
后面的配置分别是这些数据源的具体配置。
注意自己的规则配置在nacos什么地方(命名空间 、分组)以及DATAID(我这里是app-base-center-sentinel-rule-flow)
具体可以点击Yml 进入到对应配置类查看
nacos添加流控配置
注意,配置时需要最终格式为json数组,每一个规则为数组中的元素(json对象)
json参数说明
配置内容:
resource:接口名,即限流规则的作用对象
limitApp:流控针对的调用来源,若为 default 则不区分调用来源
grade:限流阈值类型(QPS 或并发线程数);0代表QPS,1代表根据并发线程数
count:限流阈值
strategy:调用关系限流策略
controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队) 0 1 2
clusterMode:是否为集群模式 true/false
[
{
"resource": "/vehicle/**",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
如此配置便OK了,当我们的服务重启时,因为nacos还存有对应流控配置,其会去nacos拉取
问题:
上次流控规则持久化至nacos仅仅只是单向持久化完成 (nacos-> sentinel-clinet -> sentinel-dashboard),我们在sentinel-dashboard上直接操作的规则,并没有反向写入到nacos中
ex:
但nacos上并无任何变化:
nacos上规则无变化,意味着,我们本次的操作并没有持久化,如果服务后续重启,则本次规则更改操作就失效了
那么这个问题能不能解决呢?自然是可以的,我们直接对sentinel源码做一些修改就行,具体如何实现…待续