天天看點

20年大佬深度解析微服務高并發動态資料源:使用Redis動态資料源

作者:程式員進階碼農II

動态資料源

Sentinel為每種規則提供一個規則管理器,而規則管理器管理的規則隻存在于記憶體中,在應用重新開機後,規則會丢失。每個規則管理器都會提供loadRules API,用于在系統運作時為規則管理器注冊或更新規則,但是loadRules隻接收記憶體狀态的規則對象,如何存儲規則由我們自行實作。

由于規則可能會發生改變,如果使用application.yaml(SpringBoot應用)配置檔案配置規則,或者直接使用寫死方式配置規則,則每當要修改規則時都需要重新開機應用。

為了解決這個問題,我們需要實作規則動态配置。

本篇内容主要包括以下幾個方面。

• 實作規則動态配置的兩種方式。

• 使用Redis動态資料源。

• 動态配置的實作原理。

• 基于SpringCloud動态配置實作動态資料源。

實作規則動态配置的兩種方式

實作規則動态配置有兩種方式:一種是先利用Sentinel提供的loadRules API,将規則存儲到資料庫、檔案中等,定時加載規則,再調用loadRules API更新規則;另一種是利用Sentinel提供的DataSource擴充,結合配置中心使用,實作Sentinel提供的ReadableDataSource接口,并實作監聽配置中心配置改變以實時擷取更新後的配置。

Sentinel控制台支援修改規則配置,使用的是第一種方式,即通過調用loadRules API更新規則,但是并不提供規則持久化的支援,這也是當應用重新開機後在控制台配置的規則不生效的原因。

Sentinel已提供基于第二種方式的适配多種配置中心的動态資料源,如适配Nacos的NacosDataSource、适配Redis的RedisDataSource。本章隻介紹如何使用RedisDataSource實作規則動态配置,如果想要了解如何使用NacosDataSource實作規則動态配置,則可以直接浏覽官方文檔中的“動态規則擴充”部分。

使用Redis動态資料源

RedisDataSource使用Redis的string資料結構存儲規則配置,并且使用Redis的釋出-訂閱功能監聽擷取更新後的規則。

要使用RedisDataSource,首先需要導入其jar包。

如果是使用Maven建構的項目,則需要在項目的pom.xml檔案中添加如下配置。

20年大佬深度解析微服務高并發動态資料源:使用Redis動态資料源

如果是使用Gradle建構的項目,則需要在項目的gradle.build檔案中添加如下配置。

20年大佬深度解析微服務高并發動态資料源:使用Redis動态資料源

注意:版本号建議與項目中使用的sentinel-core版本号一緻,進而避免因為API差異,配置不生效的情況發生。

在使用RedisDataSource時,需要為用到的每種流量控制規則單獨配置一個RedisDataSource。假設目前隻需要使用限流功能,那麼隻需要注冊一個用于讀取限流規則的RedisDataSource即可,代碼如下。

20年大佬深度解析微服務高并發動态資料源:使用Redis動态資料源

Sentinel提供InitFunc,可用于在Sentinel初始化之前為Sentinel添加配置,在本案例中并未使用InitFunc,而是使用了SpringBoot的配置類實作配置,在SentinelConfiguration類被加載時,為Sentinel注冊限流規則的動态資料源,詳細步驟分析如下。

①因為規則以string資料結構被存儲在Redis中,是以需要一個規則轉換器,用于将從Redis中讀取的規則配置字元串轉換為FlowRule數組,如果是以JSON格式存儲的規則,則該轉換器就是實作JSON字元串的序列化與反序列化。

② RedisDataSource需要操作Redis,是以需要提供可以連接配接到Redis的配置。

③ 建立一個RedisDataSource執行個體。RedisDataSource構造方法有4個參數:config表示Redis連接配接配置;ruleKey表示緩存規則的key;channel表示釋出-訂閱的通道;flowConfigParser表示規則轉換器。

④ 調用限流規則管理器的register2Property API注冊資料源。

提示:在SpringBoot項目中,推薦實作ApplicationRunner接口,并在Spring容器初始化完成時再為Sentinel添加配置,此時應用還未接收請求。

當服務上線後,如果需要修改限流規則,則需要先将修改後的限流規則轉換為JSON字元串,再修改ruleKey的value為新的JSON字元串,同時使用Redis的PUBLISH指令向channel中寫入新的JSON字元串。

本文給大家講解的内容是深度解析微服務高并發動态資料源 :實作規則動态配置的兩種方式,使用Redis動态資料源

  • 下篇文章給大家講解的内容是深度解析微服務高并發動态資料源 :動态配置的實作原理
  • 感謝大家的支援!

繼續閱讀