一萬字圖解分布式系統(tǒng)限流平臺(tái)Sentinel
大家好,我是哪吒。
Sentinel是阿里巴巴開源的一款輕量級(jí)流量控制、熔斷降級(jí)工具,它提供了實(shí)時(shí)的流量控制,熔斷降級(jí)等功能,能夠幫助我們實(shí)現(xiàn)服務(wù)的高可用性和穩(wěn)定性。
本文將會(huì)介紹Sentinel的作用和優(yōu)勢(shì)、快速開始、進(jìn)階使用、Spring Cloud Alibaba Sentinel整合以及實(shí)踐案例,并對(duì)Sentinel的局限和不足進(jìn)行分析。
一、前言
1、關(guān)于 Sentinel
Sentinel 是阿里巴巴開源的一款針對(duì)分布式系統(tǒng)的流量控制、熔斷降級(jí)的框架。在微服務(wù)架構(gòu)的系統(tǒng)中,請(qǐng)求流量復(fù)雜多樣,可能會(huì)因?yàn)槟骋粋€(gè)服務(wù)異常而導(dǎo)致整體服務(wù)不可用,這時(shí)候需要熔斷降級(jí),而 Sentinel 就提供了這樣的解決方案。
2、Sentinel 的作用和優(yōu)勢(shì)
Sentinel 可以針對(duì)服務(wù)方法調(diào)用、HTTP 請(qǐng)求、Dubbo 服務(wù)等,進(jìn)行實(shí)時(shí)的流量控制、熔斷降級(jí),確保服務(wù)高可用,同時(shí)還可以提供實(shí)時(shí)的監(jiān)控和報(bào)警功能。
Sentinel 有以下一些優(yōu)勢(shì):
- 豐富的應(yīng)用場(chǎng)景和細(xì)粒度的控制: Sentinel 支持多種應(yīng)用場(chǎng)景,包括熔斷降級(jí)、流量控制、系統(tǒng)保護(hù)、熱點(diǎn)參數(shù)限流等,而且可以實(shí)現(xiàn)細(xì)粒度的控制;
- 強(qiáng)大的實(shí)時(shí)監(jiān)測(cè)機(jī)制: Sentinel 提供了實(shí)時(shí)的監(jiān)測(cè)、報(bào)警機(jī)制,能夠?qū)ο到y(tǒng)運(yùn)行情況進(jìn)行實(shí)時(shí)檢測(cè)和通知,發(fā)現(xiàn)問題更加及時(shí);
- 易于擴(kuò)展: Sentinel 為開發(fā)者提供了簡(jiǎn)單易用的擴(kuò)展接口,開發(fā)者可以方便的實(shí)現(xiàn)自定義的控制和監(jiān)測(cè)邏輯;
- 易于集成: Sentinel 支持多種開發(fā)框架,包括 Spring Cloud、Dubbo、Feign 等,開發(fā)者可以很方便的將 Sentinel 集成到自己的應(yīng)用中;
3、本文目的和內(nèi)容概述
本文將為讀者介紹 Sentinel 的基礎(chǔ)和進(jìn)階使用方法,包括
- 如何配置 Sentinel 控制臺(tái);
- 如何編寫并測(cè)試 Sentinel 規(guī)則、如何使用自定義 Sentinel 規(guī)則擴(kuò)展開發(fā);
- 介紹 Sentinel 和 Spring Cloud Alibaba 的整合方法,并且給出了一些 Sentinel 實(shí)踐案例供讀者參考。
本文的目的是幫助讀者快速上手使用 Sentinel,并且深入理解其基本原理和使用方法。同時(shí),也希望能夠?qū)ψx者們的日常工作有所幫助。
二、快速開始
1、環(huán)境準(zhǔn)備
在開始使用 Sentinel 之前,我們需要準(zhǔn)備好以下環(huán)境:
- JDK 1.8 或更高版本
- Maven 3.0 或更高版本
- Sentinel-dashboard
2、引入 Sentinel 依賴
3、配置 Sentinel 控制臺(tái)
在Sentinel的官網(wǎng)下載最新的控制臺(tái)jar包,然后在控制臺(tái)目錄下執(zhí)行以下命令啟動(dòng)控制臺(tái):
啟動(dòng)成功后,可以通過瀏覽器訪問http://localhost:8080/#/dashboard/home查看控制臺(tái)頁(yè)面。
4、注冊(cè)應(yīng)用到 Sentinel 控制臺(tái)
在應(yīng)用啟動(dòng)類上添加注解@EnableSentinel注解,然后在配置文件中配置應(yīng)用名稱和Sentinel控制臺(tái)的地址:
5、編寫并測(cè)試 Sentinel 規(guī)則
Sentinel提供了多種限流降級(jí)策略,本文以流控規(guī)則為例進(jìn)行演示。
在需要限流的方法上添加@SentinelResource注解,然后配置流控規(guī)則:
在控制臺(tái)的流控規(guī)則頁(yè)面添加對(duì)應(yīng)的規(guī)則,設(shè)置好閾值和統(tǒng)計(jì)窗口等參數(shù),然后測(cè)試該接口。
三、進(jìn)階使用
1、Sentinel Dashboard 使用詳解
Sentinel Dashboard是Sentinel的可視化監(jiān)控平臺(tái),可以用于實(shí)時(shí)監(jiān)控應(yīng)用的流量、延遲、異常等指標(biāo),并對(duì)應(yīng)用進(jìn)行限流降級(jí)等操作。
Sentinel客戶端首先向Sentinel Dashboard注冊(cè)。Sentinel Dashboard返回一個(gè)token給客戶端,客戶端將使用該token連接Sentinel。
應(yīng)用程序?qū)⑹褂胻oken連接Sentinel,Sentinel客戶端將返回連接成功信息。Sentinel客戶端將實(shí)時(shí)推送metrics數(shù)據(jù)到Sentinel Dashboard,Sentinel Dashboard將監(jiān)控和管理應(yīng)用程序。
2、入門級(jí)規(guī)則配置詳解(流控規(guī)則、降級(jí)規(guī)則、熱點(diǎn)參數(shù)限流)
Sentinel是一款開源的流量控制和降級(jí)框架,提供多種限流降級(jí)策略,包括流控規(guī)則、降級(jí)規(guī)則、熱點(diǎn)參數(shù)限流等。
下面將逐一介紹這些規(guī)則。
(1)流控規(guī)則
流控規(guī)則用于限制系統(tǒng)的流量,可以通過設(shè)置QPS流量控制和線程數(shù)流量控制等方式來控制系統(tǒng)的訪問速度。
在Sentinel Dashboard中,可以通過以下步驟來配置和管理流控規(guī)則:
- 設(shè)置流控模式:可以選擇直接拒絕、Warm Up、勻速排隊(duì)等模式。
- 設(shè)置閾值:可以設(shè)置QPS、線程數(shù)等閾值來限制流量。
- 設(shè)置流控策略:可以選擇按照調(diào)用關(guān)系、鏈路入口等策略來限制流量。
- 查看已有規(guī)則:可以查看已經(jīng)存在的流控規(guī)則,并進(jìn)行管理和修改。
(2)降級(jí)規(guī)則
降級(jí)規(guī)則用于應(yīng)對(duì)系統(tǒng)的異常情況,可以通過設(shè)置異常比例降級(jí)、異常數(shù)降級(jí)和慢調(diào)用降級(jí)等方式來降低系統(tǒng)的負(fù)載。
在Sentinel Dashboard中,可以通過以下步驟來配置和管理降級(jí)規(guī)則:
- 設(shè)置降級(jí)模式:可以選擇異常比例、異常數(shù)和慢調(diào)用三種模式。
- 設(shè)置閾值:可以設(shè)置異常比例、異常數(shù)和慢調(diào)用時(shí)間等閾值來觸發(fā)降級(jí)。
- 設(shè)置降級(jí)策略:可以選擇返回特定的錯(cuò)誤信息、調(diào)用備用服務(wù)等策略來處理降級(jí)情況。
- 查看已有規(guī)則:可以查看已經(jīng)存在的降級(jí)規(guī)則,并進(jìn)行管理和修改。
(3)熱點(diǎn)參數(shù)限流
熱點(diǎn)參數(shù)限流用于對(duì)熱點(diǎn)參數(shù)進(jìn)行限流,可以有效避免某些參數(shù)被過多地請(qǐng)求。在Sentinel Dashboard中,可以通過以下步驟來配置和管理熱點(diǎn)參數(shù)限流規(guī)則:
- 設(shè)置參數(shù):可以選擇需要進(jìn)行限流的參數(shù)。
- 設(shè)置閾值:可以設(shè)置QPS、線程數(shù)等閾值來限制熱點(diǎn)參數(shù)的訪問速度。
- 設(shè)置限流策略:可以選擇直接拒絕、勻速排隊(duì)等策略來處理熱點(diǎn)參數(shù)限流。
- 查看已有規(guī)則:可以查看已經(jīng)存在的熱點(diǎn)參數(shù)限流規(guī)則,并進(jìn)行管理和修改。
在使用這些規(guī)則時(shí),需要注意參數(shù)設(shè)置和閾值設(shè)置等細(xì)節(jié),以避免規(guī)則的誤判或限流不準(zhǔn)確等問題。
通過Sentinel Dashboard的可視化界面,可以方便地進(jìn)行規(guī)則的配置和管理,提高系統(tǒng)的穩(wěn)定性和可靠性。
3、資源名與 URL 匹配規(guī)則
Sentinel的資源名和URL匹配規(guī)則是限流降級(jí)策略的重要組成部分,可以根據(jù)業(yè)務(wù)需求定義合適的匹配規(guī)則。
- 資源名:可以是一個(gè)具體的業(yè)務(wù)方法、一個(gè)接口URL或者一個(gè)Dubbo服務(wù)等。
- URL 匹配規(guī)則:支持Ant匹配和正則匹配兩種方式,可以根據(jù)具體需求進(jìn)行選擇。
- Dubbo服務(wù):Sentinel支持對(duì)Dubbo服務(wù)進(jìn)行限流降級(jí)操作,需要在Dubbo配置文件中添加Sentinel的攔截器配置。
- 在定義資源名和URL匹配規(guī)則時(shí),需要注意合理性和精確性,以避免出現(xiàn)誤判或限流不準(zhǔn)確等問題。
上圖展示了應(yīng)用程序代碼中定義資源名和 URL 匹配規(guī)則時(shí)的交互過程。
應(yīng)用程序通過 Sentinel 客戶端向 Sentinel 發(fā)送配置請(qǐng)求,Sentinel 返回配置結(jié)果。應(yīng)用程序根據(jù)配置結(jié)果使用 Sentinel 進(jìn)行限流降級(jí)。
在這個(gè)過程中,應(yīng)用程序需要注意合理性和精確性,以避免出現(xiàn)誤判或限流不準(zhǔn)確等問題。
4、自定義 Sentinel 規(guī)則擴(kuò)展開發(fā)
上圖是自定義規(guī)則擴(kuò)展的關(guān)系圖示。
自定義規(guī)則擴(kuò)展包括數(shù)據(jù)源擴(kuò)展、限流降級(jí)規(guī)則擴(kuò)展、規(guī)則統(tǒng)計(jì)擴(kuò)展等,可以使用多種語(yǔ)言進(jìn)行開發(fā)。
在進(jìn)行規(guī)則擴(kuò)展時(shí),需要注意代碼質(zhì)量和性能,以保證擴(kuò)展的準(zhǔn)確性和有效性。
以下是一個(gè)自定義規(guī)則類型的示例:
在這個(gè)示例中,我們自定義了一個(gè) CustomFlowRule 類型,它包含了 resourceName、count 和 interval 三個(gè)屬性。同時(shí),我們實(shí)現(xiàn)了 FlowRule 接口,并實(shí)現(xiàn)了其中的各個(gè)方法,以滿足 Sentinel 對(duì)規(guī)則類型的要求。
使用這個(gè)自定義規(guī)則類型時(shí),我們需要在代碼中添加相關(guān)的配置,例如:
在這個(gè)示例中,我們通過 CustomFlowRule 類型創(chuàng)建了一個(gè)規(guī)則,它的資源名稱為 custom_resource,限流閾值為 10,時(shí)間間隔為 1 秒。然后我們將這個(gè)規(guī)則添加到 Sentinel 的規(guī)則管理器中,從而讓 Sentinel 能夠自動(dòng)識(shí)別和使用這個(gè)規(guī)則。
四、Spring Cloud Alibaba Sentinel 整合
1、Sentinel Starter 簡(jiǎn)介
Sentinel Starter是Spring Cloud Alibaba Sentinel的快速入門依賴,提供了自動(dòng)化配置和默認(rèn)規(guī)則等能力,可以簡(jiǎn)化Sentinel在Spring Cloud中的使用。
在使用Sentinel Starter時(shí),只需要添加依賴并在配置文件中配置相應(yīng)的參數(shù),即可快速實(shí)現(xiàn)Sentinel的限流降級(jí)功能。
2、使用 Sentinel Starter 整合 Spring Cloud 微服務(wù)
(1)在Spring Boot項(xiàng)目中添加以下依賴:
(2)在application.yml配置文件中添加以下配置:
(3)在代碼中添加注解 @EnableSentinel ,開啟 Sentinel 功能。
(4)使用注解 @SentinelResource 對(duì)需要進(jìn)行限流和降級(jí)的接口進(jìn)行配置。
其中,@SentinelResource 注解中的 value 參數(shù)為資源名稱,blockHandlerClass 和 blockHandler 分別指定了限流或降級(jí)時(shí)的處理類和方法。
3、限流和降級(jí)策略在微服務(wù)中的應(yīng)用場(chǎng)景
在上圖中,我們可以看到當(dāng)服務(wù)請(qǐng)求量過大時(shí),API Gateway 可以對(duì)服務(wù)進(jìn)行限流,避免服務(wù)過載。同時(shí),當(dāng)某個(gè)服務(wù)出現(xiàn)故障或負(fù)載過高時(shí),可以對(duì)該服務(wù)進(jìn)行降級(jí),避免影響其他服務(wù)的正常運(yùn)行。
4、示例代碼
(1)添加 @SentinelResource 注解
(2)添加 @Idempotent 注解
(3)實(shí)現(xiàn)冪等性校驗(yàn)邏輯
五、基于 Sentinel 的分布式鎖實(shí)現(xiàn)
1、場(chǎng)景描述
假設(shè)我們有一個(gè)高并發(fā)的秒殺系統(tǒng),我們需要實(shí)現(xiàn)分布式鎖來控制同一時(shí)間只能有一個(gè)用戶參與秒殺活動(dòng)。為了防止死鎖和死節(jié)點(diǎn),我們使用 Sentinel 的分布式鎖實(shí)現(xiàn)來保證系統(tǒng)的可用性和穩(wěn)定性。
2、實(shí)現(xiàn)步驟
(1)添加 Sentinel 的依賴到項(xiàng)目中:
(2)在配置文件中添加 Sentinel 的配置:
(3)在代碼中使用 Sentinel 的分布式鎖實(shí)現(xiàn):
在 Sentinel 控制臺(tái)中創(chuàng)建流控規(guī)則,限制流量:
- 在 Dashboard 中創(chuàng)建應(yīng)用。
- 在 Flow 中創(chuàng)建規(guī)則,設(shè)置限制流量的策略,例如:QPS 為 1000。
示例代碼:
六、基于 Sentinel 的 A/B 測(cè)試實(shí)現(xiàn)
1、場(chǎng)景描述
假設(shè)我們有一個(gè)電商網(wǎng)站,想要測(cè)試一個(gè)新的促銷活動(dòng)頁(yè)面對(duì)用戶購(gòu)買行為的影響。我們希望將用戶隨機(jī)分為兩個(gè)組,其中一個(gè)組將看到新的促銷頁(yè)面,另一個(gè)組將看到舊的促銷頁(yè)面。我們希望通過分析兩組用戶的購(gòu)買轉(zhuǎn)化率來確定新頁(yè)面是否對(duì)提高購(gòu)買轉(zhuǎn)化率有幫助。
2、實(shí)現(xiàn)步驟
- 根據(jù)用戶的請(qǐng)求特征將請(qǐng)求分組,例如使用 @SentinelResource 的 blockHandlerClass 和 blockHandler 指定請(qǐng)求被限流或降級(jí)時(shí)的處理類和方法,處理類中可以根據(jù)請(qǐng)求的特征將請(qǐng)求分組。
- 在新的促銷頁(yè)面和舊的促銷頁(yè)面中分別添加上報(bào)代碼,將用戶的購(gòu)買行為和分組信息上報(bào)到 Sentinel。
- 在 Sentinel 控制臺(tái)中創(chuàng)建一個(gè)流控規(guī)則,將兩個(gè)組的流量分別限制在一定的范圍內(nèi),確保兩組之間的請(qǐng)求量基本相等。
- 分析兩組用戶的購(gòu)買轉(zhuǎn)化率,確定新頁(yè)面是否對(duì)提高購(gòu)買轉(zhuǎn)化率有幫助。
3、示例代碼
(1)根據(jù)請(qǐng)求特征將請(qǐng)求分組
(2)將用戶的購(gòu)買行為和分組信息上報(bào)到 Sentinel
(3)在 Sentinel 控制臺(tái)中創(chuàng)建流控規(guī)則
在 Sentinel 控制臺(tái)中創(chuàng)建兩個(gè)流控規(guī)則,將兩個(gè)組的流量分別限制在一定的范圍內(nèi),可以通過配置在限流規(guī)則中添加特定的參數(shù),如 group_id=0 和 group_id=1,來將不同組的請(qǐng)求進(jìn)行區(qū)分。
示例代碼:
- 在 Sentinel 控制臺(tái)中創(chuàng)建流控規(guī)則。
- 打開 Sentinel 控制臺(tái),進(jìn)入流控規(guī)則頁(yè)面。
- 點(diǎn)擊 “新建” 按鈕,填寫如下信息:
點(diǎn)擊 “提交” 按鈕,創(chuàng)建一個(gè)限制組 1 的流控規(guī)則;
注意事項(xiàng):
在使用 Sentinel 進(jìn)行 A/B 測(cè)試時(shí),需要注意以下幾個(gè)方面:
- 將請(qǐng)求進(jìn)行隨機(jī)分組,確保兩個(gè)組之間的請(qǐng)求量基本相等。
- 在 Sentinel 控制臺(tái)中創(chuàng)建流控規(guī)則,限制每個(gè)組的流量,確保流量控制的精度和正確性。
- 在上報(bào)數(shù)據(jù)時(shí),需要將用戶的分組信息和購(gòu)買行為一并上報(bào),以便后續(xù)的數(shù)據(jù)分析。
- 在分析數(shù)據(jù)時(shí),需要根據(jù)不同組的數(shù)據(jù)進(jìn)行對(duì)比,確保分析結(jié)果的準(zhǔn)確性。
七、總結(jié)
1、Sentinel 的局限和不足
Sentinel雖然具有很多優(yōu)點(diǎn)和優(yōu)勢(shì),但也存在一些局限和不足。
例如,Sentinel對(duì)業(yè)務(wù)代碼的侵入性較大,需要在代碼中添加相關(guān)的注解或者攔截器等;同時(shí),Sentinel的配置較為復(fù)雜,需要進(jìn)行多種規(guī)則的配置和參數(shù)的調(diào)整等。
此外,Sentinel還存在一些性能問題和安全問題,需要注意規(guī)避和解決。
2、Sentinel 的發(fā)展前景
盡管Sentinel存在一些不足和局限,但隨著微服務(wù)和云原生技術(shù)的普及和發(fā)展,Sentinel在限流降級(jí)等方面的需求和重要性將會(huì)越來越大。
同時(shí),Sentinel也在不斷地進(jìn)行優(yōu)化和改進(jìn),例如在性能和安全方面進(jìn)行了多項(xiàng)優(yōu)化和加強(qiáng),同時(shí)還提供了更加方便和高效的規(guī)則擴(kuò)展開發(fā)能力,可以滿足不同業(yè)務(wù)場(chǎng)景的需求。
因此,Sentinel在未來的發(fā)展中將會(huì)發(fā)揮越來越重要的作用,成為云原生技術(shù)生態(tài)圈中的一顆明珠。
本文轉(zhuǎn)載自微信公眾號(hào)「哪吒編程」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系哪吒編程公眾號(hào)。