改造背景
前面我們講解了如何對接Apollo來持久化限流的規則,對接后可以直接通過Apollo的后臺進行規則的修改,推送到各個客戶端實時生效。
但還有一個問題就是Sentinel控制臺沒有對接Apollo,Sentinel控制臺本來就可以修改限流的規則,目前存在的情況就是通過Sentinel控制臺修改的配置無法更新到Apollo中,所以今天我們的主題是改造Sentinel控制臺源碼,對接Apollo。
配置變更模式
最原始的模式如下圖:
Dashboard的推送規則方式是通過 API 將規則推送至客戶端并直接更新到內存中,這種做法的好處是簡單,無依賴;壞處是應用重啟規則就會消失,僅用于簡單測試,不能用于生產環境。
我們在生產環境中需要用Push模式來進行,對于 push 模式的數據源,如遠程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不應由 Sentinel 客戶端進行,而應該經控制臺統一進行管理,直接進行推送,數據源僅負責獲取配置中心推送的配置并更新到本地。因此推送規則正確做法應該是 配置中心控制臺/Sentinel 控制臺 → 配置中心 → Sentinel 數據源 → Sentinel,而不是經 Sentinel 數據源推送至配置中心。這樣的流程就非常清晰了:
改造步驟
從 Sentinel 1.4.0 開始,我們抽取出了接口用于向遠程配置中心推送規則以及拉取規則:
- DynamicRuleProvider: 拉取規則
- DynamicRulePublisher: 推送規則
我們只需要實現上面的兩個規則即可實現我們想要的效果,官方對于Nacos 和 Apollo 的推送和拉取規則已經有實現好了的代碼,在Dashboard源碼的test目錄下,我們自己改造下就可以了。
首先我們需要把源代碼拉到本地,導入開發工具中,找到下面的Apollo的代碼:
這部分代碼是在test包下,我們需要復制到main包下才行:
復制過去后會發現一個問題,所有Apollo相關的import都報錯,需要改下pom.xml中的配置,把scope注釋掉:
<!-- 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:
@Beanpublic 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> 流控規則</a>
</li>
默認用的是dashboard.flowV1,這個代碼可以在app.js中找到:
改完之后你就可以重新將Dashboard打包啦,這樣在Dashboard中修改規則的時候就會直接修改Apollo中的配置,Apollo再推送給客戶端。