天天看點

阿裡大佬帶你一次性吃透基于Spring Cloud動态配置實作動态資料源

作者:程式員進階碼農II

基于Spring Cloud動态配置實作動态資料源

筆者在一些項目中并未使用Sentinel提供的任何一種實作動态資料源的方式,而是選擇自己實作動态資料源,因為這些項目被部署在Kubernetes平台上,是以可以利用Kubernetes提供的ConfigMap資源存儲限流、熔斷降級等規則,又因為Spring Cloud Kubernetes提供了SpringCloud動态配置接口的實作,是以我們不需要關心如何讀取ConfigMap資源。

本節以實作FlowRule動态配置為例,詳細介紹如何基于Spring Cloud動态配置實作動态資料源,主要分為5個步驟。

第一步,定義一個用于裝載動态限流規則配置的FlowRuleProps類,代碼如下。

阿裡大佬帶你一次性吃透基于Spring Cloud動态配置實作動态資料源

第二步,定義限流規則轉換器FlowRuleConverter,将限流規則配置轉換為FlowRule集合,代碼如下。

阿裡大佬帶你一次性吃透基于Spring Cloud動态配置實作動态資料源

第三步,定義限流規則動态資料源FlowRuleDataSource,繼承AbstractDataSource抽象類,并實作readSource方法,代碼如下。readSource方法隻需要實作擷取FlowRuleProps執行個體并傳回即可。

阿裡大佬帶你一次性吃透基于Spring Cloud動态配置實作動态資料源

第四步,增強FlowRuleDataSource,使FlowRuleDataSource能夠監聽到配置改變,代碼如下。

阿裡大佬帶你一次性吃透基于Spring Cloud動态配置實作動态資料源

• 增強一:實作Spring InitializingBean接口的afterPropertiesSet方法,在資料源對象建立時,初始化加載一次規則配置。

• 增強二:實作SpringApplicationListener接口的onApplicationEvent方法,監聽動态配置改變事件(RefreshScopeRefreshedEvent)。

在監聽到RefreshScopeRefreshedEvent事件時,首先調用loadConfig方法加載所有限流規則配置,然後調用getProperty方法擷取SentinelProperty執行個體,最後調用SentinelProperty執行個體的updateValue方法通知FlowRuleManager的監聽器更新限流規則配置。

第五步,定義一個ApplicationRunner,在Spring容器重新整理完成後,将FlowRuleDataSource執行個體的SentinelProperty執行個體注冊給FlowRuleManager,代碼如下。

阿裡大佬帶你一次性吃透基于Spring Cloud動态配置實作動态資料源

提示:在調用FlowRuleManager#register2Property方法将FlowRuleDataSource執行個體的SentinelProperty執行個體注冊給FlowRuleManager時,FlowRuleManager會自動給該SentinelProperty執行個體注冊一個FlowPropertyListener執行個體。

至此,一個基于Spring Cloud動态配置實作的限流規則動态資料源就已經完成,整個工作流程如下。

(1)當動态配置改變時,Spring

Cloud會發送RefreshScopeRefreshedEvent事件,

FlowRuleDataSource的onApplicationEvent方法會被調用。

(2)FlowRuleDataSource調用loadConfig方法擷取最新的配置。

(3)FlowRuleDataSource#loadConfig方法調用readSource方法擷取FlowRuleProps執行個體,此時的FlowRuleProps執行個體已經裝載了最新的配置。

(4)FlowRuleDataSource#loadConfig方法調用FlowRuleConverter執行個體的convert方法将FlowRuleProps執行個體轉換為FlowRule集合。

(5)FlowRuleDataSource調用自身的SentinelProperty執行個體的updateValue方法通知所有監聽器,并攜帶新的規則配置。

(6)FlowPropertyListener的configUpdate方法被調用,FlowPropertyListener在configUpdate方法中更新FlowRuleManager緩存的限流規則配置。

提示:Sentinel實作動态資料源的整體架構的設計值得我們學習,如資料轉換器、監聽器。

本文給大家講解的内容是深度解析微服務高并發動态資料源 :基于Spring Cloud動态配置實作動态資料源

  • 下篇文章給大家講解的内容是深度解析微服務高并發适配主流架構:适配Spring MVC架構
  • 覺得視訊不錯的話,可以點贊關注轉發一下哈~
  • 感謝大家的支援!

繼續閱讀