SpringCloud之sentinel(二)

2020/06/15 SpringCloud

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环境。

 

关键代码如下 :

  1. 拉取配置

     /**
      * @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

Search

    我的微信

    闷骚的程序员

    Table of Contents