Sentinel 的一些小擴充套件

猿天地發表於2020-11-13

隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 是面向分散式服務架構的流量控制元件,主要以流量為切入點,從流量控制、熔斷降級、系統自適應保護等多個維度來幫助您保障微服務的穩定性。

今天給大家介紹一些在使用過程中會遇到的一些問題。

SentinelResource 埋點監控

@SentinelResource 可以作用於方法上的熔斷降級保護,跟 Hystrix 的@HystrixCommand 註解作用是一樣的。

做監控的目的是為了在業務方法觸發了熔斷降級規則後,在對應的監控檢視中可以看到這個操作觸發了對應的規則。

@SentinelResource 的工作依賴於 SentinelResourceAspect 這個切面,需要監控的話對 SentinelResourceAspect 這個類進行改造就可以了。

流控熔斷預警

在流量突然上升的時候,也就意味著隨時都可能迎來請求量的高峰,就會觸發限流。我們也需要有一定的監控手段來提前告警,這種場景可以擴充套件 Slot 來實現提前告警的方案,具體方式可以查詢這篇文章:https://mp.weixin.qq.com/s/qhep2f9HgK7sZFcdKMAMVg

RestFul API 處理

在 Sentinel 中,以資源的概念來進行對應的限流熔斷操作。如果你們的 API 是 RestFul 風格,就會出現同一個介面變成 N 個資源的情況。

可以用@SentinelResource 為每個介面固定好資源名,這樣比較繁瑣。所以需要對這類的 API 進行格式化,變成一個資源。相關實現參考:https://blog.csdn.net/luanlouis/article/details/91633042還挺全的。

核心原理就是重寫 UrlCleaner 的實現邏輯,利用正則進行匹配處理。

這類操作不僅僅是在 Sentinel 中會遇到,在其他的框架中也經常會遇到這種情況。比如在 Cat 中也會有類似場景,對 API 進行監控,如果不處理同樣會出現 N 個監控項。

Origin 來源限制

如果需要對某個呼叫方進行限流,我們可以利用 Origin 方式來實現。建議做成動態配置方式,比如支援 IP, 支援請求頭中的引數等方式進行限制。

內部服務之間呼叫還可以將本服務的應用名存放在請求頭中傳遞過去,這樣就可以在 Sentinel 中基於 Origin 來實現內部服務呼叫的流量控制。

熱點引數動態流控

對於熱點引數的流控,也可以做成動態配置的方式。

比如當前是商品 ID 為熱點引數,後面是訂單 ID 為熱點引數。

比如當前是商品介面,後面是訂單介面。

可以從 url 引數中獲取熱點引數,可以從 header 中獲取熱點引數,可以從 path 路徑中獲取熱點引數。

增加一個配置資訊,然後擴充套件 Sentinel 的 Filter 進行限流控制,根據配置獲取對應的熱點引數進行限流。

限流規則持久化

限流規則持久化是肯定要做的,預設規則是儲存在記憶體中,這樣一起動規則就丟失了,所以必須持久化。

持久化分為兩種,首先是客戶端,客戶端持久化意思是說客戶端需要載入對應的規則,這些規則會從一個地方進行獲取,比如我們用 Apollo 配置中心來儲存的話,客戶端在啟動時就會從 Apollo 中去拉取對應的規則資訊。

對應的操作步驟和詳細介紹可以檢視下面這篇文章,雖然寫了很久了,但是總體思路什麼的都沒變化。

Sentinel Client: 整合 Apollo 規則持久化:https://mp.weixin.qq.com/s/K9JtdGoLD1XALq5D67slPQ

然後是服務端也就是控制檯的持久化,我們可以在控制檯進行規則的新增和編輯,然後會把對應的配置資訊推送給所有的客戶端,這樣規則就生效了。

同樣儲存重啟即丟失的情況,所以控制檯也需要進行持久化規則。如果客戶端對接了 Apollo,那麼控制也需要對接 Apollo 將規則資訊儲存到 Apollo 中,這樣整個流程就連起來了。

可以參考這篇文章:阿里 Sentinel 控制檯:-整合 Apollo 規則持久化:https://mp.weixin.qq.com/s/deigVXhEd9HycuLLm-oJzA

監控資料持久化

Sentinel 控制檯的實時監控資料,預設僅儲存 5 分鐘以內的資料。如果需要持久化,需要實現框架提供的相關介面進行改造。

5 分鐘確實很短,最起碼要儲存最近 3 天的資料,這樣方便檢視流量的趨勢。

關於相關實現大家可以去看文件,比較簡單,主要就是實現 MetricsRepository,將監控的資料儲存到對應的資料庫中。

相關改造原始碼可以參考:https://github.com/yinjihuan/kitty/tree/master/kitty-distributed/kitty-distributed-sentinel

關於作者:尹吉歡,簡單的技術愛好者,《Spring Cloud 微服務-全棧技術與案例解析》, 《Spring Cloud 微服務 入門 實戰與進階》作者, 公眾號猿天地發起人。

我整理了一份很全的學習資料,感興趣的可以微信搜尋「猿天地」,回覆關鍵字 「學習資料」獲取我整理好了的 Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC 分庫分表,任務排程框架 XXL-JOB,MongoDB,爬蟲等相關資料。

相關文章