前言
之前虽然也一直在使用sentinel实现限流熔断功能,但却没有好好整理之前看的源码与资料,今天有时间将之前自己整理过的资料写成一篇博文,或者是是一篇关于Sentinel(基于目前最近版本1.8,如果没有特殊说明,都指最新1.8版本)持久化Nacos的指南,因为我发现网上的一些博文虽然有参考价值但却没有好好完善好细节,一知半解,或者版本比较老不具备参考价值。比如说为什么要做这一步,这一步需要完成什么具体工作等等。所以尽我所能,详细介绍下手把手整合Sentinel与Nacos,实现SentinelDashboard控制台到Nacos配置中心的流控规则通信并下发规则到具体应用。
前提是要对SentinelDashboard跟Nacos有一定的了解,具体可以查看官方wiki,参考资料也是来源于此,再加上对sentinel-dashboard源码参考改造。
一、准备工作
1、SentinelDashboard持久化
我们首先需要知道:在SentinelDashboard中配置规则之后重启应用就会丢失,所以实际生产环境中需要配置规则的持久化实现,Sentinel提供多种不同的数据源来持久化规则配置,包括file,redis、nacos、zk。
这就需要涉及到SentinelDashboard的规则管理及推送功能:集中管理和推送规则。sentinel-core提供API和扩展接口来接收信息。开发者需要根据自己的环境,选取一个可靠的推送规则方式;同时,规则最好在控制台中集中管理。
而规则管理推送主要有以下三种模式:
(以上部分文字跟截图来源自官方wiki)
很明显,我们需要的是第三种Push模式,即SentinelDashboard统一管理配置(有良好的UI界面,为什么不能统一管理呢,明显比Nacos编写json要专业),然后将规则统一推送到Nacos并持久化(生成配置文件),最后客户端监听Nacos(这一部了解使用过Nacos的话应该很熟,采用ConfigService.getConfg()方法获取配置文件),下发配置生成Rule。如下图(虚线部分不推荐):
换句话说就是实现SentinelDashboard与Nacos之间的相互通信:
SentinelDashboard界面配置流控规则---发布/推送---Nacos生成配置文件并持久化;通过Nacos配置文件修改流控规则---拉取---SentinelDashboard界面显示最新的流控规则。
需要注意的是:
在Nacos控制台上修改流控制,虽然可以同步到SentinelDashboard,但是Nacos此时应该作为一个流控规则的持久化平台,所以正常操作过程应该是开发者在SentinelDashboard上修改流控规则后同步到Nacos,遗憾的是目前SentinelDashboard不支持该功能。试想下,如果公司没有统一在SentinelDashboard或Nacos中二选一进行配置,而是一会在SentinelDashboard配置,一会在Nacos配置。那么就会出现很严重的问题(流控规则达不到预期,配置数据不一致),所以推荐使用SentinelDashboard统一界面进行配置管理流控规则正因为SentinelDashboard当前版本(截至目前为止是1.8.1-SNAPSHOT)暂不支持,但是可以通过改造部分源码实现此功能,具体请看下面介绍。
2、SentinelDashboard流控规则源码改造须知
首先通过git拉取下载源码,导入idea工程,解析maven后观察sentinel-dashboard模块目录结构
gitclone
从Sentinel1.4.0开始,我们抽取出了接口用于向远程配置中心推送规则以及拉取规则:DynamicRuleProviderT:拉取规则DynamicRulePublisherT:推送规则
以Nacos为例,若希望使用Nacos作为动态规则配置中心,用户可以提取出相关的类,然后只需在FlowControllerV2中指定对应的bean即可开启Nacos适配
所以根据
iclass=glyphiconglyphicon-filter/inbsp;nbsp;流控规则/a/li
对应的JS请求如下,可以看到请求就是V1版本的Controller,那么之后的改造需要重新对应V2版本的Controller
.state(dashboard.flowV1,{templateUrl:app/views/flow_v1.html,url:/flow/:app,controller:FlowControllerV1,resolve:{loadMyFiles:[$ocLazyLoad,function($ocLazyLoad){return$ocLazyLoad.load({name:sentinelDashboardApp,files:[app/scripts/controllers/flow_v1.js,]});}]}})
(3)SentinelDashboard缺少Nacos配置
在源码中虽然官方提供了test示例(即test目录)下关于Nacos等持久化示例,但是具体的实现还需要一些细节,比如在SentinelDashboard配置Nacos的serverAddr、namespace、groupId,并且通过Nacos获取配置文件获取服务列表等。
例如:NacosConfig中ConfigFactory.createConfigService(localhost)并没有实现创建具体的nacosconfigservice,而是默认localhost
ConfigurationpublicclassNacosConfig{BeanpublicConverterListFlowRuleEntity,StringflowRuleEntityEncoder(){returnJSON::toJSONString;}BeanpublicConverterString,ListFlowRuleEntityflowRuleEntityDecoder(){returns-JSON.parseArray(s,FlowRuleEntity.class);}BeanpublicConfigServicenacosConfigService()throwsException{returnConfigFactory.createConfigService(localhost);}}application.properties文件中也没有Nacos的相关配置
#springsettingsspring.
-Dcsp.sentinel.dashboard.server=localhost:控制台的地址,指定控制台后客户端会自动向该地址发送心跳包。
-Dproject.name=sentinel-dashboard指定Sentinel控制台程序的名称
-Dcsp.sentinel.api.port=可选项,客户端提供给Dashboard访问或者查看Sentinel的运行访问的参数,默认
其它启动配置项,具体查看官方wiki
(2)登录sentineldashboard配置流控规则
1)输入localhost:访问sentineldashboard控制台(登录用户/密码默认sentinel)
2)选择sentinel菜单-流控规则-新增流控规则-输入配置-新增
如图所示,我们选择QPS阈值类型,并且count为2,流控模式为默认的直接模式,流控效果快速失败(这些配置具体含义参看
注意:一开始可能会空白页面,这可能是由于机器时间机制导致的,此时可能还未发送心跳,加之sentinel控制台默认的又是懒加载模式(可去除该设置),所以最好是我们访问sentinel客户端的/hello接口然后刷新页面,即访问: