Spring Cloud Alibaba基础教程:Sentinel Dashboard同步Apollo存储规则

本文介绍了如何改造Sentinel Dashboard,使其能将限流规则的修改同步到Apollo配置中心,解决仅能通过Apollo界面修改限流规则的不足。通过实现DynamicRuleProvider和DynamicRulePublisher接口,实现了Sentinel与Apollo之间的规则读写同步。
摘要由CSDN通过智能技术生成

点击蓝色“程序猿DD”关注我哟

加个“星标”,不忘签到哦


640?wx_fmt=jpeg




在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中。同时,在文末的思考中,我都指出了这两套整合方案都存在一个不足之处:不论采用什么配置中心,限流规则都只能通过Nacos界面或Apollo界面来完成修改才能得到持久化存储,而在Sentinel Dashboard中修改限流规则虽然可以生效,但是不会被持久化到配置中心。而在这两个配置中心里存储的数据是一个Json格式,当存储的规则越来越多,对该Json配置的可读性与可维护性会变的越来越差。所以,下面我们就来继续探讨这个不足之处,并给出相应的解决方案。本文以Apollo存储为例,下一篇介绍Nacos的改在示例。

问题分析

在实际操作之前,我们先通过下图了解一下之前我们所实现的限流规则持久化方案的配置数据流向图:

640?wx_fmt=png

  • 蓝色箭头代表了限流规则由 配置中心发起修改的更新路径

  • 橙色箭头代表了限流规则由 SentinelDashboard发起修改的更新路径

从图中可以很明显的看到, SentinelDashboard与业务服务之间本身是可以互通获取最新限流规则的,这在没有整合配置中心来存储限流规则的时候就已经存在这样的机制。最主要的区别是:配置中心的修改都可以实时的刷新到业务服务,从而被 SentinelDashboard读取到,但是对于这些规则的更新到达各个业务服务之后,并没有一个机制去同步到配置中心,作为配置中心的客户端也不会提供这样的逆向更新方法。

改造方案

关于如何改造,现来解读一下官方文档中关于这部分的说明:

要通过 Sentinel 控制台配置集群流控规则,需要对控制台进行改造。我们提供了相应的接口进行适配。

从 Sentinel 1.4.0 开始,我们抽取出了接口用于向远程配置中心推送规则以及拉取规则:

  • DynamicRuleProvider: 拉取规则

  • DynamicRulePublisher: 推送规则

对于集群限流的场景,由于每个集群限流规则都需要唯一的 flowId,因此我们建议所有的规则配置都通过动态规则源进行管理,并在统一的地方生成集群限流规则。

我们提供了新版的流控规则页面,可以针对应用维度推送规则,对于集群限流规则可以自动生成 flowId。用户只需实现 DynamicRuleProvider 和 DynamicRulePublisher 接口,即可实现应用维度推送(URL: /v2/flow)。

这段内容什么意思呢?简单的说就是 SentinelDashboard通过 DynamicRuleProviderDynamicRulePublisher两个接口来获取和更新应用的动态规则。默认情况下,就如上一节中 SentinelDashboard与各业务服务之间的两个箭头,一个接口负责获取规则,一个接口负责更新规则。

所以,只需要通过这两个接口,实现对配置中心中存储规则的读写,就能实现 SentinelDashboard中修改规则与配置中心存储同步的效果。

具体的配置数据流向图如下:

640?wx_fmt=png

其中,绿色箭头为公共公共部分,即:不论从培中心修改,还是从 SentinelDashboard修改都会触发的操作。这样的话,从上图的两处修改起点看,所有涉及的部分都能获取到一致的限流规则了。

代码实现

下面继续说说具体的代码实现,这里参考了 SentinelDashboard源码中关于Apollo实现的测试用例。但是由于考虑到与Spring Cloud Alibaba的结合使用,略作修改。

第一步:修改 pom.xml中的Apollo OpenAPi的依赖,将 <scope>test</scope>注释掉,这样才能在主程序中使用。

 
 
  1. <dependency>

  2. <groupId>com.ctrip.framework.apollo</groupId>

  3. <artifactId>apollo-openapi</artifactId>

  4. <version>1.2.0</version>

  5. <!--<scope>test</scope>-->

  6. </dependency>

第二步:找到 resources/app/scripts/directives/sidebar/sidebar.html中的这段代码:

 
 
  1. <li ui-sref-active="active">

  2. <a ui-sref="dashboard.flowV1({app: entry.app})">

  3. <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则

  4. </a>

  5. </li>

修改为:

 
 
  1. <li ui-sref-active="active">

  2. <a ui-sref="dashboard.flow({app: entry.app})">

  3. <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则

  4. </a>

  5. </li>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值