微服務架構--流量控制Sentinel(二)

一、Sentinel簡介

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

  1. Sentinel 和之前常用的熔斷降級庫 Netflix Hystrix 有什么異同呢?
    對比內容| Sentinel |Hystrix
    :---|:---|:---
    隔離策略 |信號量隔離 |線程池隔離/信號量隔離
    熔斷降級策略 |基于響應時間或失敗比率 |基于失敗比率
    實時指標實現| 滑動窗口 |滑動窗口(基于 RxJava)
    規(guī)則配置| 支持多種數據源 |支持多種數據源
    擴展性| 多個擴展點| 插件的形式
    基于注解的支持 |支持| 支持
    限流 |基于 QPS,支持基于調用關系的限流| 不支持
    流量整形| 支持慢啟動、勻速器模式 |不支持
    系統負載保護| 支持| 不支持
    控制臺| 開箱即用,可配置規(guī)則、查看秒級監(jiān)控、機器發(fā)現等 |不完善
    常見框架的適配| Servlet、Spring Cloud、Dubbo、gRPC 等 |Servlet、Spring Cloud Netflix
  2. Sentinel 控制臺最少應該包含如下功能:
    查看機器列表以及健康情況:收集 Sentinel 客戶端發(fā)送的心跳包,用于判斷機器是否在線。
    監(jiān)控 (單機和集群聚合):通過 Sentinel 客戶端暴露的監(jiān)控 API,定期拉取并且聚合應用監(jiān)控信息,最終可以實現秒級的實時監(jiān)控。
    規(guī)則管理和推送:統一管理推送規(guī)則。
    鑒權:生產環(huán)境中鑒權非常重要。這里每個開發(fā)者需要根據自己的實際情況進行定制。

二、Sentinel 基本概念

  1. 資源
    資源是 Sentinel 的關鍵概念。它可以是 Java 應用程序中的任何內容,例如,由應用程序提供的服務,或由應用程序調用的其它應用提供的服務,甚至可以是一段代碼。
    只要通過 Sentinel API 定義的代碼,就是資源,能夠被 Sentinel 保護起來。大部分情況下,可以使用方法簽名,URL,甚至服務名稱作為資源名來標示資源。
  2. 規(guī)則
    圍繞資源的實時狀態(tài)設定的規(guī)則,可以包括流量控制規(guī)則、熔斷降級規(guī)則以及系統保護規(guī)則。所有規(guī)則可以動態(tài)實時調整。

三、Sentinel 功能和設計理念

  1. 流量控制
    ??流量控制在網絡傳輸中是一個常用的概念,它用于調整網絡包的發(fā)送數據。然而,從系統穩(wěn)定性角度考慮,在處理請求的速度上,也有非常多的講究。任意時間到來的請求往往是隨機不可控的,而系統的處理能力是有限的。我們需要根據系統的處理能力對流量進行控制。Sentinel 作為一個調配器,可以根據需要把隨機的請求調整成合適的形狀,如下圖所示:


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

  3. 熔斷降級
    ??除了流量控制以外,降低調用鏈路中的不穩(wěn)定資源也是 Sentinel 的使命之一。由于調用關系的復雜性,如果調用鏈路中的某個資源出現了不穩(wěn)定,最終會導致請求發(fā)生堆積。這個問題和 Hystrix 里面描述的問題是一樣的。


    熔斷降級

    ??Sentinel 和 Hystrix 的原則是一致的: 當調用鏈路中某個資源出現不穩(wěn)定,例如,表現為 timeout,異常比例升高的時候,則對這個資源的調用進行限制,并讓請求快速失敗,避免影響到其它的資源,最終產生雪崩的效果。
    Hystrix 通過線程池的方式,來對依賴(在我們的概念中對應資源)進行了隔離。這樣做的好處是資源和資源之間做到了最徹底的隔離。缺點是除了增加了線程切換的成本,還需要預先給各個資源做線程池大小的分配。
    Sentinel 對這個問題采取了兩種手段:

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

二、下載啟動

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

  2. 用戶可以通過如下參數進行配置:
    -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)控

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


    簇點鏈路
  2. "實時監(jiān)控"匯總資源信息(集群聚合)
    注意: 實時監(jiān)控僅存儲 5 分鐘以內的數據,如果需要持久化,需要通過調用實時監(jiān)控接口來定制。


    實時監(jiān)控

注意:請確保 Sentinel 控制臺所在的機器時間與自己應用的機器時間保持一致,否則會導致拉不到實時的監(jiān)控數據。

六、規(guī)則管理及推送

Sentinel 控制臺同時提供簡單的規(guī)則管理以及推送的功能。規(guī)則推送分為 3 種模式,包括 "原始模式"、"Pull 模式" 和"Push 模式"。

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容