阿里Sentinel控制臺源碼修改-對接Apollo規則持久化

改造背景

前面我們講解了如何對接Apollo來持久化限流的規則,對接后可以直接通過Apollo的后臺進行規則的修改,推送到各個客戶端實時生效。

但還有一個問題就是Sentinel控制臺沒有對接Apollo,Sentinel控制臺本來就可以修改限流的規則,目前存在的情況就是通過Sentinel控制臺修改的配置無法更新到Apollo中,所以今天我們的主題是改造Sentinel控制臺源碼,對接Apollo。

配置變更模式

最原始的模式如下圖:

1240

Dashboard的推送規則方式是通過 API 將規則推送至客戶端并直接更新到內存中,這種做法的好處是簡單,無依賴;壞處是應用重啟規則就會消失,僅用于簡單測試,不能用于生產環境。

我們在生產環境中需要用Push模式來進行,對于 push 模式的數據源,如遠程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不應由 Sentinel 客戶端進行,而應該經控制臺統一進行管理,直接進行推送,數據源僅負責獲取配置中心推送的配置并更新到本地。因此推送規則正確做法應該是 配置中心控制臺/Sentinel 控制臺 → 配置中心 → Sentinel 數據源 → Sentinel,而不是經 Sentinel 數據源推送至配置中心。這樣的流程就非常清晰了:

1240

改造步驟

從 Sentinel 1.4.0 開始,我們抽取出了接口用于向遠程配置中心推送規則以及拉取規則:

  • DynamicRuleProvider: 拉取規則
  • DynamicRulePublisher: 推送規則

我們只需要實現上面的兩個規則即可實現我們想要的效果,官方對于Nacos 和 Apollo 的推送和拉取規則已經有實現好了的代碼,在Dashboard源碼的test目錄下,我們自己改造下就可以了。

首先我們需要把源代碼拉到本地,導入開發工具中,找到下面的Apollo的代碼:

1240

這部分代碼是在test包下,我們需要復制到main包下才行:
1240

復制過去后會發現一個問題,所有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中進行生成

1240

創建應用信息,生成token,綁定appid

1240

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來訪問,但這不是很好,最好是改下頁面的代碼,讓菜單直接跳轉到新的頁面去,找到下面的代碼:
1240

改成下面的樣子:

<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中找到:

1240

改完之后你就可以重新將Dashboard打包啦,這樣在Dashboard中修改規則的時候就會直接修改Apollo中的配置,Apollo再推送給客戶端。

