溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Sentinel動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念與改造實踐是怎么樣的

發(fā)布時間:2021-10-21 15:22:34 來源:億速云 閱讀:172 作者:柒染 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)Sentinel動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念與改造實踐是怎么樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。


在介紹集群限流之前需要首先掌握動態(tài)數(shù)據(jù)源的配置方式,根據(jù) Sentinel 官方提供的代碼提出整體架構(gòu)思路,并最終給出實踐指導(dǎo)。

溫馨提示:本文主要分為動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念、從官方示例尋找改造思路、基于SpringBoot改造方案三個部分來詳細剖析 Sentienl 動態(tài)數(shù)據(jù)源的改造方案,循序漸進,不僅解決問題本身,更是反映了作者研究一個問題的思路與方法。

 

1、架構(gòu)設(shè)計理念


在 Sentinel 中主要有如下幾個角色:管理后臺、限流熔斷規(guī)則數(shù)據(jù)源、應(yīng)用程序。

1)管理后臺

管理后臺主要用于可視化配置限流規(guī)則、熔斷規(guī)則,其操作界面截圖如下:

Sentinel動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念與改造實踐是怎么樣的  
2)限流熔斷規(guī)則數(shù)據(jù)源

用于存儲限流熔斷規(guī)則的數(shù)據(jù)容器,在 Sentinel 中對應(yīng)動態(tài)數(shù)據(jù)源這個概念,動態(tài)數(shù)據(jù)源包含兩層含義:

  • 數(shù)據(jù)容器
    數(shù)據(jù)容器指的就是存儲熔斷、限流等規(guī)則配置的數(shù)據(jù)庫,例如關(guān)系型數(shù)據(jù)庫、Zookeeper等等,在實際生產(chǎn)過程中需要選用支持持久化功能的數(shù)據(jù)庫,否則程序一重啟,配置規(guī)則就會丟失,顯然是不能接受的。

  • 動態(tài)
    動態(tài)二字主要強調(diào)的是配置規(guī)則的更改能動態(tài)及時生效,引入 Sentinel 限流 SDK 的應(yīng)用程序在不需要重啟的情況下動態(tài)感知配置規(guī)則發(fā)生變化并立即生效。Sentinel 目前對 apollo、consul、etcd、nacos、redis、spring-clould-config、zookeeper 等進行了適配支持。

3)應(yīng)用程序

希望通過 Sentinel 提供的限流、熔斷功能對應(yīng)用程序加以保護,需要引用 Sentinel 相關(guān)的 SDK,根據(jù)采集的調(diào)用信息判斷當前是否符合限流規(guī)則。

后臺管理系統(tǒng)、動態(tài)數(shù)據(jù)源、應(yīng)用程序的關(guān)系如圖所示:

Sentinel動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念與改造實踐是怎么樣的  
 

2、從官方示例尋找改造思路


從官方的文檔中可以明確獲悉 sentinel-dashboard 即官方自帶的后臺管理系統(tǒng)只支持將限流、熔斷等限流配置規(guī)則存儲在內(nèi)存中,一旦后臺管理系統(tǒng)重啟,配置的熔斷規(guī)則將全部丟失,所以在生產(chǎn)實踐過程中需要對 sentinel-dashboard 進行一定的改造,引入動態(tài)數(shù)據(jù)源,例如 Zookeeper,對限流等配置進行持久化存儲。

有了上面的架構(gòu)設(shè)計理念為我們的改造提供了方向,那如何具體改造呢?首先我們來看一下官方提供的 Demo 程序。官方提供的示例代碼如下圖所示:

Sentinel動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念與改造實踐是怎么樣的  

 
接下來我們將以 zookeeper 動態(tài)數(shù)據(jù)源來介紹基于 zookeeper 如何構(gòu)建 Sentinel 動態(tài)數(shù)據(jù)源。

2.1 限流熔斷等規(guī)則存儲

首先查閱一下 ZookeeperConfigSender,該類主要的作用是將配置寫入到 zookeeper 中,其關(guān)鍵代碼截圖如下:

Sentinel動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念與改造實踐是怎么樣的  

 
這個類的測試目的很簡單,先將限流規(guī)則持久化到 Zookeeper 中,充當?shù)慕巧c sentinel-dashboard 的角色一致,故這個類為我們改造后臺管理系統(tǒng)帶來很大的啟發(fā),即可以通過 zookeeper 存儲 sentinel 限流規(guī)則,從 demo 示例可以看出限流規(guī)則在 zookeeper 中的目錄結(jié)構(gòu),路徑為 /{groupId} / {dataid} ,該節(jié)點的 value 值存儲 json 字符串,存儲所有的限流規(guī)則。

實踐指導(dǎo),通?;?zookeeper 的開發(fā),主要是規(guī)劃好目錄結(jié)構(gòu),關(guān)于 Sentinel,我對給出一個初步的目錄規(guī)劃。

在 zookeeper 中創(chuàng)建一個根節(jié)點,例如 /sentienl 用來表示限流相關(guān)的根目錄。

  • groupId 通常為一個獨立的應(yīng)用名稱,例如應(yīng)用的 appId,例如示例中的 provider-demo。

  • dataId 通常為配置類型,例如限流規(guī)則、熔斷規(guī)則、熱點規(guī)則等類別,例如限流規(guī)則使用 /flowRule ,熔斷規(guī)則使用 /degradeRule,其 value 值使用 json 存儲,將該應(yīng)用下的所有限流規(guī)則用一個 json 對象表示,其存儲格式類似于 [{},{}]。

 
2.2 客戶端動態(tài)感知配置

