阿里Sentinel控制台源码修改-对接Apollo规则持久化

改造背景

前面咱们讲解了如何对接Apollo来持久化限流的规则,对接后能够直接经过Apollo的后台进行规则的修改,推送到各个客户端实时生效。api

但还有一个问题就是Sentinel控制台没有对接Apollo,Sentinel控制台原本就能够修改限流的规则,目前存在的状况就是经过Sentinel控制台修改的配置没法更新到Apollo中,因此今天咱们的主题是改造Sentinel控制台源码,对接Apollo。微信

配置变动模式

最原始的模式以下图:app

Dashboard的推送规则方式是经过 API 将规则推送至客户端并直接更新到内存中,这种作法的好处是简单,无依赖;坏处是应用重启规则就会消失,仅用于简单测试,不能用于生产环境。ide

咱们在生产环境中须要用Push模式来进行,对于 push 模式的数据源,如远程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操做不该由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。所以推送规则正确作法应该是 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel,而不是经 Sentinel 数据源推送至配置中心。这样的流程就很是清晰了:工具

改造步骤

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

  • DynamicRuleProvider<T>: 拉取规则
  • DynamicRulePublisher<T>: 推送规则

咱们只须要实现上面的两个规则便可实现咱们想要的效果,官方对于Nacos 和 Apollo 的推送和拉取规则已经有实现好了的代码,在Dashboard源码的test目录下,咱们本身改造下就能够了。开发工具

首先咱们须要把源代码拉到本地,导入开发工具中,找到下面的Apollo的代码:测试

这部分代码是在test包下,咱们须要复制到main包下才行:
ui

复制过去后会发现一个问题,全部Apollo相关的import都报错,须要改下pom.xml中的配置,把scope注释掉:spa

<!-- for Apollo rule publisher sample -->
  <dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-openapi</artifactId>
        <version>1.2.0</version>
        <!--<scope>test</scope>-->
  </dependency>

ApolloConfig中须要修改的有PortalUrl和token:

@Bean
 public ApolloOpenApiClient apolloOpenApiClient() {
     ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder()
            .withPortalUrl("http://localhost:10034")
            .withToken("token")
            .build();
     return client;

 }

token的生成须要去Apollo的Portal中进行生成

建立应用信息,生成token,绑定appid

FlowRuleApolloProvider和FlowRuleApolloPublisher须要把Apollo的appId,env,命名空间等改为你本身想用的才行。这边就不贴代码了。

改造完以后,咱们须要让控制器使用这两个新的规则,修改FlowControllerV2的@Qualifier的值,注入对应的规则对象

@Autowired
@Qualifier("flowRuleApolloProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
    
@Autowired
@Qualifier("flowRuleApolloPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;

这样改完其实还没效果,由于页面上用的是FlowControllerV1的代码,你能够直接在访问uri后面加上v2来访问,但这不是很好,最好是改下页面的代码,让菜单直接跳转到新的页面去,找到下面的代码:

改为下面的样子:

<li ui-sref-active="active">
       <a ui-sref="dashboard.flow({app: entry.app})">
       <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则</a>
</li>

默认用的是dashboard.flowV1,这个代码能够在app.js中找到:

改完以后你就能够从新将Dashboard打包啦,这样在Dashboard中修改规则的时候就会直接修改Apollo中的配置,Apollo再推送给客户端。

欢迎加入个人知识星球,一块儿交流技术,免费学习猿天地的课程(http://cxytiandi.com/course

PS:目前星球中正在星主的带领下组队学习Sentinel,等你哦!

微信扫码加入猿天地知识星球

猿天地

相关文章
相关标签/搜索