(十五)SpringCloudAlibaba-Sentinel持久化到Nacos

embedded/2024/9/23 10:13:33/

前言

        在前面我们已经将Sentinel配置的规则持久化到系统的文件中。本章节我们将Sentinel持久化到Nacos中;

传送门(Sentinel数据持久化到文件)icon-default.png?t=N7T8https://blog.csdn.net/weixin_45876411/article/details/140742963

        默认情况下 Sentinel 只能接收到 Nacos 推送的消息,但不能将自己控制台修改的信息同步给 Nacos,如下图所示:

        生产环境下为了更方便的操作,需要将Sentinel控制台修改的规则也同步到Nacos,所以在这种情况下我们就需要修改Sentinel的源码,让其可以实现和 Nacos 的双向通讯,如下图所示:

版本信息

nacosnacos-server-2.4.0
sentinelSentinel-1.8

sentinel规则持久化到nacos分为两个流程

        流程一:下载sentinel源码包,改动源码使sentinel规则持久化支持使用nacos;

        流程二:项目配置sentinel规则持久化到nacos;

流程一(sentinel持久化到nacos)

1.下载并打开Sentinel源码

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

目录结构

2.修改sentinel-dashboard服务的pom.xml

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

3.移动单元测试代码

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

nacos包中的4个类:
        FlowRuleNacosProvider: 动态获取Nacos配置中心流控规则,读取流控规则;
        FlowRuleNacosPublisher: publish上传流控规则到Nacos配置中心,写入流控规则;
        NacosConfig: Nacos配置;
        NacosConfigUtils: 流控规则在nacos中配置文件的一些细节(后缀、组别等);

4.注释FlowRuleNacosProvider、FlowRuleNacosPublisher类中导入的NacosConfigUtil类

