深度解析微服務(wù)高并發(fā)動態(tài)數(shù)據(jù)源:使用Redis動態(tài)數(shù)據(jù)源
動態(tài)數(shù)據(jù)源
Sentinel為每種規(guī)則提供一個規(guī)則管理器,而規(guī)則管理器管理的規(guī)則只存在于內(nèi)存中,在應(yīng)用重啟后,規(guī)則會丟失。每個規(guī)則管理器都會提供loadRules API,用于在系統(tǒng)運行時為規(guī)則管理器注冊或更新規(guī)則,但是loadRules只接收內(nèi)存狀態(tài)的規(guī)則對象,如何存儲規(guī)則由我們自行實現(xiàn)。
由于規(guī)則可能會發(fā)生改變,如果使用application.yaml(SpringBoot應(yīng)用)配置文件配置規(guī)則,或者直接使用硬編碼方式配置規(guī)則,則每當(dāng)要修改規(guī)則時都需要重啟應(yīng)用。
為了解決這個問題,我們需要實現(xiàn)規(guī)則動態(tài)配置。
本篇內(nèi)容主要包括以下幾個方面。
? 實現(xiàn)規(guī)則動態(tài)配置的兩種方式。
? 使用Redis動態(tài)數(shù)據(jù)源。
? 動態(tài)配置的實現(xiàn)原理。
? 基于SpringCloud動態(tài)配置實現(xiàn)動態(tài)數(shù)據(jù)源。
實現(xiàn)規(guī)則動態(tài)配置的兩種方式
實現(xiàn)規(guī)則動態(tài)配置有兩種方式:一種是先利用Sentinel提供的loadRules API,將規(guī)則存儲到數(shù)據(jù)庫、文件中等,定時加載規(guī)則,再調(diào)用loadRules API更新規(guī)則;另一種是利用Sentinel提供的DataSource擴(kuò)展,結(jié)合配置中心使用,實現(xiàn)Sentinel提供的ReadableDataSource接口,并實現(xiàn)監(jiān)聽配置中心配置改變以實時獲取更新后的配置。
Sentinel控制臺支持修改規(guī)則配置,使用的是第一種方式,即通過調(diào)用loadRules API更新規(guī)則,但是并不提供規(guī)則持久化的支持,這也是當(dāng)應(yīng)用重啟后在控制臺配置的規(guī)則不生效的原因。
Sentinel已提供基于第二種方式的適配多種配置中心的動態(tài)數(shù)據(jù)源,如適配Nacos的NacosDataSource、適配Redis的RedisDataSource。本章只介紹如何使用RedisDataSource實現(xiàn)規(guī)則動態(tài)配置,如果想要了解如何使用NacosDataSource實現(xiàn)規(guī)則動態(tài)配置,則可以直接瀏覽官方文檔中的“動態(tài)規(guī)則擴(kuò)展”部分。
使用Redis動態(tài)數(shù)據(jù)源
RedisDataSource使用Redis的string數(shù)據(jù)結(jié)構(gòu)存儲規(guī)則配置,并且使用Redis的發(fā)布-訂閱功能監(jiān)聽獲取更新后的規(guī)則。
要使用RedisDataSource,首先需要導(dǎo)入其jar包。
如果是使用Maven構(gòu)建的項目,則需要在項目的pom.xml文件中添加如下配置。

如果是使用Gradle構(gòu)建的項目,則需要在項目的gradle.build文件中添加如下配置。

注意:版本號建議與項目中使用的sentinel-core版本號一致,從而避免因為API差異,配置不生效的情況發(fā)生。
在使用RedisDataSource時,需要為用到的每種流量控制規(guī)則單獨配置一個RedisDataSource。假設(shè)當(dāng)前只需要使用限流功能,那么只需要注冊一個用于讀取限流規(guī)則的RedisDataSource即可,代碼如下。

Sentinel提供InitFunc,可用于在Sentinel初始化之前為Sentinel添加配置,在本案例中并未使用InitFunc,而是使用了SpringBoot的配置類實現(xiàn)配置,在SentinelConfiguration類被加載時,為Sentinel注冊限流規(guī)則的動態(tài)數(shù)據(jù)源,詳細(xì)步驟分析如下。
①因為規(guī)則以string數(shù)據(jù)結(jié)構(gòu)被存儲在Redis中,所以需要一個規(guī)則轉(zhuǎn)換器,用于將從Redis中讀取的規(guī)則配置字符串轉(zhuǎn)換為FlowRule數(shù)組,如果是以JSON格式存儲的規(guī)則,則該轉(zhuǎn)換器就是實現(xiàn)JSON字符串的序列化與反序列化。
② RedisDataSource需要操作Redis,所以需要提供可以連接到Redis的配置。
③ 創(chuàng)建一個RedisDataSource實例。RedisDataSource構(gòu)造方法有4個參數(shù):config表示Redis連接配置;ruleKey表示緩存規(guī)則的key;channel表示發(fā)布-訂閱的通道;flowConfigParser表示規(guī)則轉(zhuǎn)換器。
④ 調(diào)用限流規(guī)則管理器的register2Property API注冊數(shù)據(jù)源。
提示:在SpringBoot項目中,推薦實現(xiàn)ApplicationRunner接口,并在Spring容器初始化完成時再為Sentinel添加配置,此時應(yīng)用還未接收請求。
當(dāng)服務(wù)上線后,如果需要修改限流規(guī)則,則需要先將修改后的限流規(guī)則轉(zhuǎn)換為JSON字符串,再修改ruleKey的value為新的JSON字符串,同時使用Redis的PUBLISH命令向channel中寫入新的JSON字符串。
本文給大家講解的內(nèi)容是深度解析微服務(wù)高并發(fā)動態(tài)數(shù)據(jù)源 :實現(xiàn)規(guī)則動態(tài)配置的兩種方式,使用Redis動態(tài)數(shù)據(jù)源
感謝大家的支持!