springcloud-alibaba-sentinel(5)sentinel规则持久化至Nacos (一)


开源的sentinel 的流控规则都是基于内存的,无论是sentinel的客户端(即我们的微服务)还是sentinel-dashboard(控制台)

当微服务重启之后,原本的流控规则失效了,无持久化的模式,在生产中肯定是无法使用的

sentinel-dashboard规则拉取源码逻辑:

本文使用流控规则进行模拟

点击流控规则

image-20220413211440300

请求到了如下接口

image-20220413211423498

接口逻辑实现源码:

image-20220413211557638

然后一系列操作,实际是根据控制台对应机器信息,使用Http请求,去客户端获取了规则信息

image-20220413212009912

最终调用代码

调用了客户端接口http://10.50.40.113:8719/getrules?type=flow

image-20220413212112688

当控制台将消息发出去后,断点进入到了我们的微服务中(客户端)

FetchActiveRuleCommandHandler 中的handler方法,根据规则类型,使用对应的规则管理器,获取当前客户端的所有规则

例如,下方请求的是流控规则,则使用FlowRuleManager 获取当前客户端已有规则

image-20220413212336613

从对应规则管理器获取规则明细

image-20220413212549555

sentinel-dashboard规则添加源码逻辑:

控制台添加,并推送至客户端

image-20220413213808328

image-20220413213844594

image-20220413213949537

最后进入到了客户端中的ModifyRulesCommandHandler

image-20220413214844190

FlowRuleManager进行存储新的流控规则

image-20220413214914505

最后监听者消费保存

image-20220413215250640

保存至本地缓存中

image-20220413215309327

nacos配置流控规则实现

因为我们服务本身就整合了nacos,我们可以使用Nacos客户端监听机制,实现 nacos发布配置>>>nacos客户端读取配置(同时也是sentinel客户端)>>> sentinel集群展示

image-20220413215619226

引入依赖:

    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 nacosapollo zk redis 后面的配置分别是这些数据源的具体配置。

注意自己的规则配置在nacos什么地方(命名空间 、分组)以及DATAID(我这里是app-base-center-sentinel-rule-flow)

具体可以点击Yml 进入到对应配置类查看

image-20220413220932586

image-20220413220948618

nacos添加流控配置

image-20220413215840841

注意,配置时需要最终格式为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
    }
]

image-20220413220359315

image-20220413220330437

如此配置便OK了,当我们的服务重启时,因为nacos还存有对应流控配置,其会去nacos拉取

问题:

上次流控规则持久化至nacos仅仅只是单向持久化完成 (nacos-> sentinel-clinet -> sentinel-dashboard),我们在sentinel-dashboard上直接操作的规则,并没有反向写入到nacos中

ex:

image-20220413221615661

但nacos上并无任何变化:

image-20220413221701750

nacos上规则无变化,意味着,我们本次的操作并没有持久化,如果服务后续重启,则本次规则更改操作就失效了

那么这个问题能不能解决呢?自然是可以的,我们直接对sentinel源码做一些修改就行,具体如何实现…待续

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值