前言
在前面我们已经将Sentinel配置的规则持久化到系统的文件中。本章节我们将Sentinel持久化到Nacos中;
传送门(Sentinel数据持久化到文件)https://blog.csdn.net/weixin_45876411/article/details/140742963
默认情况下 Sentinel 只能接收到 Nacos 推送的消息,但不能将自己控制台修改的信息同步给 Nacos,如下图所示:
生产环境下为了更方便的操作,需要将Sentinel控制台修改的规则也同步到Nacos,所以在这种情况下我们就需要修改Sentinel的源码,让其可以实现和 Nacos 的双向通讯,如下图所示:
版本信息
|----------|--------------------|
| nacos | nacos-server-2.4.0 |
| sentinel | Sentinel-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配置文件的读取类
java
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
public 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文件
修改内容:
java
@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"); // 原代码
}
7.修改FlowControllerV2文件
修改com.alibaba.csp.sentinel.dashboard.controller.v2目录下的FlowControllerV2 文件:
添加内容
java
@Autowired
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
++PS:此操作的目的是开启 Controller 层操作 Nacos 的开关。++
8.修改配置信息
在application.properties中设置Nacos连接信息
java
# 新加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
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
访问sentinel
流程二(项目集成sentinel持久化到nacos)
1.修改shop-order服务添加依赖
java
<!--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服务;
完整配置文件供参考
java
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.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
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/Shanghai
username: root
password: 123456
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 50
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置连接超时时间
connectTimeout: 30000
# 配置网络超时时间
socketTimeout: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: 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.测试工程源码;