SpringCloud入門(mén)實(shí)戰(zhàn)-Sentinel微服務(wù)流量防衛(wèi)兵簡(jiǎn)介

?? 《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í)的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容