Sentinel源码改造,实现Nacos双向通信!

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    Sentinel Dashboard(控制台)默认情况下,只能将配置规则保存到内存中,这样就会导致 Sentinel Dashboard 重启后配置规则丢失的情况,因此我们需要将规则保存到某种数据源中,Sentinel 支持的数据源有以下这些:



    然而,默认情况下,Sentinel 和数据源之间的关系是单向数据通讯的,也就是只能先在数据源中配置规则,然后数据源会被规则推送至 Sentinel Dashboard 和 Sentinel 客户端,但是在 Sentinel Dashboard 中修改规则或新增规则是不能反向同步到数据源中的,这就是单向通讯。

    所以,今天我们就该修改一下 Sentinel 的源码,让其可以同步规则至数据源,改造之后的交互流程如下图所示:



    Sentinel 同步规则至数据源,例如将 Sentinel 的规则,同步规则至 Nacos 数据源的改造步骤很多,但整体实现难度不大,下面我们一起来看吧。

    1.下载Sentinel源码

    下载地址:https://github.com/alibaba/Sentinel

    PS:本文 Sentinel 使用的版本是 1.8.6。

    下载源码之后,使用 idea 打开里面的 sentinel-dashboard 项目,如下图所示:

    2.修改pom.xml

    将 sentinel-datasource-nacos 底下的 scope 注释掉,如下图所示:

    PS:因为官方提供的 Nacos 持久化实例,是在 test 目录下进行单元测试的,而我们是用于生产环境,所以需要将 scope 中的 test 去掉。

    3.移动单元测试代码

    将 test/com.alibaba.csp.sentinel.dashboard.rule.nacos 下所有文件复制到 src/main/java/com.alibaba.csp.sentinel.dashboard.rule 目录下,如下图所示:

    4.新建NacosPropertiesConfiguration文件

    在 com.alibaba.csp.sentinel.dashboard.rule 下创建 Nacos 配置文件的读取类,实现代码如下:

    package com.alibaba.csp.sentinel.dashboard.rule;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Configuration; @ConfigurationProperties(prefix = "sentinel.nacos")
    @Configuration
    public class NacosPropertiesConfiguration {
    private String serverAddr;
    private String dataId;
    private String groupId;
    private String namespace;
    private String username;
    private String password;
    // 省略 Getter/Setter 代码
    }

    5.修改NacosConfig文件

    只修改 NacosConfig 中的 nacosConfigService 方法,修改后的代码如下:

    @Bean
    public ConfigService nacosConfigService(NacosPropertiesConfiguration nacosPropertiesConfiguration) throws Exception {
    Properties properties = new Properties();
    properties.put(PropertyKeyConst.SERVER_ADDR, nacosPropertiesConfiguration.getServerAddr());
    properties.put(PropertyKeyConst.NAMESPACE, nacosPropertiesConfiguration.getNamespace());
    properties.put(PropertyKeyConst.USERNAME,nacosPropertiesConfiguration.getUsername());
    properties.put(PropertyKeyConst.PASSWORD,nacosPropertiesConfiguration.getPassword());
    return ConfigFactory.createConfigService(properties);
    // return ConfigFactory.createConfigService("localhost"); // 原代码
    }

    6.修改FlowControllerV2文件

    修改 com.alibaba.csp.sentinel.dashboard.controller.v2 目录下的 FlowControllerV2 文件:



    修改后代码:

    @Autowired
    @Qualifier("flowRuleNacosProvider")
    private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
    @Autowired
    @Qualifier("flowRuleNacosPublisher")
    private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;

    PS:此操作的目的是开启 Controller 层操作 Nacos 的开关。

    如下图所示:

    7.修改配置信息

    在 application.properties 中设置 Nacos 连接信息,配置如下:

    sentinel.nacos.serverAddr=localhost:8848
    sentinel.nacos.username=nacos
    sentinel.nacos.password=nacos
    sentinel.nacos.namespace=
    sentinel.nacos.groupId=DEFAULT_GROUP
    sentinel.nacos.dataId=sentinel-dashboard-demo-sentinel

    8.修改sidebar.html

    修改 webapp/resources/app/scripts/directives/sidebar/sidebar.html 文件:



    搜索“dashboard.flowV1”改为“dashboard.flow”,如下图所示:

    9.修改identity.js

    identity.js 文件有两处修改,它位于 webapp/resources/app/scripts/controllers/identity.js 目录。

    9.1 第一处修改

    将“FlowServiceV1”修改为“FlowServiceV2”,如下图所示:

    9.2 第二处修改

    搜索“/dashboard/flow/”修改为“/dashboard/v2/flow/”,如下图所示:

    PS:修改 identity.js 文件主要是用于在 Sentinel 点击资源的“流控”按钮添加规则后将信息同步给 Nacos。

    小结

    Sentinel Dashboard 默认情况下,只能将配置规则保存到内存中,这样就会程序重启后配置规则丢失的情况,因此我们需要给 Sentinel 设置一个数据源,并且要和数据源之间实现双向通讯,所以我们需要修改 Sentinel 的源码。源码的改造步骤虽然很多,但只要逐一核对和修改就可以实现 Sentinel 生成环境的配置了。看完记得收藏哦,防止以后用的时候找不到。

    本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    “Sentinel源码改造,实现Nacos双向通信!” 的相关文章

    智能车入门——‘教程引导’ <新手从零做车>

    前言 本系列文章是针对 第一次接触智能车 /学校没有传承   不知道 如何上手做智能车 的同学 将这个系列看完,应该就能够 做出正常的 一个低速完赛的电磁车, 如果你是想提速,寻找新的方案,那么这个教程并不适合你,可以退...

    华为OD机试 - 最快到达医院的方法(Java & JS & Python)

    题目描述 新型冠状病毒疫情的肆虐,使得家在武汉的大壮不得不思考自己家和附近定点医院的具体情况。 经过一番调查,大壮明白了距离自己家最近的定点医院有两家。其中: 医院A和自己的距离是X公里 医院B和自己的距离是Y公里 由于武汉封城,公交停运,私家车不能上路,交通十分不便。现在:...

    线程同步

    互斥量:用pthread_mutex_t数据类型来表示,在使用互斥变量以前,必须首先对它进行初始化,可以把它置为常量PTHREAD_MUTEX_INITIALIZER(只对静态分配的互斥量),也可以通过调用pthread_mutex_init函数进行初始化。...

    蛮力调试

    蛮力调试指的是一种或许会被认为乏味,费神,耗时但能确保最终可以解决问题的方法 1.对崩溃代码的设计和编码进行彻底检查 2.抛弃有问题的代码,从头开始设计和编程 3.抛弃整个程序,从头开始设计和编程 4.编译代码时生成全部的高度信息 5.在最为苛刻的警告级别中...

    云客服系统有哪些优势?

    企业线上的日常服务和运营活动,可能会导致大量的售前、售中和售后问题。客户服务人员面临着大量的重复咨询和高工作量。因此,企业需要使用云客服系统来协助客户服务工作。那么云客服系统有哪些优势呢? 1.全渠道支持,方便消息管理。 云客服系统支持网页、APP、第三方工具等多种接入渠道。可以实现不同平台间的信息...

    UVa 11039 Building designing (模拟)

    11039 - Building designingTime limit: 3.000 secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=457&page...