Sentinel数据持久化到Nacos

备注:仅写了一种流控规则的改造,其他规则的改造都类似,感兴趣的可以直接下载完整代码
github:https://github.com/1299618103/sentinel-dashboard-nacos
码云:https://gitee.com/y1299618103/sentinel-dashboard-nacos

  1. 概述
    Sentinel 是一款很流行的流量治理组件, 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能,但是官方提示,Sentinel 控制台目前仅支持单机部署。Sentinel 控制台项目提供 Sentinel 功能全集示例,不作为开箱即用的生产环境控制台,若希望在生产环境使用请根据文档自行进行定制和改造。简单说就是开源版本的Sentinel控制台不支持高可用部署,并且在使用中,配置的规则仅保存在内存中,重启后就没了,再生产中无法直接使用开源版本的控制台,那该怎么办呢?官方也给出了解决方案,比如阿里提供的云服务,可以直接花钱买,即氪金方案,另一种是根据官方给出的数据持久化方案自己改造控制台,自己肝了,那当然是选择不花钱的方案了,先看下官方推荐的方式:
    在这里插入图片描述
    刚好我们生产使用的是Nacos,所以,开搞…
  2. 服务端
    1. 下载源码
      源码地址:https://github.com/alibaba/Sentinel/releases/tag/1.8.6

    2. 打开工程
      主要关注sentinel-dashboard模块
      在这里插入图片描述

    3. 修改后端代码

      在sentinel-dashboard模块的test目录下,官方给出了修改案例,我们在rule包下新建nacos包,然后将这四个文件复制进去
      在这里插入图片描述
      修改pom文件,把引入nacos依赖的scope注掉

      		<!-- for Nacos rule publisher sample -->
              <dependency>
                  <groupId>com.alibaba.csp</groupId>
                  <artifactId>sentinel-datasource-nacos</artifactId>
                  <!--<scope>test</scope>-->
              </dependency>
      

      修改NacosConfig 文件,引入Nacos地址

          @Value("${nacos.config.serverAddr}")
          private String serverAddr;
          @Value("${nacos.config.namespace}")
          private String namespace;   
          @Bean
          public ConfigService nacosConfigService() throws Exception {
              //return ConfigFactory.createConfigService("localhost");
              // 将Nacos的注册地址引入进来
              Properties properties = new Properties();
              properties.setProperty("serverAddr", serverAddr);
              properties.setProperty("namespace", namespace);
      
              return ConfigFactory.createConfigService(properties);
          }
      

      然后看官方文档提供的步骤,完成修改
      在这里插入图片描述

      接着找到com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2,将动态流控规则修改为nacos,即前面步骤提到我们复制出来的官方提供的修改案例
      在这里插入图片描述
      除此之外,持久化数据后还会有一个问题,先看源码
      在这里插入图片描述
      可以看到当我们新增一个流控规则时候,会通过nextId方法生成一个id,但是这个id的生成,每次重启服务后,都会从0开始,就会导致每次都会覆盖之前的规则,所以也要做改造

    private static AtomicLong ids = new AtomicLong(0);
    @Autowired
    private InMemoryRuleRepositoryAdapter<FlowRuleEntity> repository;
    @Override
    protected long nextId(RuleEntity entity) {
        if(ids.intValue()==0){//如果是重启后 且存在已有规则则赋值为最大id+1
            if(!CollectionUtils.isEmpty( repository.findAllByApp(entity.getApp()))){
                long maxId=repository.findAllByApp(entity.getApp()).stream().max(Comparator.comparingLong(FlowRuleEntity::getId)).get().getId();
                ids.set(maxId);
            }
        }
        return ids.incrementAndGet();
    }

这样每次重启服务后新生成id就不会从0开始了,而是接着增长式产生,避免覆盖历史数据。
5. 修改前端代码
看上图的官方提示,《前端页面需要手动切换,或者修改前端路由配置(sidebar.html 流控规则路由从 dashboard.flowV1 改成 dashboard.flow 即可,注意簇点链路页面对话框需要自行改造)》,
所以接下来还需要修改前端代码
1. 修改流控规则
找到sidebar.html
在这里插入图片描述
进行修改即可
在这里插入图片描述
2. 簇点链路
找到identity.js 文件
在这里插入图片描述
将FlowServiceV1 修改为FlowServiceV2
在这里插入图片描述
​ 找到saveFlowRule 方法,进行以下修改
在这里插入图片描述

  1. 客户端修改 引入sentinel的服务也需要做以下配置

    1. 引入依赖

       		<dependency>
                  <groupId>com.alibaba.csp</groupId>
                  <artifactId>sentinel-datasource-nacos</artifactId>
                  <version>1.8.6</version>
              </dependency>
      
    2. 增加配置

      其中nacos相关配置要修改为自己的,以

      spring:
        application:
          name: demo-test
        cloud:
          nacos:
            username: nacos
            password: nacos
            server-addr: 127.0.0.1:8848
            config:
              name: demo-test
              group: dev_group
              namespace: ed19d2d8-a98b-49f7-81e0-f6fa156c1180
              prefix: demo-test
              file-extension: yaml
              refresh-enabled: true
            discovery:
              group: tanma_dev
              namespace: ed19d2d8-a98b-49f7-81e0-f6fa156c1180
          sentinel:
            enabled: true
            transport:
              port: 8720
              dashboard: 127.0.0.1:8080
              client-ip: 127.0.0.1
            datasource:
              # 数据源的key,可以自由命名
              sentinel-flow:
                # 指定当前数据源是nacos
                nacos:
                  # 设置Nacos的连接地址、命名空间和Group ID
                  server-addr: 127.0.0.1:8848
                  namespace: e2ae945e-10f1-4aea-9a05-fad4f429022b 
                  groupId: SENTINEL_GROUP
                  # 设置Nacos中配置文件的命名规则
                  dataId: ${spring.application.name}-flow-rules
                  # 必填的重要字段,指定当前规则类型是"限流"
                  rule-type: flow  # 还可以是:degrade、authority、param-flow
      
  2. 测试

    启动工程

    打开控制台,点击新增流控
    在这里插入图片描述
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CTYgjCqb-1686462833037)(C:\Users\ymy\AppData\Roaming\Typora\typora-user-images\image-20230611134248927.png)]
    在控制台新增了流控规则后,打开nacos的配置管理,就可以看到已经持久化的数据了
    在这里插入图片描述
    在这里插入图片描述
    这样就可以实现规则数据的持久化,就算重启应用,数据也不会丢失。

    sentinel还支持其他的流控方式,篇幅有限,只写了一种的改造方式,其他的照葫芦画瓢就行了。
    在这里插入图片描述
    在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值