5.新建NacosPropertiesConfiguration文件

        在src/main/java/com.alibaba.csp.sentinel.dashboard.rule中创建Nacos配置文件的读取类

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/Setterpublic String getServerAddr() {return serverAddr;}public void setServerAddr(String serverAddr) {this.serverAddr = serverAddr;}public String getDataId() {return dataId;}public void setDataId(String dataId) {this.dataId = dataId;}public String getGroupId() {return groupId;}public void setGroupId(String groupId) {this.groupId = groupId;}public String getNamespace() {return namespace;}public void setNamespace(String namespace) {this.namespace = namespace;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

6.修改NacosConfig文件

修改内容:

    @Beanpublic 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"); // 原代码}

7.修改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 的开关。

8.修改配置信息

        在application.properties中设置Nacos连接信息

# 新加Sentinel连接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

9.修改sidebar.html

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

搜索“dashboard.flowV1”将其替换为“dashboard.flow”

10.修改identity.js

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

10.1 第一处修改

将“FlowServiceV1”替换为“FlowServiceV2”

10.2 第二处修改

搜索“/dashboard/flow/”替换为“/dashboard/v2/flow/”

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

11.打包sentinel-dashboard工程

12.启动工程

sentinel启动命令

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

访问sentinel

流程二(项目集成sentinel持久化到nacos)

1.修改shop-order服务添加依赖

        <!--sentinel--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!--sentinel集成nacos额外需要的依赖--><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId><version>1.8.0</version></dependency>

2.修改shop-order服务application.yml配置

        添加sentinel持久化到nacos配置并重启shop-order服务;

完整配置文件供参考

server:port: 8091
# 项目名称(服务名称)
spring:application:name: service-order# 配置nocos服务端地址cloud:nacos:discovery:server-addr: localhost:8848# sentinel配置sentinel:transport:port: 9999 # 当前微服务和sentinel控制台数据交互端口dashboard: localhost:8080 # 指定sentinel控制台服务的地址(与启动sentinel控制台命令配置的地址相同)eager: true # 关闭懒加载datasource:ds1:nacos:server-addr: localhost:8848 # nacos地址dataId: service-order-flow-rules # sentinel规则持久化到nacos中的dataId(即文件名),启动项目后会在相应组下创建此文件groupId: SENTINEL_GROUP # 上面dataId(文件)存放在nacos中的组名data-type: json # 存放在dataId文件中的内容格式rule-type: flow # 规则类型
# 数据库配置datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverdruid:url: jdbc:mysql://127.0.0.1:3306/shop?useSSL=true&useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=TRUE&allowMultiQueries=true&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456# 初始连接数initialSize: 5# 最小连接池数量minIdle: 10# 最大连接池数量maxActive: 50# 配置获取连接等待超时的时间maxWait: 60000# 配置连接超时时间connectTimeout: 30000# 配置网络超时时间socketTimeout: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis: 300000# 配置一个连接在池中最大生存的时间,单位是毫秒maxEvictableIdleTimeMillis: 900000# 配置检测连接是否有效validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: false# ribbon负载均衡配置
service-product: # 服务提供方名称(即通过指定“服务名称”请求该服务时使用指定的负载均衡策略)ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡策略(随机)

补充说明上面配置文件中"rule-type"对应sentinel所有的流控规则类型其取值如下

3.观察Naocs中是否在SENTINEL_GROUP组下新建service-order-flow-rules文件

4.进入sentinel控制台中添加限流规则

        为/order/message1接口添加流控规则(每秒访问频率1次)

5.查看Nacos中service-order-flow-rules文件中是否有刚添加的流控规则

6.访问/order/message1接口测试流控规则是否生效

7.重启shop-order服务再次访问/order/message1接口查看流控规则是否仍然生效(测试持久化)

文章结尾附:

        1.Sentinel-1.8.zip(源码未改动);

        2.nacos-server-2.4.0.zip;

        3.测试工程源码;


http://www.ppmy.cn/embedded/108013.html

相关文章

关于武汉高芯coin417G2红外机芯的二次开发

文章目录 前言一、外观和机芯参数二、SDK的使用1、打开相机2、回调函数中获取全局温度和图像3、关闭相机 前言 最近工作中接触了一款基于武汉高芯科技有限公司开发的红外模组,即coin417g2(测温型)9.1mm镜头.使用此模组,开发了一套红外热成像检测桌面应用程序.下面简单记录下该…

rancher搭建k8s及jenkins自动化部署

1、准备环境 角色IP用途k8s-rancher-master192.168.3.63master节点k8s-rancher-node01192.168.3.64node节点k8s-rancher-node02192.168.3.66node节点k8s-rancher-server192.168.2.33rancher-server节点注: 服务器名需要配置不同,相同服务器名不能加入node节点 在所有节点进行…

【深入解析】AI工作流中的HTTP组件:客户端与服务端执行的区别

在当今快速发展的技术环境中&#xff0c;AI工作流的设计和实现变得愈发重要。尤其是在处理HTTP组件时&#xff0c;前端执行与后端执行之间的区别&#xff0c;往往会对系统的安全性和数据的准确性产生深远的影响。今天&#xff0c;我们就来深入探讨这一话题&#xff0c;揭示前端…

学习Linux

1. 操作系统是计算机软件的一种&#xff0c;它主要负责&#xff1a; 作为用户和计算机硬件之间的桥梁&#xff0c;调度和管理计算机硬件进行工作&#xff08;作用&#xff09; 2.计算机有了操作系统&#xff0c;就相当于拥有了灵魂 3.操作系统可以&#xff1a;调度CPU进行工作…

VUE3父子组件传参

defineProps和defineEmits的使用场景‌ ‌父组件向子组件传递数据‌&#xff1a;子组件可以通过defineProps接收来自父组件的数据&#xff0c;并在子组件的模板中使用这些数据。‌2‌子组件向父组件发送事件‌&#xff1a;子组件可以通过defineEmits触发事件&#xff0c;并将数…

fastadmin 清除插件缓存报错

Argument 1 passed to Symfony\Component\VarExporter\VarExporter::export() must be an instance of Symfony\Component\VarExporter\mixed, array given, called in F:\work\awebsite\oeob\vendor\karsonzhang\fastadmin-addons\src\addons\Service.php on line 404 我用的…

SpringCloud之Sleuth(Micrometer)+ZipKin分布式链路追踪

&#xff08;学习笔记&#xff09; 1、分布式链路追踪概述 问题&#xff1a;在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果&#xff0c;每一个前段请求都会形成一条复杂的分布式服务调用链路&#xf…

基于Openjdk容器打包运行jar程序

文章目录 应用场景基于Openjdk容器打包运行jar程序1.编译项目成jar包2.构建Dockerfile文件精简版-含jar包精简版-不含jar包带注释版-含jar包 3.编译Dockerfile成镜像。4.运行镜像&#xff1a; 应用场景 部署多版本jdk的应用程序。 基于Openjdk容器打包运行jar程序 1.编译项目…