sentinel规则持久化
引述
在springcloud之sentinel(一)中,说明了sentinel的用法。文章链接:https://side-wipe.github.io/2020/06/13/sentinel/
同时,也留下了一个问题,就是在服务重启或者sentinel-dashboard重启是,规则会丢失,那么sentinel规则如何持久化?本篇博客也是建立在上一篇博客的基础之上。
本篇就将介绍:通过修改sentinel-dashboard源码,结合nacos注册中心对sentinel规则进行持久化。
sentinel持久化
1.修改sentinel-dashboard源码
修改后的源码已上传github,文章只能截图部分代码,请务必参照github上面的源码,地址链接: https://github.com/side-wipe/sentinelSourceCode
- 首先下载源码
我下载的是1.6.3版本,地址链接:https://github.com/alibaba/Sentinel/releases/tag/1.6.3

然后使用idea导入工作空间。

主要修改的代码在sentinel-dashboard子项目中。
- 修改推送/拉取源代码
首先确定修改的位置在哪里。其实Alibaba在源码中已经留了缺口供持久化使用,也写了相应的例子,只不过都放在springboot项目的test文件夹下,如图:

图中分别对应sentinel利用apollo,nacos,zookeeper三种注册中心进行持久化的代码,因此只需要依葫芦画瓢即可;先将nacos文件夹复制到发布目录的rule文件夹下。

修改pom文件中的依赖权限,默认的是只在test时生效

修改NacosConfig文件中的nacosConfigService方法,这个方法定义了sentinel将规则发送到注册中心的地址,因为我将注册中心部署到linux环境。

关键代码如下 :
-
拉取配置
/** * @author sidewipe * @desc 向nacos注册中心拉取配置规则 */ @Component("flowRuleNacosProvider") public class FlowRuleNacosProvider implements DynamicRuleProvider<List<FlowRuleEntity>> { @Autowired private ConfigService configService; @Autowired private Converter<String, List<FlowRuleEntity>> converter; //格式转换 @Override public List<FlowRuleEntity> getRules(String appName) throws Exception { String rules = configService.getConfig(appName + NacosConfigUtil.FLOW_DATA_ID_POSTFIX, NacosConfigUtil.GROUP_ID, 3000); //获取配置 if (StringUtil.isEmpty(rules)) { return new ArrayList<>(); } return converter.convert(rules); //拉取的规则是一个json String,用转换器转化为List<FlowRuleEntity> } }
2.推送配置
/**
* @author sidewipe
* @desc 推送配置规则到nacos配置中心
*/
@Component("flowRuleNacosPublisher")
public class FlowRuleNacosPublisher implements DynamicRulePublisher<List<FlowRuleEntity>> {
@Autowired
private ConfigService configService;
@Autowired
private Converter<List<FlowRuleEntity>, String> converter; //转换器,将规则转换为json String类型方便推送到nacos配置中心
@Override
public void publish(String app, List<FlowRuleEntity> rules) throws Exception {
AssertUtil.notEmpty(app, "app name cannot be empty");
if (rules == null) {
return;
}
configService.publishConfig(app + NacosConfigUtil.FLOW_DATA_ID_POSTFIX,
NacosConfigUtil.GROUP_ID, converter.convert(rules)); 推送配置
}
}
至此,推送和拉取部分的代码就改的差不多了,其实就是把本是放在test文件夹中的几个文件复制出来,然后改一下注册中心地址就可以了,没有什么需要改的东西。但是这些代码需要在controller层调用,这样才能将sentinel的规则推送到配置中心,接下来就要去controller包中改代码。
- 修改controller
首先看一张图:

图中标识的各种限流的controller,需要使用上面我们写的推送/拉取方式,因此都需要修改,这里以修改FlowControllerV1.class为例。
1.注入上一步新建的两个工具类,取代sentinelApiClient:

2.重新写一个publishRules()推送规则方法

3.然后将所有调用原本publishRules()的地方改为调用新的方法,举例如下:

4.修改拉取规则的方法,改为从nacos配置中心拉取

修改完成!
2.sentinel-pro工程修改
修改自己的springcloud工程,工程链接:https://github.com/side-wipe/sentinel-pro
只需要修改yml配置文件,为sentinel添加数据源,数据源就是nacos注册中心的地址,这样就使得项目会去nacos注册中心拉取sentinel配置规则,修改如图:

3.测试
修改完成后,可以在本地启动springboot项目进行测试;我在测试完之后,将sentinel-dashboard源码打成jar包(sentinel-dashboard.jar),重新部署在linux中,上面图示的配置地址都是我的linux服务器地址。
上传到linux服务器,输入
nohup java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8888 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar &
启动后,启动sentinel-pro工程的订单中心(order-center)和产品中心(product-center),和上一篇博客步骤一致;接着,在sentinel-dashboard添加限流规则:

然后去nacos配置中心会发现一个新的配置文件,点击详情,可以看到我们配置的阈值参数:

此时,就表示,流控规则已经推送到配置中心了;连续访问页面http://localhost:8082/selectOrderInfoById/1发现被限流了;并且重启服务,限流规则也不会消失,完成任务。
4.补充说明
对限流,热点参数,降级等都是一样的修改方式,本文叙述只是拿限流举例;我在修改源码时,也同时修改了其他的几种限流降级等策略,并对拉取和推送方法进行了封装,具体完整版参考我的github: https://github.com/side-wipe/sentinelSourceCode