一萬字圖解分布式系統(tǒng)限流平臺Sentinel

大家好,我是哪吒。
Sentinel是阿里巴巴開源的一款輕量級流量控制、熔斷降級工具,它提供了實時的流量控制,熔斷降級等功能,能夠幫助我們實現(xiàn)服務(wù)的高可用性和穩(wěn)定性。
本文將會介紹Sentinel的作用和優(yōu)勢、快速開始、進階使用、Spring Cloud Alibaba Sentinel整合以及實踐案例,并對Sentinel的局限和不足進行分析。
一、前言
1、關(guān)于 Sentinel
Sentinel 是阿里巴巴開源的一款針對分布式系統(tǒng)的流量控制、熔斷降級的框架。在微服務(wù)架構(gòu)的系統(tǒng)中,請求流量復雜多樣,可能會因為某一個服務(wù)異常而導致整體服務(wù)不可用,這時候需要熔斷降級,而 Sentinel 就提供了這樣的解決方案。

2、Sentinel 的作用和優(yōu)勢
Sentinel 可以針對服務(wù)方法調(diào)用、HTTP 請求、Dubbo 服務(wù)等,進行實時的流量控制、熔斷降級,確保服務(wù)高可用,同時還可以提供實時的監(jiān)控和報警功能。
Sentinel 有以下一些優(yōu)勢:
- 豐富的應(yīng)用場景和細粒度的控制: Sentinel 支持多種應(yīng)用場景,包括熔斷降級、流量控制、系統(tǒng)保護、熱點參數(shù)限流等,而且可以實現(xiàn)細粒度的控制;
- 強大的實時監(jiān)測機制: Sentinel 提供了實時的監(jiān)測、報警機制,能夠?qū)ο到y(tǒng)運行情況進行實時檢測和通知,發(fā)現(xiàn)問題更加及時;
- 易于擴展: Sentinel 為開發(fā)者提供了簡單易用的擴展接口,開發(fā)者可以方便的實現(xiàn)自定義的控制和監(jiān)測邏輯;
- 易于集成: Sentinel 支持多種開發(fā)框架,包括 Spring Cloud、Dubbo、Feign 等,開發(fā)者可以很方便的將 Sentinel 集成到自己的應(yīng)用中;
3、本文目的和內(nèi)容概述
本文將為讀者介紹 Sentinel 的基礎(chǔ)和進階使用方法,包括
- 如何配置 Sentinel 控制臺;
- 如何編寫并測試 Sentinel 規(guī)則、如何使用自定義 Sentinel 規(guī)則擴展開發(fā);
- 介紹 Sentinel 和 Spring Cloud Alibaba 的整合方法,并且給出了一些 Sentinel 實踐案例供讀者參考。
本文的目的是幫助讀者快速上手使用 Sentinel,并且深入理解其基本原理和使用方法。同時,也希望能夠?qū)ψx者們的日常工作有所幫助。
二、快速開始
1、環(huán)境準備
在開始使用 Sentinel 之前,我們需要準備好以下環(huán)境:
- JDK 1.8 或更高版本
- Maven 3.0 或更高版本
- Sentinel-dashboard
2、引入 Sentinel 依賴
3、配置 Sentinel 控制臺
在Sentinel的官網(wǎng)下載最新的控制臺jar包,然后在控制臺目錄下執(zhí)行以下命令啟動控制臺:
啟動成功后,可以通過瀏覽器訪問http://localhost:8080/#/dashboard/home查看控制臺頁面。
4、注冊應(yīng)用到 Sentinel 控制臺
在應(yīng)用啟動類上添加注解@EnableSentinel注解,然后在配置文件中配置應(yīng)用名稱和Sentinel控制臺的地址:
5、編寫并測試 Sentinel 規(guī)則
Sentinel提供了多種限流降級策略,本文以流控規(guī)則為例進行演示。
在需要限流的方法上添加@SentinelResource注解,然后配置流控規(guī)則:
在控制臺的流控規(guī)則頁面添加對應(yīng)的規(guī)則,設(shè)置好閾值和統(tǒng)計窗口等參數(shù),然后測試該接口。
三、進階使用
1、Sentinel Dashboard 使用詳解
Sentinel Dashboard是Sentinel的可視化監(jiān)控平臺,可以用于實時監(jiān)控應(yīng)用的流量、延遲、異常等指標,并對應(yīng)用進行限流降級等操作。

