## 基于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。
com.alibaba.csp
sentinel-datasource-nacos
----
##### 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>
FlowRuleNacosPublisher实现DynamicRulePublisher>
----
###### 修改 controller.v2下FlowControllerV2 文件,由默认读取改为读取新加以上两个文件
@Autowired
// @Qualifier("flowRuleDefaultProvider")
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider> ruleProvider;
@Autowired
// @Qualifier("flowRuleDefaultPublisher")
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher> rulePublisher;
----
###### 后端修改完成,修改前端页面 \resources\app\scripts\directives\sidebar.html
前端页面需要手动切换,或者修改前端路由配置(sidebar.html 流控规则路由从 dashboard.flowV1 改成 dashboard.flow 即可)
----
###### 找到resources/app/scripts/directives/sidebar/sidebar.html文件搜索dashboard.flowV1,进行修改
流控规则
----
###### 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>
DegradeRuleNacosPublisher实现DynamicRulePublisher>
------
实现熔断规则持久化的代码和之前流控规则的类似,都需要创建两个类分别实现DynamicRuleProvider接口和DynamicRulePublisher接口,只不过接口的泛型不同,熔断规则的为:List
在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 $!>