Hello folks,今天我們介紹一下由 Spring Cloud Alibaba 推出的開源項目 Sentinel。Sentinel 是一款面向分布式、多語言異構(gòu)化服務(wù)架構(gòu)的流量治理組件,主要以流量為切入點,從流量控制、流量路由、熔斷降級、系統(tǒng)自適應(yīng)保護等多個維度來幫助用戶保障微服務(wù)的穩(wěn)定性。
Sentinel 的使用可以基于如下兩個部分:
(相關(guān)資料圖)
核心庫(Java 客戶端):不依賴任何框架/庫,能夠運行于 Java 8 及以上的版本的運行時環(huán)境,同時對 Dubbo / Spring Cloud 等框架也有較好的支持(見 主流框架適配)。控制臺(Dashboard):Dashboard 主要負責管理推送規(guī)則、監(jiān)控、管理機器信息等。在進行 Sentinel 實踐之前,我們先來了解一下其所涉及的基礎(chǔ)理論知識。主要涉及基本概念、原理等。
Sentinel 基本概念
關(guān)于 Sentinel,我們先來了解以下概念:
1、資源
資源是 Sentinel 的一項關(guān)鍵因素。其可以是 Java 應(yīng)用程序中的任何內(nèi)容,例如,由應(yīng)用程序提供的服務(wù),或由應(yīng)用程序調(diào)用的其它應(yīng)用提供的服務(wù),甚至可以是一段代碼。在接下來的文檔中,我們都會用資源來描述代碼塊。
只要通過 Sentinel API 定義的代碼,就是資源,能夠被 Sentinel 保護起來。通常情況下,我們可以使用方法簽名,URL,甚至服務(wù)名稱作為資源名來標識資源。
Sentinel 基本原理
在 Sentinel 體系里面,所有的資源都對應(yīng)一個資源名稱以及一個 Entry。Entry 可以通過對主流框架的適配自動創(chuàng)建,也可以通過注解的方式或調(diào)用 API 顯式創(chuàng)建;每一個 Entry 創(chuàng)建的時候,同時也會創(chuàng)建一系列功能插槽(slot chain)。這些插槽有不同的職責,例如:
1、NodeSelectorSlot 負責收集資源的路徑,并將這些資源的調(diào)用路徑,以樹狀結(jié)構(gòu)存儲起來,用于根據(jù)調(diào)用路徑來限流降級;
2、ClusterBuilderSlot 則用于存儲資源的統(tǒng)計信息以及調(diào)用者信息,例如該資源的 RT、QPS 以及 Thread Count 等等,這些信息將用作為多維度限流,降級的依據(jù);
3、StatisticSlot 則用于記錄、統(tǒng)計不同緯度的 Runtime 指標監(jiān)控信息;
4、FlowSlot 則用于根據(jù)預設(shè)的限流規(guī)則以及前面 Slot 統(tǒng)計的狀態(tài),來進行流量控制;
5、AuthoritySlot 則根據(jù)配置的黑白名單和調(diào)用來源信息,來做黑白名單控制;
6、DegradeSlot 則通過統(tǒng)計信息以及預設(shè)的規(guī)則,來做熔斷降級;
7、SystemSlot 則通過系統(tǒng)的狀態(tài),例如 Load 等,來控制總的入口流量。
Sentinel 總體框架如下所示:
基于上述系統(tǒng)框架所示,Sentinel 的主要工作機制可以概括如下:
1、對主流框架提供適配或者顯示的 API,來定義需要保護的資源,并提供設(shè)施對資源進行實時統(tǒng)計和調(diào)用鏈路分析。
2、根據(jù)預設(shè)的規(guī)則,結(jié)合對資源的實時統(tǒng)計信息,對流量進行控制。同時,Sentinel 提供開放的接口,方便您定義及改變規(guī)則。
3、Sentinel 提供實時的監(jiān)控系統(tǒng),方便快速了解目前系統(tǒng)的狀態(tài)。
介紹完 Sentinel 相關(guān)的理論知識后,接下來,我們進入本文的主題。
Sentinel-Dashboard 安裝
在 https://github.com/alibaba/Sentinel/releases 頁面下載最新的版本包,然后通過命令行啟動,具體如下所示:
[leonli@Leon usr ] % nohup java -jar sentinel-dashboard-1.8.6.jar > sentinel.log &[1] 2096
此時,瀏覽器中輸入:http://localhost:8080/#/login ,頁面顯示如下:
默認情況下,sentinel-dashboard 以 8080 端口啟動運行,當然可以進行配置其他端口。此處的登陸憑證信息,我們可以在 sentinel-dashboard 包中的配置文件中獲取到。
此時,我們輸入賬戶密碼(sentinel/sentinel)登錄后,可以看到如下頁面:
編寫 DemoApplication 程序
1、POM.XML 文件配置
在 Spring Cloud 應(yīng)用的 pom.xml 中引入Spring Cloud Alibaba 的 Sentinel 模塊,具體如下所示:
4.0.0 com.didispace alibaba-sentinel-rate-limiting 0.0.1-SNAPSHOT jar org.springframework.boot spring-boot-starter-parent 2.0.5.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-alibaba-sentinel org.projectlombok lombok 1.18.2 true org.springframework.boot spring-boot-starter-test test org.springframework.cloud spring-cloud-dependencies Finchley.SR1 pom import org.springframework.cloud spring-cloud-alibaba-dependencies 0.2.2.RELEASE pom import org.springframework.boot spring-boot-maven-plugin
2、Resource 定義
在 Spring Cloud 應(yīng)用中通過 spring.cloud.sentinel.transport.dashboard 參數(shù)配置 sentinel dashboard 的訪問地址。通常在 application.properties 或 yml 文件中定義,具體如下所示:
spring.application.name=alibaba-sentinel-rate-limitingserver.port=8001# sentinel dashboardspring.cloud.sentinel.transport.dashboard=localhost:8080
3、編寫 Demo 代碼
創(chuàng)建應(yīng)用主類,并提供一個 Rest 接口,具體如下所示:
package com.leon.alibaba.sentinel;import lombok.extern.slf4j.Slf4j;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Slf4j @RestController static class DemoController { @GetMapping("/devops") public String devops() { return "Starting DemoApplication on leon.com.cn"; } }}
完成后,啟動程序,如下所示:
此時,通過后臺進行 Curl 命令操作,有結(jié)果返回。具體如下所示:
[leonli@Leon usr ] % curl -i http://localhost:8001/devops/HTTP/1.1 200 Content-Type: text/plain;charset=UTF-8Content-Length: 39Date: Wed, 16 Nov 2022 14:40:16 GMTStarting DemoApplication on leon.com.cn
再次進入 Sentinel-Dashboard 頁面,可以看到如下:
Sentinel 限流實踐
接下來,點擊左側(cè)的“簇點鏈路”菜單欄目,基于所調(diào)用的 /devops 接口進行“流控”操作,以配置自定義的限流規(guī)則,具體如下所示:
點擊“流控”操作后,彈出新增流控規(guī)則窗口,如下:
點擊“新增”按鈕后,進入流控規(guī)則頁面,這里我們基于 QPS 指標,每秒最多允許“ 5 個請求進入”此限流規(guī)則進行策略定義。所設(shè)置的限流規(guī)則將會顯示在列表中,此列表顯示所有規(guī)則,并可以對其進行更新操作。
接下來,我們來驗證一下這個限流規(guī)則,我們可以嘗試一下借用 Curl 命令行快速的調(diào)用此接口,以確認其是否會觸發(fā)限流控制,具體如下所示:
[leonli@Leon ~ ] % curl http://192.168.0.102:8001/devopsStarting DemoApplication on leon.com.cn [leonli@Leon ~ ] % curl http://192.168.0.102:8001/devopsStarting DemoApplication on leon.com.cn [leonli@Leon ~ ] % curl http://192.168.0.102:8001/devopsStarting DemoApplication on leon.com.cn [leonli@Leon ~ ] % curl http://192.168.0.102:8001/devopsStarting DemoApplication on leon.com.cn [leonli@Leon ~ ] % curl http://192.168.0.102:8001/devopsBlocked by Sentinel (flow limiting)
基于上述的測試結(jié)果:我們發(fā)現(xiàn),快速的進行五次 “/deveops” 調(diào)用接口之后,第六次調(diào)用時被 Sentinel 阻塞了,即進行流量管控。
如上為 Sentinel 及 Dashboard 的 限流實踐解析,希望對大家有用。關(guān)于 Sentinel更多需要了解的信息,歡迎大家交流、關(guān)注!
Adiós !
- EOF -