一、Sentinel簡介
??Sentinel 是面向分布式服務架構的輕量級流量控制產品,主要以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度來幫助您保護服務的穩(wěn)定性。
??Sentinel 可以簡單的分為 Sentinel 核心庫和 Dashboard。核心庫不依賴 Dashboard,但是結合 Dashboard 可以取得最好的效果。
文檔:https://github.com/alibaba/Sentinel/wiki
- Sentinel 和之前常用的熔斷降級庫 Netflix Hystrix 有什么異同呢?
對比內容| Sentinel |Hystrix
:---|:---|:---
隔離策略 |信號量隔離 |線程池隔離/信號量隔離
熔斷降級策略 |基于響應時間或失敗比率 |基于失敗比率
實時指標實現| 滑動窗口 |滑動窗口(基于 RxJava)
規(guī)則配置| 支持多種數據源 |支持多種數據源
擴展性| 多個擴展點| 插件的形式
基于注解的支持 |支持| 支持
限流 |基于 QPS,支持基于調用關系的限流| 不支持
流量整形| 支持慢啟動、勻速器模式 |不支持
系統負載保護| 支持| 不支持
控制臺| 開箱即用,可配置規(guī)則、查看秒級監(jiān)控、機器發(fā)現等 |不完善
常見框架的適配| Servlet、Spring Cloud、Dubbo、gRPC 等 |Servlet、Spring Cloud Netflix - Sentinel 控制臺最少應該包含如下功能:
查看機器列表以及健康情況:收集 Sentinel 客戶端發(fā)送的心跳包,用于判斷機器是否在線。
監(jiān)控 (單機和集群聚合):通過 Sentinel 客戶端暴露的監(jiān)控 API,定期拉取并且聚合應用監(jiān)控信息,最終可以實現秒級的實時監(jiān)控。
規(guī)則管理和推送:統一管理推送規(guī)則。
鑒權:生產環(huán)境中鑒權非常重要。這里每個開發(fā)者需要根據自己的實際情況進行定制。
二、Sentinel 基本概念
- 資源
資源是 Sentinel 的關鍵概念。它可以是 Java 應用程序中的任何內容,例如,由應用程序提供的服務,或由應用程序調用的其它應用提供的服務,甚至可以是一段代碼。
只要通過 Sentinel API 定義的代碼,就是資源,能夠被 Sentinel 保護起來。大部分情況下,可以使用方法簽名,URL,甚至服務名稱作為資源名來標示資源。 - 規(guī)則
圍繞資源的實時狀態(tài)設定的規(guī)則,可以包括流量控制規(guī)則、熔斷降級規(guī)則以及系統保護規(guī)則。所有規(guī)則可以動態(tài)實時調整。
三、Sentinel 功能和設計理念
-
流量控制
??流量控制在網絡傳輸中是一個常用的概念,它用于調整網絡包的發(fā)送數據。然而,從系統穩(wěn)定性角度考慮,在處理請求的速度上,也有非常多的講究。任意時間到來的請求往往是隨機不可控的,而系統的處理能力是有限的。我們需要根據系統的處理能力對流量進行控制。Sentinel 作為一個調配器,可以根據需要把隨機的請求調整成合適的形狀,如下圖所示:
流量控制 流量控制設計理念
流量控制有以下幾個角度:
資源的調用關系,例如資源的調用鏈路,資源和資源之間的關系;
運行指標,例如 QPS、線程池、系統負載等;
控制的效果,例如直接限流、冷啟動、排隊等。
Sentinel 的設計理念是讓您自由選擇控制的角度,并進行靈活組合,從而達到想要的效果。-
熔斷降級
??除了流量控制以外,降低調用鏈路中的不穩(wěn)定資源也是 Sentinel 的使命之一。由于調用關系的復雜性,如果調用鏈路中的某個資源出現了不穩(wěn)定,最終會導致請求發(fā)生堆積。這個問題和 Hystrix 里面描述的問題是一樣的。
熔斷降級
??Sentinel 和 Hystrix 的原則是一致的: 當調用鏈路中某個資源出現不穩(wěn)定,例如,表現為 timeout,異常比例升高的時候,則對這個資源的調用進行限制,并讓請求快速失敗,避免影響到其它的資源,最終產生雪崩的效果。
Hystrix 通過線程池的方式,來對依賴(在我們的概念中對應資源)進行了隔離。這樣做的好處是資源和資源之間做到了最徹底的隔離。缺點是除了增加了線程切換的成本,還需要預先給各個資源做線程池大小的分配。
Sentinel 對這個問題采取了兩種手段:
- 通過并發(fā)線程數進行限制
和資源池隔離的方法不同,Sentinel 通過限制資源并發(fā)線程的數量,來減少不穩(wěn)定資源對其它資源的影響。這樣不但沒有線程切換的損耗,也不需要您預先分配線程池的大小。當某個資源出現不穩(wěn)定的情況下,例如響應時間變長,對資源的直接影響就是會造成線程數的逐步堆積。當線程數在特定資源上堆積到一定的數量之后,對該資源的新請求就會被拒絕。堆積的線程完成任務后才開始繼續(xù)接收請求。- 通過響應時間對資源進行降級
除了對并發(fā)線程數進行控制以外,Sentinel 還可以通過響應時間來快速降級不穩(wěn)定的資源。當依賴的資源出現響應時間過長后,所有對該資源的訪問都會被直接拒絕,直到過了指定的時間窗口之后才重新恢復。
- 系統負載保護
??Sentinel 同時對系統的維度提供保護。防止雪崩,是系統防護中重要的一環(huán)。當系統負載較高的時候,如果還持續(xù)讓請求進入,可能會導致系統崩潰,無法響應。在集群環(huán)境下,網絡負載均衡會把本應這臺機器承載的流量轉發(fā)到其它的機器上去。如果這個時候其它的機器也處在一個邊緣狀態(tài)的時候,這個增加的流量就會導致這臺機器也崩潰,最后導致整個集群不可用。
針對這個情況,Sentinel 提供了對應的保護機制,讓系統的入口流量和系統的負載達到一個平衡,保證系統在能力范圍之內處理最多的請求。
二、下載啟動
- 下載地址
https://github.com/alibaba/Sentinel/releases
下載Jar
[root@localhost ~]# wget https://github.com/alibaba/Sentinel/releases/download/1.6.3/sentinel-dashboard-1.6.3.jar
# 啟動
[root@localhost ~]# java -Dserver.port=8858 -Dcsp.sentinel.dashboard.server=localhost:8858 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.6.3.jar
# 后臺啟動
[root@localhost ~]# nohup java -Dserver.port=8858 -Dcsp.sentinel.dashboard.server=localhost:8858 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.6.3.jar &
其中 -Dserver.port=8080 用于指定 Sentinel 控制臺端口為 8080。
從 Sentinel 1.6.0 起,Sentinel 控制臺引入基本的登錄功能,默認用戶名和密碼都是 sentinel
- 使用Docker運行(開發(fā)模式推薦):
# 拉取鏡像
[root@192 ~]# docker pull bladex/sentinel-dashboard
# 運行鏡像
[root@192 ~]# docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard
d0e107c5498095607720ff4cbbdfe7454ed4000ceb3f092ff2d0e6e62ef2321b
- 訪問地址
- dashboard 地址:http://localhost:8858
-
賬號密碼都為:sentinel
登錄訪問
主頁面
三、客戶端接入控制臺
- 引入JAR包
??客戶端需要引入 Transport 模塊來與 Sentinel 控制臺進行通信。您可以通過 pom.xml 引入 JAR 包:
<!--sentinel限流-->
<!--與控制臺通訊包-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.4.1</version>
</dependency>
<!--dubbo 接入插件-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-dubbo-adapter</artifactId>
<version>1.4.1</version>
</dependency>
<!--sentinel注解-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.4.1</version>
</dependency>
<!--熱點流控包-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-parameter-flow-control</artifactId>
<version>1.4.1</version>
</dependency>
配置啟動參數
??啟動時加入 JVM 參數 -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制臺地址和端口。若啟動多個應用,則需要通過 -Dcsp.sentinel.api.port=xxxx 指定客戶端監(jiān)控 API 的端口(默認是 8719)。用戶可以通過如下參數進行配置:
-Dsentinel.dashboard.auth.username=sentinel 用于指定控制臺的登錄用戶名為 sentinel;
-Dsentinel.dashboard.auth.password=123456 用于指定控制臺的登錄密碼為 123456;如果省略這兩個參數,默認用戶和密碼均為 sentinel;
-Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服務端 session 的過期時間,如 7200 表示 7200 秒;60m 表示 60 分鐘,默認為 30 分鐘;
同樣也可以直接在 Spring properties 文件中進行配置。
四、查看機器列表以及健康情況

五、監(jiān)控
-
"簇點鏈路"中顯示剛剛調用的資源(單機實時)
注意: 簇點監(jiān)控是內存態(tài)的信息,它僅展示啟動后調用過的資源。
簇點鏈路 -
"實時監(jiān)控"匯總資源信息(集群聚合)
注意: 實時監(jiān)控僅存儲 5 分鐘以內的數據,如果需要持久化,需要通過調用實時監(jiān)控接口來定制。
實時監(jiān)控
注意:請確保 Sentinel 控制臺所在的機器時間與自己應用的機器時間保持一致,否則會導致拉不到實時的監(jiān)控數據。
六、規(guī)則管理及推送
Sentinel 控制臺同時提供簡單的規(guī)則管理以及推送的功能。規(guī)則推送分為 3 種模式,包括 "原始模式"、"Pull 模式" 和"Push 模式"。






