?? 《SpringCloud入門(mén)實(shí)戰(zhàn)系列》解鎖SpringCloud主流組件入門(mén)應(yīng)用及關(guān)鍵特性。帶你了解SpringCloud主流組件,是如何一戰(zhàn)解決微服務(wù)諸多難題的。項(xiàng)目demo:源碼地址
?? 作者:一只IT攻城獅。關(guān)注我,不迷路。
?? 再小的收獲x365天都會(huì)成就不一樣的自己,一起學(xué)習(xí),一起進(jìn)步。

一、Sentinel 是什么
Sentinel關(guān)鍵特性:流量控制、熔斷降級(jí)
由官網(wǎng)可知:隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來(lái)越重要。Sentinel 是面向分布式、多語(yǔ)言異構(gòu)化服務(wù)架構(gòu)的流量治理組件,主要以流量為切入點(diǎn),從流量路由、流量控制、流量整形、熔斷降級(jí)、系統(tǒng)自適應(yīng)過(guò)載保護(hù)、熱點(diǎn)流量防護(hù)等多個(gè)維度來(lái)幫助開(kāi)發(fā)者保障微服務(wù)的穩(wěn)定性。微服務(wù)的流量防衛(wèi)兵。
二、Sentinel 的特征
豐富的應(yīng)用場(chǎng)景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場(chǎng)景,例如秒殺(即突發(fā)流量控制在系統(tǒng)容量可以承受的范圍)、消息削峰填谷、集群流量控制、實(shí)時(shí)熔斷下游不可用應(yīng)用等。
完備的實(shí)時(shí)監(jiān)控:Sentinel 同時(shí)提供實(shí)時(shí)的監(jiān)控功能??梢栽诳刂婆_(tái)中看到接入應(yīng)用的單臺(tái)機(jī)器秒級(jí)數(shù)據(jù),甚至 500 臺(tái)以下規(guī)模的集群的匯總運(yùn)行情況。
廣泛的開(kāi)源生態(tài):Sentinel 提供開(kāi)箱即用的與其它開(kāi)源框架/庫(kù)的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。只需要引入相應(yīng)的依賴并進(jìn)行簡(jiǎn)單的配置即可快速地接入 Sentinel。
完善的 SPI 擴(kuò)展點(diǎn):Sentinel 提供簡(jiǎn)單易用、完善的 SPI 擴(kuò)展接口??梢酝ㄟ^(guò)實(shí)現(xiàn)擴(kuò)展接口來(lái)快速地定制邏輯。例如定制規(guī)則管理、適配動(dòng)態(tài)數(shù)據(jù)源等。
三、Sentinel 和 Hystrix 的熔斷降級(jí)區(qū)別
Sentinel 和 Hystrix 的原則是一致的: 當(dāng)調(diào)用鏈路中某個(gè)資源出現(xiàn)不穩(wěn)定,例如,表現(xiàn)為 timeout,異常比例升高的時(shí)候,則對(duì)這個(gè)資源的調(diào)用進(jìn)行限制,并讓請(qǐng)求快速失敗,避免影響到其它的資源,最終產(chǎn)生雪崩的效果。
Hystrix 通過(guò)線程池的方式,來(lái)對(duì)依賴(在我們的概念中對(duì)應(yīng)資源)進(jìn)行了隔離。這樣做的好處是資源和資源之間做到了最徹底的隔離。缺點(diǎn)是除了增加了線程切換的成本,還需要預(yù)先給各個(gè)資源做線程池大小的分配。

