## 基于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 ![img.png](img.png) ------ ##### 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展示 ![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 $!>