## 基于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：复制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>&nbsp;&nbsp;流控规则</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>&nbsp;&nbsp;流控规则</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
![img.png](img.png)
------

##### 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展示
![img_3.png](img_3.png)
----
##### Nacos展示以及响应结果
![img_1.png](img_1.png)
![img_2.png](img_2.png)
---

#### 代码应用层面
    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 $!>  