Sentinel客戶端首先向Sentinel Dashboard注冊。Sentinel Dashboard返回一個token給客戶端,客戶端將使用該token連接Sentinel。
應(yīng)用程序?qū)⑹褂胻oken連接Sentinel,Sentinel客戶端將返回連接成功信息。Sentinel客戶端將實時推送metrics數(shù)據(jù)到Sentinel Dashboard,Sentinel Dashboard將監(jiān)控和管理應(yīng)用程序。
2、入門級規(guī)則配置詳解(流控規(guī)則、降級規(guī)則、熱點參數(shù)限流)
Sentinel是一款開源的流量控制和降級框架,提供多種限流降級策略,包括流控規(guī)則、降級規(guī)則、熱點參數(shù)限流等。
下面將逐一介紹這些規(guī)則。
(1)流控規(guī)則
流控規(guī)則用于限制系統(tǒng)的流量,可以通過設(shè)置QPS流量控制和線程數(shù)流量控制等方式來控制系統(tǒng)的訪問速度。
在Sentinel Dashboard中,可以通過以下步驟來配置和管理流控規(guī)則:
- 設(shè)置流控模式:可以選擇直接拒絕、Warm Up、勻速排隊等模式。
- 設(shè)置閾值:可以設(shè)置QPS、線程數(shù)等閾值來限制流量。
- 設(shè)置流控策略:可以選擇按照調(diào)用關(guān)系、鏈路入口等策略來限制流量。
- 查看已有規(guī)則:可以查看已經(jīng)存在的流控規(guī)則,并進行管理和修改。
(2)降級規(guī)則
降級規(guī)則用于應(yīng)對系統(tǒng)的異常情況,可以通過設(shè)置異常比例降級、異常數(shù)降級和慢調(diào)用降級等方式來降低系統(tǒng)的負載。
在Sentinel Dashboard中,可以通過以下步驟來配置和管理降級規(guī)則:
- 設(shè)置降級模式:可以選擇異常比例、異常數(shù)和慢調(diào)用三種模式。
- 設(shè)置閾值:可以設(shè)置異常比例、異常數(shù)和慢調(diào)用時間等閾值來觸發(fā)降級。
- 設(shè)置降級策略:可以選擇返回特定的錯誤信息、調(diào)用備用服務(wù)等策略來處理降級情況。
- 查看已有規(guī)則:可以查看已經(jīng)存在的降級規(guī)則,并進行管理和修改。
(3)熱點參數(shù)限流
熱點參數(shù)限流用于對熱點參數(shù)進行限流,可以有效避免某些參數(shù)被過多地請求。在Sentinel Dashboard中,可以通過以下步驟來配置和管理熱點參數(shù)限流規(guī)則:
- 設(shè)置參數(shù):可以選擇需要進行限流的參數(shù)。
- 設(shè)置閾值:可以設(shè)置QPS、線程數(shù)等閾值來限制熱點參數(shù)的訪問速度。
- 設(shè)置限流策略:可以選擇直接拒絕、勻速排隊等策略來處理熱點參數(shù)限流。
- 查看已有規(guī)則:可以查看已經(jīng)存在的熱點參數(shù)限流規(guī)則,并進行管理和修改。
在使用這些規(guī)則時,需要注意參數(shù)設(shè)置和閾值設(shè)置等細節(jié),以避免規(guī)則的誤判或限流不準確等問題。
通過Sentinel Dashboard的可視化界面,可以方便地進行規(guī)則的配置和管理,提高系統(tǒng)的穩(wěn)定性和可靠性。
3、資源名與 URL 匹配規(guī)則
Sentinel的資源名和URL匹配規(guī)則是限流降級策略的重要組成部分,可以根據(jù)業(yè)務(wù)需求定義合適的匹配規(guī)則。
- 資源名:可以是一個具體的業(yè)務(wù)方法、一個接口URL或者一個Dubbo服務(wù)等。
- URL 匹配規(guī)則:支持Ant匹配和正則匹配兩種方式,可以根據(jù)具體需求進行選擇。
- Dubbo服務(wù):Sentinel支持對Dubbo服務(wù)進行限流降級操作,需要在Dubbo配置文件中添加Sentinel的攔截器配置。
- 在定義資源名和URL匹配規(guī)則時,需要注意合理性和精確性,以避免出現(xiàn)誤判或限流不準確等問題。
上圖展示了應(yīng)用程序代碼中定義資源名和 URL 匹配規(guī)則時的交互過程。
應(yīng)用程序通過 Sentinel 客戶端向 Sentinel 發(fā)送配置請求,Sentinel 返回配置結(jié)果。應(yīng)用程序根據(jù)配置結(jié)果使用 Sentinel 進行限流降級。
在這個過程中,應(yīng)用程序需要注意合理性和精確性,以避免出現(xiàn)誤判或限流不準確等問題。
4、自定義 Sentinel 規(guī)則擴展開發(fā)

