Sentinel如何持久化数据到Nacos?

sentinel,nacos · 浏览次数 : 0

小编点评

**Sentinel 代码改造步骤** 1. **修改 pom.xml 文件** -注释掉 `sentinel-datasource-nacos` 的 `scope` 属性。 -移动单元测试代码到 `src/main/java/com.alibaba.csp.sentinel.dashboard.rule` 目录。 2. **创建 Nacos 配置文件** -创建一个名为 `NacosPropertiesConfiguration` 的 Java 类,继承 `ConfigurationProperties` 类。 -配置 `serverAddr`, `namespace`, `username`, `password` 和其他必要的属性。 3. **修改 `NacosConfig` 文件** -修改 `nacosConfigService` 方法的返回值类型并返回一个 `ConfigFactory` 实例。 4. **修改 `FlowControllerV2` 文件** -配置 `ruleProvider` 和 `rulePublisher` 属性,用于与 Nacos 进行通信。 5. **修改 `application.properties` 文件** -设置 Nacos 连接信息,例如 `serverAddr`、`username` 和 `password`。 6. **修改 `sidebar.html` 页面** -将 `dashboard.flowV1` 替换为 `dashboard.flow`。 7. **修改 `identity.js` 文件** -修改 `FlowServiceV1` 和 `FlowServiceV2` 的名称。 8. **修改 `identity.js` 文件** -将 `FlowServiceV1` 和 `FlowServiceV2` 的命名空间从 `dashboard.flowV1` 和 `dashboard.flow` 中提取出来。 9. **修改 `redis.properties` 和 `jvm.properties` 文件** -配置 Nacos 的连接信息。

正文

默认情况下 Sentinel 只能接收到 Nacos 推送的消息,但不能将自己控制台修改的信息同步给 Nacos,如下图所示:
image.png
但是在生成环境下,我们为了更方便的操作,是需要将 Sentinel 控制台修改的规则也同步到 Nacos 的,所以在这种情况下我们就需要修改 Sentinel 的源码,让其可以实现和 Nacos 的双向通讯,如下图所示:
image.png
改造之后的交互流程如下图所示:
image.png
Sentinel 同步规则至数据源,例如将 Sentinel 的规则,同步规则至 Nacos 数据源的改造步骤很多,但整体实现难度不大,下面我们一起来看吧。

1.下载Sentinel源码

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

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

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

2.修改pom.xml

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

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

3.移动单元测试代码

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

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 文件:
image.png
修改后代码:

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

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

如下图所示:
image.png

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 文件:
image.png
搜索“dashboard.flowV1”改为“dashboard.flow”,如下图所示:
image.png

9.修改identity.js

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

9.1 第一处修改

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

9.2 第二处修改

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

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

小结

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

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

与Sentinel如何持久化数据到Nacos?相似的内容:

Sentinel如何持久化数据到Nacos?

默认情况下 Sentinel 只能接收到 Nacos 推送的消息,但不能将自己控制台修改的信息同步给 Nacos,如下图所示: 但是在生成环境下,我们为了更方便的操作,是需要将 Sentinel 控制台修改的规则也同步到 Nacos 的,所以在这种情况下我们就需要修改 Sentinel 的源码,让其

如何实现流量控制和熔断降级?

Sentinel Sentinel 是阿里巴巴开源的一款高可用性和流量控制的分布式系统。它最初是为了解决阿里巴巴内部的微服务架构中的流量控制和熔断降级问题而开发的。Sentinel 旨在提供实时的流量控制、熔断降级、系统负载保护等功能,以保障应用的高可用性和稳定性。以下是 Sentinel 的详细介

[转帖]redis脑裂是什么?如何解决

这也是一个常见面试题,对redis集群部署不熟悉的同学,可能压根没听过这个名词qvq 什么是redis脑裂 下面我们解释一下什么是redis脑裂: 关于reids集群会由于网络等原因出现脑裂的情况,所谓的集群脑裂就是,由于redis master节点和redis salve节点和sentinel处于

Redis缓存高可用集群

在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般。

开源框架中的责任链模式实践

责任链模式作为常用的设计模式而被大家熟知和使用。本文介绍责任链的常见实现方式,并结合开源框架如Dubbo、Sentinel等进行延伸探讨。

聊聊Sentinel的熔断降级

Sentinel的熔断降级实现有两个模式,一开始是基于熔断规则的简单处理(说简单其实不简单),目前已改为了基于断路器模式实现,这也是业内常见实现。 断路器模式 断路器模式中讨论了 3 个主要状态。他们是: CLOSED OPEN HALF OPEN 让我们简要了解一下状态…… CLOSED Stat

Sentinel系列之SlotChain、NodeSelectorSlot、ClusterBuilderSlot分析

本文基于Sentinel 1.8.6版本分析 1. SlotChain 我们从入口com.alibaba.csp.sentinel.SphU#entry(java.lang.String) 开始分析。 一路走读下来,会进入到这个方法com.alibaba.csp.sentinel.CtSph#loo

基于Sentinel自研组件的系统限流、降级、负载保护最佳实践探索

Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

2023年最新sentinel-dashbord部署安装(保姆级别)

[TOC] # Sentinel-dashboard安装下载 ### 前景提要 * 想看开源项目,有一个设计到这个工具,由于官方文档主要是在描述和开发相关的,对于很多只想使用界面的用户十分不友好,因此写了这个文章给那些只需要使用的小伙伴,希望对您有帮助,多多支持点赞。 ## 一、 构建环境 | 软件

聊聊Spring Cloud Alibaba Sentinel的限流

Spring Cloud Alibaba Sentinel限流功能概览,目前先整理一版,东西有点多,想慢慢打开;后续继续更新......