基于JDK17+Sentinel改造控制台模块
Sentinel规则持久化(1.8.+版)当次改造使用1.8.6
一、概念
当应用重启后,Sentinel 规则就消失了,生产环境需要将配置的规则进行持久化。
二、如何持久化?
将限流、熔断配置规则持久化进 Nacos 保存,只要刷新被监控的应用(8401为例)某个 REST 地址,Sentinel 控制台的流控规则就能看到,持久化后无需重新配置才能看到。只要 Nacos 里面的配置不删除,针对该应用的Sentinel上的流控规则持续有效。
官方地址以及配置规则详情
官网:https://sentinelguard.io/zh-cn/index.html
配置规则:https://sentinelguard.io/zh-cn/docs/basic-api-resource-rule.html
1:涉及改造内容
流控规则
熔断规则
后续有需要再引入其他规则改造(网关配置已加入:已注释待测试)
2:改造处理方式
1:新增Nacos配置读取方式
2:改造流控规则
3:改造熔断规则
3:改造处理模块
3.0:修改com.alibaba.csp.sentinel.dashboard下的pom.xml文件依赖,注释scope。
<!-- for Nacos rule publisher sample -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!-- <scope>test</scope>-->
</dependency>
3.1:复制sentinel-dashboard中test下rule包放入至com.alibaba.csp.sentinel.dashboard
1:FlowRuleNacosProvider.java:从Nacos配置中心动态获取流控规则
2:FlowRuleNacosPublisher.java:上传动态获取流控规则到Nacos配置中心
3:NacosConfig.java:nacos配置
4:NacosConfigUtils.java:流控规则相关配置,比如GROUP_ID 流控规则的后缀FLOW_DATA_ID_POSTFIX
3.2:修改nacos配置文件
在NacosConfig中使用的是本地的nacos,我们需要修改此配置
在com.alibaba.csp.sentinel.dashboard.rule.nacos路径下创建NacosConfigProperties.java文件
详情看rule目录下NacosConfigProperties文件
3.3:修改NacosConfig.java文件
详情看rule目录下NacosConfig文件
1:注释源码中默认读取local代码,新增配置文件读取nacos
2:对应resource下配置文件
#Nacos数据源配置
sentinel.nacos.serverAddr=xxx
sentinel.nacos.username=xxx
sentinel.nacos.password=xxx
sentinel.nacos.namespace=xxx
3.4新增NacosConstants配置常量类
配置常量信息详情,自行查看rule下NacosConstants文件
文件定义流控规则/熔断流控规则后缀 需要和spring项目中定义后缀名一致
当前只改造了流控规则以及熔断规则,网关以及热点暂时不使用,暂未改造
默认 Nacos 适配的 dataId 和 groupId 约定如下:
groupId: SENTINEL_GROUP
流控规则 dataId: {appName}-flow-rules,比如应用名为 appA,则 dataId 为 appA-flow-rules
可以在 NacosConfigUtil 修改对应的 groupId 和 dataId postfix。然后在 NacosConfig 配置对应的 Converter,默认已提供 FlowRuleEntity 的 decoder 和 encoder。
3.5:改造流控规则
3.5.1:修改流控代码
nacos下新建flow文件夹 新增以下文件
FlowRuleNacosProvider
FlowRuleNacosPublisher
该两文件
FlowRuleNacosProvider实现DynamicRuleProvider<List<DegradeRuleEntity>>
FlowRuleNacosPublisher实现DynamicRulePublisher<List<DegradeRuleEntity>>
修改 controller.v2下FlowControllerV2 文件,由默认读取改为读取新加以上两个文件
@Autowired
// @Qualifier("flowRuleDefaultProvider")
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
// @Qualifier("flowRuleDefaultPublisher")
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
后端修改完成,修改前端页面 \resources\app\scripts\directives\sidebar.html
前端页面需要手动切换,或者修改前端路由配置(sidebar.html 流控规则路由从 dashboard.flowV1 改成 dashboard.flow 即可)
找到resources/app/scripts/directives/sidebar/sidebar.html文件搜索dashboard.flowV1,进行修改
<!-- 修改前 -->
<!-- <li ui-sref-active="active" ng-if="!entry.isGateway">-->
<!-- <a ui-sref="dashboard.flowV1({app: entry.app})">-->
<!-- <i class="glyphicon glyphicon-filter"></i> 流控规则</a>-->
<!-- </li>-->
<!-- 修改后 -->
<li ui-sref-active="active" ng-if="!entry.isGateway">
<a ui-sref="dashboard.flow({app: entry.app})">
<i class="glyphicon glyphicon-filter"></i> 流控规则</a>
</li>
1.找到resources/app/scripts/controllers/identity.js文件,把FlowServiceV1 改成FlowServiceV2
'ngDialog',
// 'FlowServiceV1',
'FlowServiceV2',
'DegradeService', 'AuthorityRuleService', 'ParamFlowService', 'MachineService',
2.通页面找到saveFlowRule方法进行改动,把/dashboard/flow/换成/dashboard/v2/flow/
if (data.code === 0) {
flowRuleDialog.close();
// let url = '/dashboard/flow/' + $scope.app; //修改前
let url = '/dashboard/v2/flow/' + $scope.app;//修改后
$location.path(url);
注释掉单机模式
原因是,当我们修改了sidebar.html中的代码注释掉了V1版本的页面,放开了V2版本的页面后,V2版本的页面依然保留了原有的在内存中维护规则的入口,就是这个<回到单机页面>按钮。
/sentinel-dashboard/src/main/webapp/resources/app/views/flow_v2.html

3.5.2:修改熔断代码(参考于网关/流控规则改造)
nacos下新建degrade文件夹 新增以下文件
DegradeRuleNacosProvider.java
DegradeRuleNacosPublisher.java
该两文件
DegradeRuleNacosProvider实现DynamicRuleProvider<List<DegradeRuleEntity>>
DegradeRuleNacosPublisher实现DynamicRulePublisher<List<DegradeRuleEntity>>
实现熔断规则持久化的代码和之前流控规则的类似,都需要创建两个类分别实现DynamicRuleProvider接口和DynamicRulePublisher接口,只不过接口的泛型不同,熔断规则的为:List<FlowRuleEntity>
在com.alibaba.csp.sentinel.dashboard.rule.nacos包下创建degrade包。创建类:DegradeRuleNacosProvider.java和DegradeRuleNacosPublisher.java,分别实现<从Nacos拉取规则并展示在Dashboard上>和<将通过Dashboard维护的熔断规则持久化到Nacos上>这两个功能。
二者代码实现也同流控规则中的代码类似。
修改com.alibaba.csp.sentinel.dashboard.controller.DegradeController
修改以下两处方法
DegradeController.apiQueryMachineRules(String, String, Integer)
DegradeController.publishRules(String, String, Integer)
详情看DegradeController类中
展示效果
当项目中pom文件对应进行配置后(可参考sentinel-dashboard/src/main/resources下config.txt进行项目配置),调用服务后,可在Sentinel Dashboard 页面进行展示查看
用户名与密码:sentinel/sentinel,可在application.properties进行配置
Sentinel展示

Nacos展示以及响应结果


代码应用层面
1:自定义异常类编写(可参考矿拉拉下的sckw-common/sckw-core/web/exceptionHandler)
2:项目pom配置(可参考sentinel-dashboard/src/main/resources下config.txt进行项目配置)
3:nacos异常配置
4:项目中使用注解@SentinelResource()
4:配置文件改造(也可不改造,使用默认application.properties作为主配置文件)
原有配置文件读取为sentinel-dashboard/src/main/resources中application.properties文件。当前修改为多源配置,增加prod、dev、test、local、配置进行灵活配置。
特别备注:
1:当sentinel中的nacos与当前项目服务中的nacos要保持一致,
2:当前namespace应于项目中nacos一致,group-id,sentinel默认为SENTINEL_GROUP(不推荐修改,用于作为区分)
3:当实际项目中配置信息或Nacos信息发生改变,当前项目中应一致随之发生改变!!!!
项目启动方式:Window/Linux---也可参考README.md文档进行处理
Windows:
选择sentinel-dashboard项目,选择对应properties配置文件。
进行Maven项目,clean、install、package。
选择模块中DashBoardApplication启动类进行启动即可。
Linux:
项目重复以上Windows操作,最后Maven进行命令打包成jar包,上传服务器。
进行命令启动即可。1或者2任选其一
mvn clean install package '-Dmaven.test.skip=true'
1:nohup java -jar sentinel-dashboard1.8.6-prod.jar &
2:nohup java -Dserver.port=19527(项目指定端口/或使用默认) -Dcsp.sentinel.dashboard.server=47.108.162.14:19527(对应服务地址) -Dproject.name=sentinel-dashboard -jar sentinel-dashboard1.8.6-prod.jar >sentinel.log 2>&1 & echo $!>