Spring?Cloud微服務(wù)架構(gòu)Sentinel數(shù)據(jù)雙向同步
Sentinel數(shù)據(jù)雙向同步
上面實現(xiàn)了Nacos單向同步配置規(guī)則到Sentinel,但是只是單向的,沒有實現(xiàn)Sentinel向Nacos同步規(guī)則配置;下面我們來實現(xiàn)Sentinel同步配置到Nacos,以及兩者的雙向數(shù)據(jù)同步結(jié)合使用。
我們回顧一下,首先Sentinel規(guī)則的存儲默認(rèn)是存儲在內(nèi)存的,應(yīng)用重啟之后規(guī)則會丟失。因此我們通過配置中心Nacos保存規(guī)則,然后通過定時拉取Nacos數(shù)據(jù)來獲取規(guī)則配置,可以做到動態(tài)實時的刷新規(guī)則。但是這種方式是單向的,并且有一定的限制,我們是否可以在Sentinel和Nacos這兩個中間件之間雙向同步數(shù)據(jù)呢?下面我們來實現(xiàn)Sentinel數(shù)據(jù)雙向同步。
前言
因為實現(xiàn)Sentinel-Nacos數(shù)據(jù)雙向同步,需要使用到推(Push)模式在兩邊相互推送數(shù)據(jù)。那么什么是Sentinel的拉模式和推模式呢?Sentinel的規(guī)則管理有哪些模型呢?下面我們一一來進(jìn)行解答:
什么是推模式和拉模式?
- 推模式:注冊中心統(tǒng)一推送,客戶端通過注冊監(jiān)聽器時刻監(jiān)聽變化
- 拉模式:客戶端主動向配置中心定時輪詢拉取配置
Sentinel的規(guī)則管理模型
Sentinel的規(guī)則管理,主要有以下三種模型:
首先原始模式下的Sentinel Dashboard配置的規(guī)則重啟應(yīng)用后就會丟失,這種方式肯定是有極大風(fēng)險的,生產(chǎn)環(huán)境不推薦使用。
其次,拉模式的確不會對Sentinel客戶端造成壓力,但是Sentinel客戶端多了以后會對Nacos注冊中心造成壓力,并且也無法保證實時性。拉模式的應(yīng)用場景一般是處理壓力小的一方向處理壓力大的一方獲取數(shù)據(jù),并且沒有太高的實時性要求,比如定時拉取日志數(shù)據(jù)。
我們可以使用推模式作為Sentinel客戶端的規(guī)則同步方式,通過監(jiān)聽器監(jiān)聽Nacos服務(wù)端口,來實現(xiàn)規(guī)則的實時更新。這就需要涉及到Sentinel Dashboard的規(guī)則管理及推送功能:集中管理和推送規(guī)則,sentinel-core
提供了 API 和擴展接口來接收和推送信息。并且這種方式,不用擔(dān)心Sentinel客戶端配置的規(guī)則錯誤會導(dǎo)致正確的配置丟失,因為Nacos有配置一鍵回滾機制,并且還有MySQL作為持久化手段。
總結(jié):生產(chǎn)環(huán)境建議使用 Push模式的數(shù)據(jù)同步中間件(比如Nacos),并且可以的話最好實現(xiàn)數(shù)據(jù)雙向同步。當(dāng)然還有文件同步的方式,但是無法保證實時性和動態(tài)性,因此只是作為一種備份手段。
了解了規(guī)則雙向同步的過程和原理,下面我們來實現(xiàn)Sentinel規(guī)則持久化到Nacos和規(guī)則數(shù)據(jù)雙向同步使用測試:
準(zhǔn)備工作
1. 版本選取
因為上面我們使用的是 Spring Cloud Alibaba 2021.0.1.0*
和 Spring Cloud 2021.0.1
,因此對應(yīng)Sentinel版本為Sentinel 1.8.3,下載的使用需要注意版本。
2. 下載Sentinel源碼
下載Sentinel對應(yīng)客戶端版本的 sentinel-dashboard
源碼
源碼地址如下,點擊Tags選擇版本為1.8.3,然后點擊下載ZIP壓縮包,下載地址如下:
https://github.com/alibaba/Sentinel/tree/1.8.3
3. 解壓并導(dǎo)入項目
將壓縮包解壓,用IDE工具打開sentinel-dashboard項目,由于是將Sentinel控制臺定義的規(guī)則持久化到Nacos,所以,只需要打開sentinel-dashboard項目即可:
然后將sentinel項目中的sentinel-dashboard子模塊項目,導(dǎo)入到IDE中即可:
我們導(dǎo)入sentinel整個項目,因為會需要下載很多用不到的依賴,比較耽誤時間。事實上,我們只需要導(dǎo)入我們需要改造的sentinel-dashboard子模塊就可以了。
完成了前面的準(zhǔn)備工作,下面我們可以正式開始改造源碼了:
改造Sentinel控制臺
為什么需要改造Sentinel控制臺源碼?
因為Sentinel源碼本身只支持Nacos同步配置到Sentinel,并不支持Sentinel同步配置到Nacos(阿里的AHAS倒是提供這個功能了,所以說阿里的開源只開一半,還需要社區(qū)提供源碼修改方案)。因此,我們需要改造Sentinel控制臺以支持Sentinel推送規(guī)則到Nacos。
我們可以通過Sentinel擴展接口中的DynamicRuleProvider和DynamicRulePublisher接口來實現(xiàn)自己的拉取者(Provider)和推送者(Publisher)接口邏輯。
源碼改造的過程
我們從Sentinel-Nacos規(guī)則雙向同步的底層原理出發(fā),從sentinel-dashboard源碼一步步進(jìn)行改造。這樣在更換版本也不會出現(xiàn)不適配的情況,并且從底層代碼一步步修改的方式比起直接用打包好的jar包的方式,即使出現(xiàn)了適配問題也能更好、更快的理解并分析出問題出現(xiàn)的原因,對于解決bug和修改任何版本的Sentinel源碼都是有幫助的。
主要分為下面三大部分進(jìn)行改造:
全局修改
- 全局依賴修改
- 全局配置修改
后端代碼修改
- 配置類修改
- 創(chuàng)建規(guī)則交互層(拉取與推送實現(xiàn)類)
- 規(guī)則控制層修改
前端代碼修改
- 前端頁面調(diào)整
- 前端接口調(diào)整
我們這里是Sentinel 1.8.3版本,基于理解原理和實踐的原因,下面我們針對 sentinel-dashboard
源碼進(jìn)行手動改造。
1. 全局修改
① 修改POM依賴
想要將 dashboard 的規(guī)則持久化到Nacos,需要在sentinel-dashboard子項目的pom.xml中添加一個依賴(源碼中已經(jīng)添加,不過只在測試環(huán)境下打包),將作用域擴大:
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <!--<scope>test</scope>--> </dependency>
② 修改properties配置文件
在resources目錄下,找到配置文件 application.properties
文件,在末尾添加一下配置:
# Nacos Configurations sentinel.nacos.serverAddr=localhost:8848 sentinel.nacos.namespace= sentinel.nacos.group-id=SENTINEL-GROUP
全部依賴和配置就改造完成了,下面進(jìn)行后端代碼和前端代碼的改造。
以上就是Spring Cloud微服務(wù)架構(gòu)Sentinel數(shù)據(jù)雙向同步的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud Sentinel數(shù)據(jù)雙向同步的資料請關(guān)注腳本之家其它相關(guān)文章!
- 在SpringBoot項目中使用Spring Cloud Sentinel實現(xiàn)流量控制
- SpringCloud?集成Sentinel的實戰(zhàn)教程
- Spring?Cloud?中使用?Sentinel?實現(xiàn)服務(wù)限流的兩種方式
- Spring?Cloud中Sentinel的兩種限流模式介紹
- springcloud3 Sentinel的搭建及案例操作方法
- Spring?Cloud?Alibaba微服務(wù)組件Sentinel實現(xiàn)熔斷限流
- Spring?Cloud?Gateway整合sentinel?實現(xiàn)流控熔斷的問題
- Java之SpringCloudAlibaba Sentinel組件案例講解
- Sentinel 斷路器在Spring Cloud使用詳解
相關(guān)文章
淺談Spring Boot 微服務(wù)項目的推薦部署方式
這篇文章主要介紹了淺談Spring Boot 微服務(wù)項目的推薦部署方式,具有一定參考價值,需要的朋友可以了解下。2017-09-09- Guava是Google發(fā)布的一個開源庫,主要提供了一些在Java開發(fā)中非常有用的工具類和API,不管是工作還是學(xué)習(xí)都是非常值得我們?nèi)ナ煜さ?,一起來看看?/div> 2023-03-03
SpringBoot 圖書管理系統(tǒng)(刪除、強制登錄、更新圖書)詳細(xì)代碼
在企業(yè)開發(fā)中,通常不采用delete語句進(jìn)行物理刪除,而是使用邏輯刪除,邏輯刪除通過修改標(biāo)識字段來表示數(shù)據(jù)已被刪除,方便數(shù)據(jù)恢復(fù),本文給大家介紹SpringBoot 圖書管理系統(tǒng)實例代碼,感興趣的朋友跟隨小編一起看看吧2024-09-09Java實現(xiàn)常用緩存淘汰算法:FIFO、LRU、LFU
在高并發(fā)、高性能的質(zhì)量要求不斷提高時,我們首先會想到的就是利用緩存予以應(yīng)對。而常用的幾個緩存淘汰算法有:FIFO、LRU和LFU,本文將為大家詳細(xì)介紹一下這三個算法并用java實現(xiàn),感興趣的可以跟隨小編一起學(xué)習(xí)一下2021-12-12Postman實現(xiàn)傳List<String>集合
這篇文章主要介紹了Postman實現(xiàn)傳List<String>集合方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08mybatis注解之@Mapper和@MapperScan的使用
這篇文章主要介紹了mybatis注解之@Mapper和@MapperScan的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10java.exe和javaw.exe的區(qū)別及使用方法
這篇文章主要介紹了java.exe和javaw.exe的區(qū)別及使用方法,需要的朋友可以參考下2014-04-04最新評論