一琼了、Sentinel簡介
??Sentinel 是面向分布式服務(wù)架構(gòu)的輕量級流量控制產(chǎn)品赞辩,主要以流量為切入點,從流量控制瓶堕、熔斷降級、系統(tǒng)負(fù)載保護等多個維度來幫助您保護服務(wù)的穩(wěn)定性症歇。
??Sentinel 可以簡單的分為 Sentinel 核心庫和 Dashboard郎笆。核心庫不依賴 Dashboard,但是結(jié)合 Dashboard 可以取得最好的效果忘晤。
文檔:https://github.com/alibaba/Sentinel/wiki
- Sentinel 和之前常用的熔斷降級庫 Netflix Hystrix 有什么異同呢宛蚓?
對比內(nèi)容| Sentinel |Hystrix
:---|:---|:---
隔離策略 |信號量隔離 |線程池隔離/信號量隔離
熔斷降級策略 |基于響應(yīng)時間或失敗比率 |基于失敗比率
實時指標(biāo)實現(xiàn)| 滑動窗口 |滑動窗口(基于 RxJava)
規(guī)則配置| 支持多種數(shù)據(jù)源 |支持多種數(shù)據(jù)源
擴展性| 多個擴展點| 插件的形式
基于注解的支持 |支持| 支持
限流 |基于 QPS,支持基于調(diào)用關(guān)系的限流| 不支持
流量整形| 支持慢啟動设塔、勻速器模式 |不支持
系統(tǒng)負(fù)載保護| 支持| 不支持
控制臺| 開箱即用凄吏,可配置規(guī)則、查看秒級監(jiān)控闰蛔、機器發(fā)現(xiàn)等 |不完善
常見框架的適配| Servlet痕钢、Spring Cloud、Dubbo钞护、gRPC 等 |Servlet盖喷、Spring Cloud Netflix - Sentinel 控制臺最少應(yīng)該包含如下功能:
查看機器列表以及健康情況:收集 Sentinel 客戶端發(fā)送的心跳包,用于判斷機器是否在線难咕。
監(jiān)控 (單機和集群聚合):通過 Sentinel 客戶端暴露的監(jiān)控 API,定期拉取并且聚合應(yīng)用監(jiān)控信息距辆,最終可以實現(xiàn)秒級的實時監(jiān)控余佃。
規(guī)則管理和推送:統(tǒng)一管理推送規(guī)則。
鑒權(quán):生產(chǎn)環(huán)境中鑒權(quán)非常重要跨算。這里每個開發(fā)者需要根據(jù)自己的實際情況進行定制爆土。
二哮幢、Sentinel 基本概念
- 資源
資源是 Sentinel 的關(guān)鍵概念慨飘。它可以是 Java 應(yīng)用程序中的任何內(nèi)容,例如妈嘹,由應(yīng)用程序提供的服務(wù)背犯,或由應(yīng)用程序調(diào)用的其它應(yīng)用提供的服務(wù)坏瘩,甚至可以是一段代碼。
只要通過 Sentinel API 定義的代碼漠魏,就是資源倔矾,能夠被 Sentinel 保護起來。大部分情況下,可以使用方法簽名哪自,URL丰包,甚至服務(wù)名稱作為資源名來標(biāo)示資源。 - 規(guī)則
圍繞資源的實時狀態(tài)設(shè)定的規(guī)則壤巷,可以包括流量控制規(guī)則邑彪、熔斷降級規(guī)則以及系統(tǒng)保護規(guī)則。所有規(guī)則可以動態(tài)實時調(diào)整胧华。
三寄症、Sentinel 功能和設(shè)計理念
-
流量控制
??流量控制在網(wǎng)絡(luò)傳輸中是一個常用的概念,它用于調(diào)整網(wǎng)絡(luò)包的發(fā)送數(shù)據(jù)撑柔。然而瘸爽,從系統(tǒng)穩(wěn)定性角度考慮,在處理請求的速度上铅忿,也有非常多的講究剪决。任意時間到來的請求往往是隨機不可控的,而系統(tǒng)的處理能力是有限的檀训。我們需要根據(jù)系統(tǒng)的處理能力對流量進行控制柑潦。Sentinel 作為一個調(diào)配器,可以根據(jù)需要把隨機的請求調(diào)整成合適的形狀峻凫,如下圖所示:
流量控制 流量控制設(shè)計理念
流量控制有以下幾個角度:
資源的調(diào)用關(guān)系渗鬼,例如資源的調(diào)用鏈路,資源和資源之間的關(guān)系荧琼;
運行指標(biāo)譬胎,例如 QPS、線程池命锄、系統(tǒng)負(fù)載等堰乔;
控制的效果,例如直接限流脐恩、冷啟動镐侯、排隊等。
Sentinel 的設(shè)計理念是讓您自由選擇控制的角度驶冒,并進行靈活組合苟翻,從而達到想要的效果。-
熔斷降級
??除了流量控制以外骗污,降低調(diào)用鏈路中的不穩(wěn)定資源也是 Sentinel 的使命之一崇猫。由于調(diào)用關(guān)系的復(fù)雜性,如果調(diào)用鏈路中的某個資源出現(xiàn)了不穩(wěn)定身堡,最終會導(dǎo)致請求發(fā)生堆積邓尤。這個問題和 Hystrix 里面描述的問題是一樣的。
熔斷降級
??Sentinel 和 Hystrix 的原則是一致的: 當(dāng)調(diào)用鏈路中某個資源出現(xiàn)不穩(wěn)定,例如汞扎,表現(xiàn)為 timeout季稳,異常比例升高的時候,則對這個資源的調(diào)用進行限制澈魄,并讓請求快速失敗景鼠,避免影響到其它的資源,最終產(chǎn)生雪崩的效果痹扇。
Hystrix 通過線程池的方式铛漓,來對依賴(在我們的概念中對應(yīng)資源)進行了隔離。這樣做的好處是資源和資源之間做到了最徹底的隔離鲫构。缺點是除了增加了線程切換的成本浓恶,還需要預(yù)先給各個資源做線程池大小的分配。
Sentinel 對這個問題采取了兩種手段:
- 通過并發(fā)線程數(shù)進行限制
和資源池隔離的方法不同结笨,Sentinel 通過限制資源并發(fā)線程的數(shù)量包晰,來減少不穩(wěn)定資源對其它資源的影響。這樣不但沒有線程切換的損耗炕吸,也不需要您預(yù)先分配線程池的大小伐憾。當(dāng)某個資源出現(xiàn)不穩(wěn)定的情況下,例如響應(yīng)時間變長赫模,對資源的直接影響就是會造成線程數(shù)的逐步堆積树肃。當(dāng)線程數(shù)在特定資源上堆積到一定的數(shù)量之后,對該資源的新請求就會被拒絕瀑罗。堆積的線程完成任務(wù)后才開始繼續(xù)接收請求胸嘴。- 通過響應(yīng)時間對資源進行降級
除了對并發(fā)線程數(shù)進行控制以外,Sentinel 還可以通過響應(yīng)時間來快速降級不穩(wěn)定的資源斩祭。當(dāng)依賴的資源出現(xiàn)響應(yīng)時間過長后筛谚,所有對該資源的訪問都會被直接拒絕,直到過了指定的時間窗口之后才重新恢復(fù)停忿。
- 系統(tǒng)負(fù)載保護
??Sentinel 同時對系統(tǒng)的維度提供保護。防止雪崩蚊伞,是系統(tǒng)防護中重要的一環(huán)席赂。當(dāng)系統(tǒng)負(fù)載較高的時候,如果還持續(xù)讓請求進入时迫,可能會導(dǎo)致系統(tǒng)崩潰颅停,無法響應(yīng)。在集群環(huán)境下掠拳,網(wǎng)絡(luò)負(fù)載均衡會把本應(yīng)這臺機器承載的流量轉(zhuǎn)發(fā)到其它的機器上去癞揉。如果這個時候其它的機器也處在一個邊緣狀態(tài)的時候,這個增加的流量就會導(dǎo)致這臺機器也崩潰,最后導(dǎo)致整個集群不可用喊熟。
針對這個情況柏肪,Sentinel 提供了對應(yīng)的保護機制,讓系統(tǒng)的入口流量和系統(tǒng)的負(fù)載達到一個平衡芥牌,保證系統(tǒng)在能力范圍之內(nèi)處理最多的請求烦味。
二、下載啟動
- 下載地址
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 控制臺引入基本的登錄功能,默認(rèn)用戶名和密碼都是 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>
配置啟動參數(shù)
??啟動時加入 JVM 參數(shù) -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制臺地址和端口。若啟動多個應(yīng)用痘昌,則需要通過 -Dcsp.sentinel.api.port=xxxx 指定客戶端監(jiān)控 API 的端口(默認(rèn)是 8719)钥勋。用戶可以通過如下參數(shù)進行配置:
-Dsentinel.dashboard.auth.username=sentinel 用于指定控制臺的登錄用戶名為 sentinel;
-Dsentinel.dashboard.auth.password=123456 用于指定控制臺的登錄密碼為 123456控汉;如果省略這兩個參數(shù)笔诵,默認(rèn)用戶和密碼均為 sentinel;
-Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服務(wù)端 session 的過期時間姑子,如 7200 表示 7200 秒乎婿;60m 表示 60 分鐘,默認(rèn)為 30 分鐘街佑;
同樣也可以直接在 Spring properties 文件中進行配置谢翎。
四、查看機器列表以及健康情況
五沐旨、監(jiān)控
-
"簇點鏈路"中顯示剛剛調(diào)用的資源(單機實時)
注意: 簇點監(jiān)控是內(nèi)存態(tài)的信息森逮,它僅展示啟動后調(diào)用過的資源。
簇點鏈路 -
"實時監(jiān)控"匯總資源信息(集群聚合)
注意: 實時監(jiān)控僅存儲 5 分鐘以內(nèi)的數(shù)據(jù)磁携,如果需要持久化褒侧,需要通過調(diào)用實時監(jiān)控接口來定制。
實時監(jiān)控
注意:請確保 Sentinel 控制臺所在的機器時間與自己應(yīng)用的機器時間保持一致谊迄,否則會導(dǎo)致拉不到實時的監(jiān)控數(shù)據(jù)闷供。
六、規(guī)則管理及推送
Sentinel 控制臺同時提供簡單的規(guī)則管理以及推送的功能统诺。規(guī)則推送分為 3 種模式歪脏,包括 "原始模式"、"Pull 模式" 和"Push 模式"粮呢。