Sentinel 對(duì)這個(gè)問(wèn)題采取了兩種手段:
通過(guò)并發(fā)線程數(shù)進(jìn)行限制
和資源池隔離的方法不同,Sentinel 通過(guò)限制資源并發(fā)線程的數(shù)量,來(lái)減少不穩(wěn)定資源對(duì)其它資源的影響。這樣不但沒(méi)有線程切換的損耗,也不需要您預(yù)先分配線程池的大小。當(dāng)某個(gè)資源出現(xiàn)不穩(wěn)定的情況下,例如響應(yīng)時(shí)間變長(zhǎng),對(duì)資源的直接影響就是會(huì)造成線程數(shù)的逐步堆積。當(dāng)線程數(shù)在特定資源上堆積到一定的數(shù)量之后,對(duì)該資源的新請(qǐng)求就會(huì)被拒絕。堆積的線程完成任務(wù)后才開(kāi)始繼續(xù)接收請(qǐng)求。通過(guò)響應(yīng)時(shí)間對(duì)資源進(jìn)行降級(jí)
除了對(duì)并發(fā)線程數(shù)進(jìn)行控制以外,Sentinel 還可以通過(guò)響應(yīng)時(shí)間來(lái)快速降級(jí)不穩(wěn)定的資源。當(dāng)依賴的資源出現(xiàn)響應(yīng)時(shí)間過(guò)長(zhǎng)后,所有對(duì)該資源的訪問(wèn)都會(huì)被直接拒絕,直到過(guò)了指定的時(shí)間窗口之后才重新恢復(fù)。
四、Sentinel 的使用
1、Java 客戶端&Dashboard
Sentinel 的使用分為兩個(gè)部分:
-
核心庫(kù)(Java 客戶端):不依賴任何框架/庫(kù),能夠運(yùn)行于 Java 8 及以上的版本的運(yùn)行時(shí)環(huán)境,同時(shí)對(duì) Dubbo / Spring Cloud 等框架也有較好的支持(見(jiàn) 主流框架適配)。 -
控制臺(tái)(Dashboard):Dashboard 主要負(fù)責(zé)管理推送規(guī)則、監(jiān)控、管理機(jī)器信息等?;赟pringBoot開(kāi)發(fā),打包后可以直接運(yùn)行,不需要額外的Tomcat等應(yīng)用容器。
2、Sentinel 控制臺(tái)功能
Sentinel 提供一個(gè)輕量級(jí)的開(kāi)源控制臺(tái),它提供機(jī)器發(fā)現(xiàn)以及健康情況管理、監(jiān)控(單機(jī)和集群),規(guī)則管理和推送的功能。
- 查看機(jī)器列表以及健康情況:收集 Sentinel 客戶端發(fā)送的心跳包,用于判斷機(jī)器是否在線。
- 監(jiān)控 (單機(jī)和集群聚合):通過(guò) Sentinel 客戶端暴露的監(jiān)控 API,定期拉取并且聚合應(yīng)用監(jiān)控信息,最終可以實(shí)現(xiàn)秒級(jí)的實(shí)時(shí)監(jiān)控。
- 規(guī)則管理和推送:統(tǒng)一管理推送規(guī)則。
- 鑒權(quán):生產(chǎn)環(huán)境中鑒權(quán)非常重要。這里每個(gè)開(kāi)發(fā)者需要根據(jù)自己的實(shí)際情況進(jìn)行定制。
注意:Sentinel 控制臺(tái)目前僅支持單機(jī)部署。
啟動(dòng) Sentinel 控制臺(tái)需要 JDK 版本為 1.8 及以上版本。
3、Sentinel 控制臺(tái)的下載
下載安裝運(yùn)行,下載地址:https://github.com/alibaba/Sentinel/releases

運(yùn)行命令:
java -Dserver.port=8718 -jar sentinel-dashboard-1.8.6.jar
運(yùn)行時(shí)可以改變端口號(hào)(默認(rèn)8080)我這里改成8718演示,但是這是一種臨時(shí)更改,下次重新啟動(dòng)的時(shí)候sentinel 的默認(rèn)端口還是8080。啟動(dòng)后,訪問(wèn):http://localhost:8718/ 賬號(hào)密碼:sentinel/sentinel

五、項(xiàng)目整合Sentinel
1、添加依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、配置yml
server:
port: 8401
spring:
application:
name: cloud-sentinel #微服務(wù)應(yīng)用的名字
cloud:
sentinel:
transport:
#這里配置控制臺(tái)的地址
dashboard: localhost:8718
#注意:很多連不上控制臺(tái)就是沒(méi)有配置client-ip,而且最好不要配置localhost或127.0.0.1,盡量配置成宿主機(jī)的ip
client-ip: 172.28.20.236
#默認(rèn)8719端口,假如被占用會(huì)自動(dòng)從8719開(kāi)始,依次+1掃描,直到找到未被占用的端口
port: 8719
3、Controller測(cè)試類
@RestController
@Slf4j
@RequestMapping("")
public class TestController {
@GetMapping("/testA")
public CommonResult<String> testA() {
return new CommonResult<>(200, "success", "testA");
}
@GetMapping("/testB")
public CommonResult<String> testB() {
return new CommonResult<>(200, "success", "testB");
}
}
服務(wù)啟動(dòng),訪問(wèn)接口http://localhost:8401/testA 注冊(cè)到sentinel


注意??:sentinel是懶加載機(jī)制,只有訪問(wèn)過(guò)一次的資源才會(huì)被監(jiān)控。
好了關(guān)于Sentinel基本概述和控制臺(tái)的集成就到這里了,篇幅有限,下一節(jié)我們一起學(xué)習(xí)Sentinel是如何做到流量控制、熔斷降級(jí)的。