备注:仅写了一种流控规则的改造,其他规则的改造都类似,感兴趣的可以直接下载完整代码
github:https://github.com/1299618103/sentinel-dashboard-nacos
码云:https://gitee.com/y1299618103/sentinel-dashboard-nacos
- 概述
Sentinel 是一款很流行的流量治理组件, 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能,但是官方提示,Sentinel 控制台目前仅支持单机部署。Sentinel 控制台项目提供 Sentinel 功能全集示例,不作为开箱即用的生产环境控制台,若希望在生产环境使用请根据文档自行进行定制和改造。简单说就是开源版本的Sentinel控制台不支持高可用部署,并且在使用中,配置的规则仅保存在内存中,重启后就没了,再生产中无法直接使用开源版本的控制台,那该怎么办呢?官方也给出了解决方案,比如阿里提供的云服务,可以直接花钱买,即氪金方案,另一种是根据官方给出的数据持久化方案自己改造控制台,自己肝了,那当然是选择不花钱的方案了,先看下官方推荐的方式:
刚好我们生产使用的是Nacos,所以,开搞… - 服务端
-
下载源码
源码地址:https://github.com/alibaba/Sentinel/releases/tag/1.8.6 -
打开工程
主要关注sentinel-dashboard模块
-
修改后端代码
在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 方法,进行以下修改
-
客户端修改 引入sentinel的服务也需要做以下配置
-
引入依赖
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>1.8.6</version> </dependency>
-
增加配置
其中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
-
-
测试
启动工程
打开控制台,点击新增流控
在控制台新增了流控规则后,打开nacos的配置管理,就可以看到已经持久化的数据了
这样就可以实现规则数据的持久化,就算重启应用,数据也不会丢失。sentinel还支持其他的流控方式,篇幅有限,只写了一种的改造方式,其他的照葫芦画瓢就行了。