上圖是自定義規(guī)則擴展的關(guān)系圖示。
自定義規(guī)則擴展包括數(shù)據(jù)源擴展、限流降級規(guī)則擴展、規(guī)則統(tǒng)計擴展等,可以使用多種語言進行開發(fā)。
在進行規(guī)則擴展時,需要注意代碼質(zhì)量和性能,以保證擴展的準確性和有效性。
以下是一個自定義規(guī)則類型的示例:
在這個示例中,我們自定義了一個 CustomFlowRule 類型,它包含了 resourceName、count 和 interval 三個屬性。同時,我們實現(xiàn)了 FlowRule 接口,并實現(xiàn)了其中的各個方法,以滿足 Sentinel 對規(guī)則類型的要求。
使用這個自定義規(guī)則類型時,我們需要在代碼中添加相關(guān)的配置,例如:
在這個示例中,我們通過 CustomFlowRule 類型創(chuàng)建了一個規(guī)則,它的資源名稱為 custom_resource,限流閾值為 10,時間間隔為 1 秒。然后我們將這個規(guī)則添加到 Sentinel 的規(guī)則管理器中,從而讓 Sentinel 能夠自動識別和使用這個規(guī)則。
四、Spring Cloud Alibaba Sentinel 整合
1、Sentinel Starter 簡介
Sentinel Starter是Spring Cloud Alibaba Sentinel的快速入門依賴,提供了自動化配置和默認規(guī)則等能力,可以簡化Sentinel在Spring Cloud中的使用。
在使用Sentinel Starter時,只需要添加依賴并在配置文件中配置相應(yīng)的參數(shù),即可快速實現(xiàn)Sentinel的限流降級功能。
2、使用 Sentinel Starter 整合 Spring Cloud 微服務(wù)
(1)在Spring Boot項目中添加以下依賴:
(2)在application.yml配置文件中添加以下配置:
(3)在代碼中添加注解 @EnableSentinel ,開啟 Sentinel 功能。
(4)使用注解 @SentinelResource 對需要進行限流和降級的接口進行配置。
其中,@SentinelResource 注解中的 value 參數(shù)為資源名稱,blockHandlerClass 和 blockHandler 分別指定了限流或降級時的處理類和方法。
3、限流和降級策略在微服務(wù)中的應(yīng)用場景

在上圖中,我們可以看到當服務(wù)請求量過大時,API Gateway 可以對服務(wù)進行限流,避免服務(wù)過載。同時,當某個服務(wù)出現(xiàn)故障或負載過高時,可以對該服務(wù)進行降級,避免影響其他服務(wù)的正常運行。
4、示例代碼
(1)添加 @SentinelResource 注解
(2)添加 @Idempotent 注解
(3)實現(xiàn)冪等性校驗邏輯
五、基于 Sentinel 的分布式鎖實現(xiàn)
1、場景描述
假設(shè)我們有一個高并發(fā)的秒殺系統(tǒng),我們需要實現(xiàn)分布式鎖來控制同一時間只能有一個用戶參與秒殺活動。為了防止死鎖和死節(jié)點,我們使用 Sentinel 的分布式鎖實現(xiàn)來保證系統(tǒng)的可用性和穩(wěn)定性。