歡迎加入我的知識星球,一起交流技術,免費學習猿天地的課程(http://cxytiandi.com/course)

PS:目前星球中正在星主的帶領下組隊學習Sentinel,等你哦!

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

猿天地

轉載于:https://www.cnblogs.com/yinjihuan/p/10708862.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248134.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248134.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248134.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第八節:EF Core連接MySql和Sqlite數據庫

。。。 轉載于:https://www.cnblogs.com/yaopengfei/p/11507557.html

Flask--WebSocket

flask websocket websocket原理 Socket&#xff1a; FTP - 文件服務 Django Flask Http - TCP: 1.一次請求 一次響應 斷開 2.客戶端永遠處于主動狀態 3.服務器永遠處于被動狀態 4.Http無狀態 - 在服務器不保存客戶端的信息 5.服務器無法主動找到客戶端 1.輪詢 客戶端向服務器…

jQuery第一天

課程回顧&#xff1a; ? 正則&#xff1a;匹配字符組合模式; ? 創建&#xff1a;var reg1 new RegExp(/abc/); var reg2 /abc/; ? 測試&#xff1a;reg1.test(‘abc’); ? 特殊字符&#xff1a;元字符 ? 邊界符&#xff1a;^&#xff0c;$ ? 字符類&#xff1a;[…

Python學習(一)

一、版本&#xff1a; Python2.X /Python3.x 官方宣布2020 年 1 月 1 日&#xff0c; 停止 Python 2 的更新。 Python3.x不兼容Python2.x  二、安裝&#xff08;以mac 為例&#xff09; MAC 系統一般都自帶有 Python2.x版本 的環境&#xff0c;你也可以在鏈接 https://www.py…

jQuery—淘寶精品服飾案例

<body><div class"wrapper"><ul id"left"><li><a href"#">女靴</a></li><li><a href"#">雪地靴</a></li><li><a href"#">冬裙</a>&l…

Python機器學習實踐:決策樹判別汽車金融違約用戶

文章發布于公號【數智物語】 &#xff08;ID&#xff1a;decision_engine&#xff09;&#xff0c;關注公號不錯過每一篇干貨。 轉自 | 法納斯特&#xff08;公眾號ID:walker398&#xff09; 作者 | 小F 決策樹呈樹形結構&#xff0c;是一種基本的回歸和分類方法。 決策樹模型的…

Python學習(二)語言基礎

一、變量與類型 在程序設計中&#xff0c;變量是一種存儲數據的載體 整型&#xff1a;Python中可以處理任意大小的整數浮點型&#xff1a;浮點數也就是小數字符串型&#xff1a;字符串是以單引號或雙引號括起來的任意文本布爾型&#xff1a;布爾值只有True、False兩種值&#x…

jQuery—tab欄切換

<div class"tab"><div class"tab_list"><ul><li class"current">商品介紹</li><li>規格與包裝</li><li>售后保障</li><li>商品評價&#xff08;50000&#xff09;</li><l…

MongoDB分組查詢,聚合查詢,以及復雜查詢

準備數據 from pymongo import MongoClient import datetimeclientMongoClient(mongodb://localhost:27017) tableclient[db1][emp]l[ (張飛,male,18,20170301,,7300.33,401,1), #以下是教學部 (張云,male,78,20150302,teacher,1000000.31,401,1), (劉備,male,81,20130305,teac…

Python學習(三)基礎

一、函數與模塊 定義函數&#xff1a; 函數代碼塊以 def 關鍵詞開頭&#xff0c;后接函數標識符名稱和圓括號 ()。任何傳入參數和自變量必須放在圓括號中間&#xff0c;圓括號之間可以用于定義參數。函數的第一行語句可以選擇性地使用文檔字符串—用于存放函數說明。函數內容以…

操作系統原理之I/O設備管理(第六章上半部分)

一、I/O系統的組成 I/O系統不僅包括各種I/O設備&#xff0c;還包括與設備相連的設備控制器&#xff0c;有些系統還配備了專?? 于輸?/輸出控制的專?計算機&#xff0c;即通道。此外&#xff0c;I/O系統要通過總線與CPU、內存相連。 I/O系統的結構&#xff1a; I/O設備的分類…

js控制a標簽點擊事件 觸發下載

問題背景&#xff0c;動態獲取data把url賦值到a標簽的url中&#xff0c;讓a標簽自動下載 首先想到的應該是$(xxx).click(), 查資料明白&#xff1a;js中的$(...).click()事件只能觸發綁定的onClick方法&#xff0c;不能跳轉到href。 第二種方法&#xff1a;獲取到url之后locat…

操作系統原理之I/O設備管理(第六章下半部分)

五、I/O軟件原理 輸入輸出軟件的總體目標是將軟件組織成一種層次結構 低層軟件用來屏蔽硬件的具體細節高層軟件則主要是為用戶提供一個簡潔、規范的界面設備管理的4個層次&#xff1a; 用戶層軟件 -》向系統發出I/O請求&#xff0c;顯示I/O操作的結果&#xff0c;提供?戶與設備…

jQuery第二天

課程回顧&#xff1a; ? jQuery&#xff1a;JavaScript庫 ? 入口函數&#xff1a;$(function () {}); ? jQuery&#xff1a;jQuery對象&#xff0c;DOM對象 ? jQuery轉成DOM&#xff1a;$(‘元素’)[索引值] ? DOM轉成jQuery&#xff1a;$(DOM對象); ? 篩選方法&am…

切換Debug/Release編譯模式和Archive的作用

&#xfeff;在學這個之前&#xff0c;以為很難&#xff0c;也起不到什么作用&#xff0c;但是等真正運用到工程里面&#xff0c;才發現&#xff0c;這個能幫你省下很多工作量。 1&#xff0c;Debug和Release版本區別&#xff1f; 進行iOS開發&#xff0c;在Xcode調試程序時&am…

Linux 防火墻:Netfilter iptables

一、Netfilter 簡介 (1) Netfilter 是 Linux 內置的一種防火墻機制&#xff0c;我們一般也稱之為數據包過濾機制&#xff0c;而 iptables 只是操作 netfilter 的一個命令行工具(2) Netfilter 是 Linux CentOS 6 內置的防火墻機制&#xff0c;Firewall 是 Linux CentOS 7 內置的…

無法加載 DLL“SQLite.Interop.DLL”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。...

無法加載 DLL“SQLite.Interop.DLL”: 找不到指定的模塊。 (異常來自 HRESULT:0x8007007E)。 在項目里添加 現有項 把SQLite.Interop.DLL文件添加進來&#xff0c;然后點擊屬性 修改一個屬性 把 屬性 復制到輸出目錄 改為 始終復制 然后打開你的項目屬性 進入生成的 頁面&a…

jQuery第三天

課程回顧&#xff1a; ? 動畫效果&#xff1a;基本動畫&#xff0c;滑動動畫&#xff0c;淡入淡出&#xff0c;自定義動畫效果(animate) ? 事件切換&#xff1a;hover(over&#xff0c;out); ? 停止動畫&#xff1a;stop ? 操作屬性&#xff1a;prop&#xff08;固有屬…

C語言程序設計II—第八周教學

第八周教學總結&#xff08;15/4-21/4&#xff09; 教學內容 本周的教學內容為&#xff1a;   8.4 電碼加密 知識點&#xff1a;指針與字符串&#xff0c;重難點&#xff1a;字符指針與字符串的關聯和區別&#xff1b;   8.5 任意個整數求和 知識點&#xff1a;動態內存分配…

AFNetworking 對數據進行https ssl加密

參考來源&#xff1a;http://www.cnblogs.com/jys509/p/5001566.html 現在在工作中的工作需求&#xff1a;https請求驗證證書一般來講如果app用了web service , 我們需要防止數據嗅探來保證數據安全.通常的做法是用ssl來連接以防止數據抓包和嗅探其實這么做的話還是不夠的 。…