SOURCE_MODIFICATION.md 9.2 KB

基于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>&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

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

Nacos展示以及响应结果

img_1.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 $!>