摘要:改造背景前面我們講解了如何對(duì)接來持久化限流的規(guī)則,對(duì)接后可以直接通過的后臺(tái)進(jìn)行規(guī)則的修改,推送到各個(gè)客戶端實(shí)時(shí)生效。因此推送規(guī)則正確做法應(yīng)該是配置中心控制臺(tái)控制臺(tái)配置中心數(shù)據(jù)源,而不是經(jīng)數(shù)據(jù)源推送至配置中心。
改造背景
前面我們講解了如何對(duì)接Apollo來持久化限流的規(guī)則,對(duì)接后可以直接通過Apollo的后臺(tái)進(jìn)行規(guī)則的修改,推送到各個(gè)客戶端實(shí)時(shí)生效。
但還有一個(gè)問題就是Sentinel控制臺(tái)沒有對(duì)接Apollo,Sentinel控制臺(tái)本來就可以修改限流的規(guī)則,目前存在的情況就是通過Sentinel控制臺(tái)修改的配置無法更新到Apollo中,所以今天我們的主題是改造Sentinel控制臺(tái)源碼,對(duì)接Apollo。
配置變更模式最原始的模式如下圖:
Dashboard的推送規(guī)則方式是通過 API 將規(guī)則推送至客戶端并直接更新到內(nèi)存中,這種做法的好處是簡單,無依賴;壞處是應(yīng)用重啟規(guī)則就會(huì)消失,僅用于簡單測試,不能用于生產(chǎn)環(huán)境。
我們在生產(chǎn)環(huán)境中需要用Push模式來進(jìn)行,對(duì)于 push 模式的數(shù)據(jù)源,如遠(yuǎn)程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不應(yīng)由 Sentinel 客戶端進(jìn)行,而應(yīng)該經(jīng)控制臺(tái)統(tǒng)一進(jìn)行管理,直接進(jìn)行推送,數(shù)據(jù)源僅負(fù)責(zé)獲取配置中心推送的配置并更新到本地。因此推送規(guī)則正確做法應(yīng)該是 配置中心控制臺(tái)/Sentinel 控制臺(tái) → 配置中心 → Sentinel 數(shù)據(jù)源 → Sentinel,而不是經(jīng) Sentinel 數(shù)據(jù)源推送至配置中心。這樣的流程就非常清晰了:
改造步驟從 Sentinel 1.4.0 開始,我們抽取出了接口用于向遠(yuǎn)程配置中心推送規(guī)則以及拉取規(guī)則:
DynamicRuleProvider
DynamicRulePublisher
我們只需要實(shí)現(xiàn)上面的兩個(gè)規(guī)則即可實(shí)現(xiàn)我們想要的效果,官方對(duì)于Nacos 和 Apollo 的推送和拉取規(guī)則已經(jīng)有實(shí)現(xiàn)好了的代碼,在Dashboard源碼的test目錄下,我們自己改造下就可以了。
首先我們需要把源代碼拉到本地,導(dǎo)入開發(fā)工具中,找到下面的Apollo的代碼:
這部分代碼是在test包下,我們需要復(fù)制到main包下才行:
復(fù)制過去后會(huì)發(fā)現(xiàn)一個(gè)問題,所有Apollo相關(guān)的import都報(bào)錯(cuò),需要改下pom.xml中的配置,把scope注釋掉:
com.ctrip.framework.apollo apollo-openapi 1.2.0
ApolloConfig中需要修改的有PortalUrl和token:
@Bean public ApolloOpenApiClient apolloOpenApiClient() { ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder() .withPortalUrl("http://localhost:10034") .withToken("token") .build(); return client; }
token的生成需要去Apollo的Portal中進(jìn)行生成
創(chuàng)建應(yīng)用信息,生成token,綁定appid
FlowRuleApolloProvider和FlowRuleApolloPublisher需要把Apollo的appId,env,命名空間等改成你自己想用的才行。這邊就不貼代碼了。
改造完之后,我們需要讓控制器使用這兩個(gè)新的規(guī)則,修改FlowControllerV2的@Qualifier的值,注入對(duì)應(yīng)的規(guī)則對(duì)象
@Autowired @Qualifier("flowRuleApolloProvider") private DynamicRuleProvider> ruleProvider; @Autowired @Qualifier("flowRuleApolloPublisher") private DynamicRulePublisher
> rulePublisher;
這樣改完其實(shí)還沒效果,因?yàn)轫撁嫔嫌玫氖荈lowControllerV1的代碼,你可以直接在訪問uri后面加上v2來訪問,但這不是很好,最好是改下頁面的代碼,讓菜單直接跳轉(zhuǎn)到新的頁面去,找到下面的代碼:
改成下面的樣子:
默認(rèn)用的是dashboard.flowV1,這個(gè)代碼可以在app.js中找到:
改完之后你就可以重新將Dashboard打包啦,這樣在Dashboard中修改規(guī)則的時(shí)候就會(huì)直接修改Apollo中的配置,Apollo再推送給客戶端。
歡迎加入我的知識(shí)星球,一起交流技術(shù),免費(fèi)學(xué)習(xí)猿天地的課程(http://cxytiandi.com/course) PS:目前星球中正在星主的帶領(lǐng)下組隊(duì)學(xué)習(xí)Sentinel,等你哦!文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77613.html
摘要:前面我們都是直接通過集成的依賴,通過編碼的方式配置規(guī)則等。對(duì)于集成到中阿里已經(jīng)有了一套開源框架,就是用于將一系列的框架成功的整合到中。但這也是在學(xué)習(xí)過程中遇到的一個(gè)問題,還是得通過調(diào)試源碼的方式去發(fā)現(xiàn)問題的原因。 前面我們都是直接通過集成sentinel的依賴,通過編碼的方式配置規(guī)則等。對(duì)于集成到Spring Cloud中阿里已經(jīng)有了一套開源框架spring-cloud-alibaba...
摘要:這樣做的方式是簡單,缺點(diǎn)是無法及時(shí)獲取變更推模式規(guī)則中心統(tǒng)一推送,客戶端通過注冊監(jiān)聽器的方式時(shí)刻監(jiān)聽變化,比如使用等配置中心。 在前面的學(xué)習(xí)過程中,Sentinel 的規(guī)則,也就是我們之前定義的限流規(guī)則,是通過代碼的方式定義好的。這是初始化時(shí)需要做的事情,Sentinel 提供了基于API的方式修改規(guī)則: FlowRuleManager.loadRules(List rules); /...
摘要:在之前的兩篇教程中我們分別介紹了如何將的限流規(guī)則存儲(chǔ)到和中。本文以存儲(chǔ)為例,下一篇介紹的改在示例。但是由于考慮到與的結(jié)合使用,略作修改。 在之前的兩篇教程中我們分別介紹了如何將Sentinel的限流規(guī)則存儲(chǔ)到Nacos和Apollo中。同時(shí),在文末的思考中,我都指出了這兩套整合方案都存在一個(gè)不足之處:不論采用什么配置中心,限流規(guī)則都只能通過Nacos界面或Apollo界面來完成修改才能...
摘要:上一篇我們介紹了如何通過的配置功能來存儲(chǔ)限流規(guī)則。第六步啟動(dòng)應(yīng)用。深入思考在使用存儲(chǔ)規(guī)則配置的時(shí)候與存儲(chǔ)一樣,對(duì)于控制臺(tái)這些數(shù)據(jù)是只讀的,也就是說控制臺(tái)中修改規(guī)則僅存在于服務(wù)的內(nèi)存中,不會(huì)修改中的配置值,重啟后恢復(fù)原來的值。 上一篇我們介紹了如何通過Nacos的配置功能來存儲(chǔ)限流規(guī)則。Apollo是國內(nèi)用戶非常多的配置中心,所以,今天我們繼續(xù)說說Spring Cloud Alibaba...
摘要:所以,在整合了做規(guī)則存儲(chǔ)之后,需要知道在下面兩個(gè)地方修改存在不同的效果控制臺(tái)中修改規(guī)則僅存在于服務(wù)的內(nèi)存中,不會(huì)修改中的配置值,重啟后恢復(fù)原來的值。控制臺(tái)中修改規(guī)則服務(wù)的內(nèi)存中規(guī)則會(huì)更新,中持久化規(guī)則也會(huì)更新,重啟后依然保持。 通過上一篇《使用Sentinel實(shí)現(xiàn)接口限流》的介紹,相信大家對(duì)Sentinel已經(jīng)有了初步的認(rèn)識(shí)。在Spring Cloud Alibaba的整合封裝之下,接...
閱讀 1666·2021-09-28 09:35
閱讀 1137·2019-08-30 15:54
閱讀 1664·2019-08-30 15:44
閱讀 3369·2019-08-30 14:09
閱讀 498·2019-08-29 14:05
閱讀 2667·2019-08-28 17:53
閱讀 1988·2019-08-26 13:41
閱讀 1719·2019-08-26 13:26