實現(xiàn)存儲規(guī)則的配置存儲后接下來是需要客戶端能動態(tài)感知規(guī)則的變化,從而是配置規(guī)則實時生效。

我們依然先來看一下官方示例,其核心代碼如圖所示:

Sentinel動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念與改造實踐是怎么樣的  
 
這里盡管引入 groupId 與 dataId 的概念是方便與 nacos 進行切換,但就算不切換,基于 zookeeper 的編程,這種目錄規(guī)劃是非常有必要的。   上面的示例代碼有兩個關(guān)鍵點:  
  • 創(chuàng)建 ZookeeperDataSource,每一個 ZookeeperDataSource 負責監(jiān)聽一個節(jié)點。

  • 需要調(diào)用 FlowRuleManager 的 register2Property 方法將數(shù)據(jù)源關(guān)聯(lián)的數(shù)據(jù)注冊到 FlowRuleManager 中,方便 Sentinel 內(nèi)核根據(jù)數(shù)據(jù)源中存儲的限流熔斷等規(guī)則進行工作。

客戶端在啟動的時候會調(diào)用 FlowRuleManager 相關(guān)方法加載限流相關(guān)的配置,那如果配置規(guī)則發(fā)生變化后,客戶端如何動態(tài)感知呢?其關(guān)鍵就在于 ZookeeperDataSource 的實現(xiàn)中,其實現(xiàn)關(guān)鍵點如下:

Sentinel動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念與改造實踐是怎么樣的  
即在構(gòu)建 ZookeeperDataSource 時會監(jiān)聽 /groupId/dataId 節(jié)點,即存放限流配置的節(jié)點,一旦數(shù)據(jù)發(fā)生變化,就會通知到客戶端,從而調(diào)用 loadConfig 重新更新 Sentienl 客戶端的限流配置,從而實現(xiàn)配置實時生效。  
 

3、動態(tài)數(shù)據(jù)源實現(xiàn)方案


從官方的示例中我們不難發(fā)現(xiàn),引入 Zookeeper 數(shù)據(jù)源主要有兩個步驟:將數(shù)據(jù)存儲在Zookeeper中以及在客戶端監(jiān)聽ZK從而實時生效兩個步驟。

sentinel 官方提供了默認的后臺管理系統(tǒng)實現(xiàn):sentinel-dashboard,但其缺點非常明顯:基于內(nèi)存存儲,無法用于實際生產(chǎn)過程。大家可能會向后臺管理系統(tǒng)將配置信息存儲在內(nèi)存中,那接入的客戶端如何從 sentinel-dashboard 的內(nèi)存中獲取配置信息呢,這是因為 sentinel-dashboard 里提供了簡單的機器發(fā)現(xiàn),并且內(nèi)置了 sentinel 客戶端之間、sentinel 客戶端與 sentinel-dashboard 之間的通訊協(xié)議,具體由 sentinel-transport 模塊實現(xiàn),目前提供了基于 http 與 netty 的實現(xiàn)方式,故能將 sentinel-dashboard 內(nèi)存中的配置信息推送到客戶端,從而使客戶端根據(jù)配置進行限流與熔斷。

接下來回答本文的重點部分,基于 sentinel-dashboard 如何引入 zookeeper 等動態(tài)數(shù)據(jù)源呢?

 
3.1 將配置規(guī)則存儲在Zookeeper中

首先我們可以順著 sentinel-dashboard 的提供的控制器,尋找其后臺入口,改造目標也很明確,就是將數(shù)據(jù)持久化到 zookeeper中,例如增加流控規(guī)則的后臺處理入口為:

Sentinel動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念與改造實踐是怎么樣的  

 
只需要從這里開始改造,將其配置持久化到數(shù)據(jù)庫中和 zookeeper中即可。  將數(shù)據(jù)存儲在 zookeeper 中,其關(guān)鍵是設(shè)計好各個項目如何有組織有條理的在 zookeeper 中進行組織。  我給出如下設(shè)計方案:
Sentinel動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念與改造實踐是怎么樣的  
這樣相關(guān)管理人員可以直接在 sentinel-dashboard 中配置限流規(guī)則,即按照應(yīng)用為維度進行存儲,每一個應(yīng)用再按照維度,例如限流、熔斷、熱點、集群等維度進行配置,每一分類節(jié)點的值存儲的是所有的配置,使用 [{},{}] 這種JSON格式進行存儲。  
 
3.2 Sentinel 客戶端規(guī)則加載封裝

目前大部分項目都是基于 SpringBoot,故本文給出基于 SpringBoot 進行的客戶端加載實現(xiàn)思路。

利用 SpringBoot 的事件機制,在 Spring 容器初始化后,開始加載 zookeeper 中的配置,其實現(xiàn)思路是讀取 zookeeper 中的 /sentinel 下所有的子節(jié)點,然后并依次遍歷其子節(jié)點(appid),然后依次讀取 flow(限流)、degrade(熔斷)等配置,并調(diào)用 Sentinel 的 相關(guān)API完成加載,其偽代碼如下:

Sentinel動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念與改造實踐是怎么樣的  
其主要關(guān)鍵點如下:
  • 基于 Spring ApplicationReadyEvent 事件,實現(xiàn)限流規(guī)則的加載。

  • 創(chuàng)建 ZookeeperDataSource 創(chuàng)建動態(tài)數(shù)據(jù)源。
    并調(diào)用 Sentinel 提供的相關(guān) API 完成限流規(guī)則的加載。

看完上述內(nèi)容,你們對Sentinel動態(tài)數(shù)據(jù)源架構(gòu)設(shè)計理念與改造實踐是怎么樣的有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI