阿里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,等你哦!

微信掃碼加入猿天地知識星球

猿天地

相關文章
相關標籤/搜索