2、實現(xiàn)步驟
(1)添加 Sentinel 的依賴到項目中:
(2)在配置文件中添加 Sentinel 的配置:
(3)在代碼中使用 Sentinel 的分布式鎖實現(xiàn):
在 Sentinel 控制臺中創(chuàng)建流控規(guī)則,限制流量:
- 在 Dashboard 中創(chuàng)建應(yīng)用。
- 在 Flow 中創(chuàng)建規(guī)則,設(shè)置限制流量的策略,例如:QPS 為 1000。
示例代碼:
六、基于 Sentinel 的 A/B 測試實現(xiàn)
1、場景描述
假設(shè)我們有一個電商網(wǎng)站,想要測試一個新的促銷活動頁面對用戶購買行為的影響。我們希望將用戶隨機分為兩個組,其中一個組將看到新的促銷頁面,另一個組將看到舊的促銷頁面。我們希望通過分析兩組用戶的購買轉(zhuǎn)化率來確定新頁面是否對提高購買轉(zhuǎn)化率有幫助。
2、實現(xiàn)步驟
- 根據(jù)用戶的請求特征將請求分組,例如使用 @SentinelResource 的 blockHandlerClass 和 blockHandler 指定請求被限流或降級時的處理類和方法,處理類中可以根據(jù)請求的特征將請求分組。
- 在新的促銷頁面和舊的促銷頁面中分別添加上報代碼,將用戶的購買行為和分組信息上報到 Sentinel。
- 在 Sentinel 控制臺中創(chuàng)建一個流控規(guī)則,將兩個組的流量分別限制在一定的范圍內(nèi),確保兩組之間的請求量基本相等。
- 分析兩組用戶的購買轉(zhuǎn)化率,確定新頁面是否對提高購買轉(zhuǎn)化率有幫助。

3、示例代碼
(1)根據(jù)請求特征將請求分組
(2)將用戶的購買行為和分組信息上報到 Sentinel
(3)在 Sentinel 控制臺中創(chuàng)建流控規(guī)則
在 Sentinel 控制臺中創(chuàng)建兩個流控規(guī)則,將兩個組的流量分別限制在一定的范圍內(nèi),可以通過配置在限流規(guī)則中添加特定的參數(shù),如 group_id=0 和 group_id=1,來將不同組的請求進行區(qū)分。
示例代碼:
- 在 Sentinel 控制臺中創(chuàng)建流控規(guī)則。
- 打開 Sentinel 控制臺,進入流控規(guī)則頁面。
- 點擊 “新建” 按鈕,填寫如下信息:
點擊 “提交” 按鈕,創(chuàng)建一個限制組 1 的流控規(guī)則;
注意事項:
在使用 Sentinel 進行 A/B 測試時,需要注意以下幾個方面:
- 將請求進行隨機分組,確保兩個組之間的請求量基本相等。
- 在 Sentinel 控制臺中創(chuàng)建流控規(guī)則,限制每個組的流量,確保流量控制的精度和正確性。
- 在上報數(shù)據(jù)時,需要將用戶的分組信息和購買行為一并上報,以便后續(xù)的數(shù)據(jù)分析。
- 在分析數(shù)據(jù)時,需要根據(jù)不同組的數(shù)據(jù)進行對比,確保分析結(jié)果的準確性。
七、總結(jié)
1、Sentinel 的局限和不足
Sentinel雖然具有很多優(yōu)點和優(yōu)勢,但也存在一些局限和不足。
例如,Sentinel對業(yè)務(wù)代碼的侵入性較大,需要在代碼中添加相關(guān)的注解或者攔截器等;同時,Sentinel的配置較為復雜,需要進行多種規(guī)則的配置和參數(shù)的調(diào)整等。
此外,Sentinel還存在一些性能問題和安全問題,需要注意規(guī)避和解決。
2、Sentinel 的發(fā)展前景
盡管Sentinel存在一些不足和局限,但隨著微服務(wù)和云原生技術(shù)的普及和發(fā)展,Sentinel在限流降級等方面的需求和重要性將會越來越大。
同時,Sentinel也在不斷地進行優(yōu)化和改進,例如在性能和安全方面進行了多項優(yōu)化和加強,同時還提供了更加方便和高效的規(guī)則擴展開發(fā)能力,可以滿足不同業(yè)務(wù)場景的需求。
因此,Sentinel在未來的發(fā)展中將會發(fā)揮越來越重要的作用,成為云原生技術(shù)生態(tài)圈中的一顆明珠。
本文轉(zhuǎn)載自微信公眾號「哪吒編程」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系哪吒編程公眾號。





























