微服務(wù)架構(gòu)--流量控制Sentinel(二)

一、Sentinel簡介

??Sentinel 是面向分布式服務(wù)架構(gòu)的輕量級流量控制產(chǎn)品,主要以流量為切入點,從流量控制、熔斷降級、系統(tǒng)負載保護等多個維度來幫助您保護服務(wù)的穩(wěn)定性。
??Sentinel 可以簡單的分為 Sentinel 核心庫和 Dashboard。核心庫不依賴 Dashboard,但是結(jié)合 Dashboard 可以取得最好的效果。
文檔:https://github.com/alibaba/Sentinel/wiki

  1. 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)負載保護| 支持| 不支持
    控制臺| 開箱即用,可配置規(guī)則、查看秒級監(jiān)控、機器發(fā)現(xiàn)等 |不完善
    常見框架的適配| Servlet、Spring Cloud、Dubbo、gRPC 等 |Servlet、Spring Cloud Netflix
  2. 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 基本概念

  1. 資源
    資源是 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)示資源。
  2. 規(guī)則
    圍繞資源的實時狀態(tài)設(shè)定的規(guī)則,可以包括流量控制規(guī)則、熔斷降級規(guī)則以及系統(tǒng)保護規(guī)則。所有規(guī)則可以動態(tài)實時調(diào)整。

三、Sentinel 功能和設(shè)計理念

  1. 流量控制
    ??流量控制在網(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)整成合適的形狀,如下圖所示:


    流量控制
  2. 流量控制設(shè)計理念
    流量控制有以下幾個角度:
    資源的調(diào)用關(guān)系,例如資源的調(diào)用鏈路,資源和資源之間的關(guān)系;
    運行指標(biāo),例如 QPS、線程池、系統(tǒng)負載等;
    控制的效果,例如直接限流、冷啟動、排隊等。
    Sentinel 的設(shè)計理念是讓您自由選擇控制的角度,并進行靈活組合,從而達到想要的效果。

  3. 熔斷降級
    ??除了流量控制以外,降低調(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 對這個問題采取了兩種手段:

  1. 通過并發(fā)線程數(shù)進行限制
    和資源池隔離的方法不同,Sentinel 通過限制資源并發(fā)線程的數(shù)量,來減少不穩(wěn)定資源對其它資源的影響。這樣不但沒有線程切換的損耗,也不需要您預(yù)先分配線程池的大小。當(dāng)某個資源出現(xiàn)不穩(wěn)定的情況下,例如響應(yīng)時間變長,對資源的直接影響就是會造成線程數(shù)的逐步堆積。當(dāng)線程數(shù)在特定資源上堆積到一定的數(shù)量之后,對該資源的新請求就會被拒絕。堆積的線程完成任務(wù)后才開始繼續(xù)接收請求。
  2. 通過響應(yīng)時間對資源進行降級
    除了對并發(fā)線程數(shù)進行控制以外,Sentinel 還可以通過響應(yīng)時間來快速降級不穩(wěn)定的資源。當(dāng)依賴的資源出現(xiàn)響應(yīng)時間過長后,所有對該資源的訪問都會被直接拒絕,直到過了指定的時間窗口之后才重新恢復(fù)。
  1. 系統(tǒng)負載保護
    ??Sentinel 同時對系統(tǒng)的維度提供保護。防止雪崩,是系統(tǒng)防護中重要的一環(huán)。當(dāng)系統(tǒng)負載較高的時候,如果還持續(xù)讓請求進入,可能會導(dǎo)致系統(tǒng)崩潰,無法響應(yīng)。在集群環(huán)境下,網(wǎng)絡(luò)負載均衡會把本應(yīng)這臺機器承載的流量轉(zhuǎn)發(fā)到其它的機器上去。如果這個時候其它的機器也處在一個邊緣狀態(tài)的時候,這個增加的流量就會導(dǎo)致這臺機器也崩潰,最后導(dǎo)致整個集群不可用。
    針對這個情況,Sentinel 提供了對應(yīng)的保護機制,讓系統(tǒng)的入口流量和系統(tǒng)的負載達到一個平衡,保證系統(tǒng)在能力范圍之內(nèi)處理最多的請求。

二、下載啟動

  1. 下載地址
    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

  1. 使用Docker運行(開發(fā)模式推薦):
# 拉取鏡像
[root@192 ~]# docker pull bladex/sentinel-dashboard
# 運行鏡像
[root@192 ~]# docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard
d0e107c5498095607720ff4cbbdfe7454ed4000ceb3f092ff2d0e6e62ef2321b

  1. 訪問地址

三、客戶端接入控制臺

  1. 引入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>
  1. 配置啟動參數(shù)
    ??啟動時加入 JVM 參數(shù) -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制臺地址和端口。若啟動多個應(yīng)用,則需要通過 -Dcsp.sentinel.api.port=xxxx 指定客戶端監(jiān)控 API 的端口(默認是 8719)。

  2. 用戶可以通過如下參數(shù)進行配置:
    -Dsentinel.dashboard.auth.username=sentinel 用于指定控制臺的登錄用戶名為 sentinel;
    -Dsentinel.dashboard.auth.password=123456 用于指定控制臺的登錄密碼為 123456;如果省略這兩個參數(shù),默認用戶和密碼均為 sentinel;
    -Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服務(wù)端 session 的過期時間,如 7200 表示 7200 秒;60m 表示 60 分鐘,默認為 30 分鐘;
    同樣也可以直接在 Spring properties 文件中進行配置。

四、查看機器列表以及健康情況

機器列表

五、監(jiān)控

  1. "簇點鏈路"中顯示剛剛調(diào)用的資源(單機實時)
    注意: 簇點監(jiān)控是內(nèi)存態(tài)的信息,它僅展示啟動后調(diào)用過的資源。


    簇點鏈路
  2. "實時監(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 模式"。

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

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

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