本篇內(nèi)容主要講解“如何對(duì)Sentinel控制臺(tái)進(jìn)行改造”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何對(duì)Sentinel控制臺(tái)進(jìn)行改造”吧!
創(chuàng)新互聯(lián)公司是一家專業(yè)提供西市企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、網(wǎng)站建設(shè)、H5開(kāi)發(fā)、小程序制作等業(yè)務(wù)。10年已為西市眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
Sentinel 控制臺(tái)作為 Sentinel 的一大利器,提供了多個(gè)維度的監(jiān)控和規(guī)則配置功能。Sentinel 客戶端目前已可用于生產(chǎn)環(huán)境,但若希望在生產(chǎn)環(huán)境中使用 Sentinel 控制臺(tái)還需要進(jìn)行一些改造。
在生產(chǎn)環(huán)境中使用 Sentinel 控制臺(tái)只需要兩步改造:
改造推送邏輯,支持向規(guī)則數(shù)據(jù)源進(jìn)行推送
改造監(jiān)控邏輯,支持監(jiān)控?cái)?shù)據(jù)持久化
Sentinel 的
動(dòng)態(tài)規(guī)則數(shù)據(jù)源
用于從中讀取及寫(xiě)入規(guī)則。從 0.2.0 版本開(kāi)始,Sentinel 將動(dòng)態(tài)規(guī)則數(shù)據(jù)源分為兩種類型:讀數(shù)據(jù)源(ReadableDataSource
)和寫(xiě)數(shù)據(jù)源(WritableDataSource
):
讀數(shù)據(jù)源僅負(fù)責(zé)監(jiān)聽(tīng)或輪詢讀取遠(yuǎn)程存儲(chǔ)的變更。
寫(xiě)數(shù)據(jù)源僅負(fù)責(zé)將規(guī)則變更寫(xiě)入到規(guī)則源中。
其中讀數(shù)據(jù)源常見(jiàn)的實(shí)現(xiàn)方式有:
pull 模式:客戶端主動(dòng)向某個(gè)規(guī)則管理中心定期輪詢拉取規(guī)則,這個(gè)規(guī)則中心可以是 RDBMS、文件 等。這樣做的方式是簡(jiǎn)單,缺點(diǎn)是可能無(wú)法及時(shí)獲取變更,拉取過(guò)于頻繁也可能會(huì)有性能問(wèn)題。
push 模式:規(guī)則中心統(tǒng)一推送,客戶端通過(guò)注冊(cè)監(jiān)聽(tīng)器的方式時(shí)刻監(jiān)聽(tīng)變化,比如使用 Nacos、Zookeeper 等配置中心。這種方式有更好的實(shí)時(shí)性和一致性保證。
在實(shí)際的場(chǎng)景中,不同的存儲(chǔ)類型對(duì)應(yīng)的數(shù)據(jù)源類型也不同。對(duì)于 push 模式的數(shù)據(jù)源,一般不支持寫(xiě)入;而 pull 模式的數(shù)據(jù)源則是可寫(xiě)的。
下面我們分別來(lái)分析一下它們結(jié)合 Sentinel 控制臺(tái)的使用場(chǎng)景,以及相應(yīng)的需要改造的點(diǎn)。
若應(yīng)用未注冊(cè)任何數(shù)據(jù)源,直接從 Sentinel 控制臺(tái)推送規(guī)則的過(guò)程非常簡(jiǎn)單:
cdn.nlark.com/lark/0/2018/png/47688/1536660296273-4f440bba-5b9e-4205-9402-fb6083b66912.png">
Sentinel 控制臺(tái)通過(guò) API 將規(guī)則推送至客戶端并直接更新到內(nèi)存中。這種情況下應(yīng)用重啟規(guī)則就會(huì)消失,僅用于簡(jiǎn)單測(cè)試,不能用于生產(chǎn)環(huán)境。一般在生產(chǎn)環(huán)境中,我們需要在應(yīng)用端配置規(guī)則數(shù)據(jù)源。
pull 模式的數(shù)據(jù)源(如本地文件、RDBMS 等)一般是可寫(xiě)入的。使用時(shí)需要在客戶端注冊(cè)數(shù)據(jù)源:將對(duì)應(yīng)的讀數(shù)據(jù)源注冊(cè)至對(duì)應(yīng)的 RuleManager,將寫(xiě)數(shù)據(jù)源注冊(cè)至 transport 的
WritableDataSourceRegistry
中。以本地文件數(shù)據(jù)源為例:
public class FileDataSourceInit implements InitFunc { @Override public void init() throws Exception { String flowRulePath = "xxx"; ReadableDataSource> ds = new FileRefreshableDataSource<>( flowRulePath, source -> JSON.parseObject(source, new TypeReference >() {}) ); // 將可讀數(shù)據(jù)源注冊(cè)至 FlowRuleManager. FlowRuleManager.register2Property(ds.getProperty()); WritableDataSource
> wds = new FileWritableDataSource<>(flowRulePath, this::encodeJson); // 將可寫(xiě)數(shù)據(jù)源注冊(cè)至 transport 模塊的 WritableDataSourceRegistry 中. // 這樣收到控制臺(tái)推送的規(guī)則時(shí),Sentinel 會(huì)先更新到內(nèi)存,然后將規(guī)則寫(xiě)入到文件中. WritableDataSourceRegistry.registerFlowDataSource(wds); } private
String encodeJson(T t) { return JSON.toJSONString(t); } }
本地文件數(shù)據(jù)源會(huì)定時(shí)輪詢文件的變更,讀取規(guī)則。這樣我們既可以在應(yīng)用本地直接修改文件來(lái)更新規(guī)則,也可以通過(guò) Sentinel 控制臺(tái)推送規(guī)則。以本地文件數(shù)據(jù)源為例,推送過(guò)程如下圖所示:
首先 Sentinel 控制臺(tái)通過(guò) API 將規(guī)則推送至客戶端并更新到內(nèi)存中,接著注冊(cè)的寫(xiě)數(shù)據(jù)源會(huì)將新的規(guī)則保存到本地的文件中。使用 pull 模式的數(shù)據(jù)源時(shí)一般不需要對(duì) Sentinel 控制臺(tái)進(jìn)行改造。
對(duì)于 push 模式的數(shù)據(jù)源(如遠(yuǎn)程配置中心),推送的操作不應(yīng)由 Sentinel 數(shù)據(jù)源進(jìn)行,而應(yīng)該經(jīng)控制臺(tái)進(jìn)行推送,數(shù)據(jù)源僅負(fù)責(zé)獲取配置中心推送的配置并更新到本地。
假設(shè)寫(xiě)入的操作也由數(shù)據(jù)源進(jìn)行,那么 Sentinel 客戶端收到控制臺(tái)推送的規(guī)則后,將新的規(guī)則更新到內(nèi)存中,同時(shí)將規(guī)則推送至遠(yuǎn)程的配置中心。此時(shí),數(shù)據(jù)源監(jiān)聽(tīng)到配置中心推送過(guò)來(lái)的新規(guī)則,又一次更新到內(nèi)存中。也就是說(shuō)應(yīng)用在本地更新完規(guī)則并推送到遠(yuǎn)程后,又要接收變更并更新一次,這樣顯然是不合理的。因此推送規(guī)則正確做法應(yīng)該是 配置中心控制臺(tái)/Sentinel 控制臺(tái) → 配置中心 → Sentinel 數(shù)據(jù)源 → Sentinel,而不是經(jīng) Sentinel 數(shù)據(jù)源推送至配置中心。這樣的流程就非常清晰了:
注意由于不同的生產(chǎn)環(huán)境可能使用不同的數(shù)據(jù)源,從 Sentinel 控制臺(tái)推送至配置中心的實(shí)現(xiàn)需要用戶自行改造。以 ZooKeeper 為例,我們可以按照如下步驟進(jìn)行改造(假設(shè)推送維度為應(yīng)用維度):
實(shí)現(xiàn)一個(gè)公共的 ZooKeeper 客戶端用于推送規(guī)則,在 Sentinel 控制臺(tái)配置項(xiàng)中需要指定 ZooKeeper 的地址,啟動(dòng)時(shí)即創(chuàng)建 ZooKeeper Client。
我們需要針對(duì)每個(gè)應(yīng)用(appName),每種規(guī)則設(shè)置不同的 path(可隨時(shí)修改);或者約定大于配置(如 path 的模式統(tǒng)一為
/sentinel_rules/{appName}/{ruleType}
,e.g.
sentinel_rules/appA/flowRule
)。
規(guī)則配置頁(yè)需要進(jìn)行相應(yīng)的改造,直接針對(duì)應(yīng)用維度進(jìn)行規(guī)則配置;修改同個(gè)應(yīng)用多個(gè)資源的規(guī)則時(shí)可以批量進(jìn)行推送,也可以分別推送。Sentinel 控制臺(tái)將規(guī)則緩存在內(nèi)存中(如
InMemFlowRuleStore
),可以對(duì)其進(jìn)行改造使其支持應(yīng)用維度的規(guī)則緩存(key 為 appName),每次添加/修改/刪除規(guī)則都先更新內(nèi)存中的規(guī)則緩存,然后需要推送的時(shí)候從規(guī)則緩存中獲取全量規(guī)則,然后通過(guò)上面實(shí)現(xiàn)的 Client 將規(guī)則推送到 ZooKeeper 即可。
應(yīng)用客戶端需要注冊(cè)對(duì)應(yīng)的讀數(shù)據(jù)源以監(jiān)聽(tīng)變更,可以參考 相關(guān)文檔 。
Sentinel 會(huì)記錄資源訪問(wèn)的秒級(jí)數(shù)據(jù)(若沒(méi)有訪問(wèn)則不進(jìn)行記錄)并保存在本地日志中,具體格式請(qǐng)見(jiàn)
秒級(jí)監(jiān)控日志文檔
。Sentinel 控制臺(tái)通過(guò)
Sentinel 客戶端預(yù)留的 API
從秒級(jí)監(jiān)控日志中拉取監(jiān)控?cái)?shù)據(jù),并進(jìn)行聚合。目前 Sentinel 控制臺(tái)中監(jiān)控?cái)?shù)據(jù)聚合后直接存在內(nèi)存中,未進(jìn)行持久化,且僅保留最近 5 分鐘的監(jiān)控?cái)?shù)據(jù)。若需要監(jiān)控?cái)?shù)據(jù)持久化的功能,可以自行擴(kuò)展實(shí)現(xiàn)
MetricsRepository
接口(0.2.0 版本),然后注冊(cè)成 Spring Bean 并在相應(yīng)位置通過(guò)
@Qualifier
注解指定對(duì)應(yīng)的 bean name 即可。MetricsRepository
接口定義了以下功能:
save
與
saveAll
:存儲(chǔ)對(duì)應(yīng)的監(jiān)控?cái)?shù)據(jù)
queryByAppAndResourceBetween
:查詢某段時(shí)間內(nèi)的某個(gè)應(yīng)用的某個(gè)資源的監(jiān)控?cái)?shù)據(jù)
listResourcesOfApp
:查詢某個(gè)應(yīng)用下的所有資源
其中默認(rèn)的監(jiān)控?cái)?shù)據(jù)類型為
MetricEntity
,包含應(yīng)用名稱、時(shí)間戳、資源名稱、異常數(shù)、請(qǐng)求通過(guò)數(shù)、請(qǐng)求 block 數(shù)、平均響應(yīng)時(shí)間等信息。
同時(shí)用戶可以自行進(jìn)行擴(kuò)展,適配 Grafana 等可視化平臺(tái),以便將監(jiān)控?cái)?shù)據(jù)更好地進(jìn)行可視化。
到此,相信大家對(duì)“如何對(duì)Sentinel控制臺(tái)進(jìn)行改造”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!