高可用流量管理框架 Sentinel

Sentinel 是面向微服務的輕量級流量控制框架,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。

Sentinel 基本概念

資源

資源是 Sentinel 的關鍵概念。它可以是 Java 應用程序中的任何內容,例如,由應用程序提供的服務,或由應用程序調用的其它應用提供的服務,甚至可以是一段代碼。在接下來的文檔中,我們都會用資源來描述代碼塊。

只要通過 Sentinel API 定義的代碼,就是資源,能夠被 Sentinel 保護起來。大部分情況下,可以使用方法簽名,URL,甚至服務名稱作為資源名來標示資源。

規則

圍繞資源的實時狀態設定的規則,可以包括流量控制規則、熔斷降級規則以及系統保護規則。所有規則可以動態實時調整。

Sentinel 功能和設計理念

流量控制

什麼是流量控制

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

高可用流量管理框架 Sentinel

流量控制設計理念

流量控制有以下幾個角度:

  • 資源的調用關係,例如資源的調用鏈路,資源和資源之間的關係;
  • 運行指標,例如 QPS、線程池、系統負載等;
  • 控制的效果,例如直接限流、冷啟動、排隊等。

Sentinel 的設計理念是讓您自由選擇控制的角度,並進行靈活組合,從而達到想要的效果。

熔斷降級

什麼是熔斷降級

除了流量控制以外,降低調用鏈路中的不穩定資源也是 Sentinel 的使命之一。由於調用關係的複雜性,如果調用鏈路中的某個資源出現了不穩定,最終會導致請求發生堆積。這個問題和 Hystrix 裡面描述的問題是一樣的。

Sentinel 和 Hystrix 的原則是一致的: 當調用鏈路中某個資源出現不穩定,例如,表現為 timeout,異常比例升高的時候,則對這個資源的調用進行限制,並讓請求快速失敗,避免影響到其它的資源,最終產生雪崩的效果。

熔斷降級設計理念

在限制的手段上,Sentinel 和 Hystrix 採取了完全不一樣的方法。

Hystrix 通過線程池的方式,來對依賴(在我們的概念中對應資源)進行了隔離。這樣做的好處是資源和資源之間做到了最徹底的隔離。缺點是除了增加了線程切換的成本,還需要預先給各個資源做線程池大小的分配。

Sentinel 對這個問題採取了兩種手段:

  • 通過併發線程數進行限制

和資源池隔離的方法不同,Sentinel 通過限制資源併發線程的數量,來減少不穩定資源對其它資源的影響。這樣不但沒有線程切換的損耗,也不需要您預先分配線程池的大小。當某個資源出現不穩定的情況下,例如響應時間變長,對資源的直接影響就是會造成線程數的逐步堆積。當線程數在特定資源上堆積到一定的數量之後,對該資源的新請求就會被拒絕。堆積的線程完成任務後才開始繼續接收請求。

  • 通過響應時間對資源進行降級

除了對併發線程數進行控制以外,Sentinel 還可以通過響應時間來快速降級不穩定的資源。當依賴的資源出現響應時間過長後,所有對該資源的訪問都會被直接拒絕,直到過了指定的時間窗口之後才重新恢復。

系統負載保護

Sentinel 同時對系統的維度提供保護。防止雪崩,是系統防護中重要的一環。當系統負載較高的時候,如果還持續讓請求進入,可能會導致系統崩潰,無法響應。在集群環境下,網絡負載均衡會把本應這臺機器承載的流量轉發到其它的機器上去。如果這個時候其它的機器也處在一個邊緣狀態的時候,這個增加的流量就會導致這臺機器也崩潰,最後導致整個集群不可用。

針對這個情況,Sentinel 提供了對應的保護機制,讓系統的入口流量和系統的負載達到一個平衡,保證系統在能力範圍之內處理最多的請求。

Sentinel 是如何工作的

Sentinel 的主要工作機制如下:

  • 對主流框架提供適配或者顯示的 API,來定義需要保護的資源,並提供設施對資源進行實時統計和調用鏈路分析。
  • 根據預設的規則,結合對資源的實時統計信息,對流量進行控制。同時,Sentinel 提供開放的接口,方便您定義及改變規則。
  • Sentinel 提供實時的監控系統,方便您快速瞭解目前系統的狀態。

隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。

Sentinel 具有以下特徵:

  • 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍)、消息削峰填谷、集群流量控制、實時熔斷下游不可用應用等。
  • 完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制檯中看到接入應用的單臺機器秒級數據,甚至 500 臺以下規模的集群的彙總運行情況。
  • 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴並進行簡單的配置即可快速地接入 Sentinel。
  • 完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您可以通過實現擴展接口來快速地定製邏輯。例如定製規則管理、適配動態數據源等。

Sentinel 的主要特性:

高可用流量管理框架 Sentinel

Sentinel 分為兩個部分:

  • 核心庫(Java 客戶端)不依賴任何框架/庫,能夠運行於所有 Java 運行時環境,同時對 Dubbo / Spring Cloud 等框架也有較好的支持。
  • 控制檯(Dashboard)基於 Spring Boot 開發,打包後可以直接運行,不需要額外的 Tomcat 等應用容器。

Quick Start

1.1 公網 Demo

如果希望最快的瞭解 Sentinel 在做什麼,我們可以通過 Sentinel 新手指南 來運行一個例子,並且能在控制檯上看到最直觀的監控和流控效果等。

1.2 手動接入 Sentinel 以及控制檯

下面的例子將展示應用如何三步接入 Sentinel。同時,Sentinel 也提供所見即所得的控制檯,可以實時監控資源以及管理規則。

STEP 1. 在應用中引入Sentinel Jar包

如果應用使用 pom 工程,則在 pom.xml 文件中加入以下代碼即可:

<dependency>
<groupid>com.alibaba.csp/<groupid>
<artifactid>sentinel-core/<artifactid>
<version>x.y.z/<version>

/<dependency>

注意: 從 Sentinel 1.5.0 開始僅支持 JDK 1.7 或者以上版本。Sentinel 1.5.0 之前的版本最低支持 JDK 1.6。

如果您未使用依賴管理工具,請到 Maven Center Repository 直接下載 JAR 包。

STEP 2. 定義資源

接下來,我們把需要控制流量的代碼用 Sentinel API SphU.entry("HelloWorld") 和 entry.exit() 包圍起來即可。在下面的例子中,我們將 System.out.println("hello wolrd"); 作為資源,用 API 包圍起來。參考代碼如下:

public static void main(String[] args) {
initFlowRules();
while (true) {
Entry entry = null;
try {
entry = SphU.entry("HelloWorld");
/*您的業務邏輯 - 開始*/
System.out.println("hello world");
/*您的業務邏輯 - 結束*/
} catch (BlockException e1) {
/*流控邏輯處理 - 開始*/
System.out.println("block!");
/*流控邏輯處理 - 結束*/
} finally {
if (entry != null) {
entry.exit();
}
}
}
}

完成以上兩步後,代碼端的改造就完成了。當然,我們也提供了 註解支持模塊,可以以低侵入性的方式定義資源。

STEP 3. 定義規則

接下來,通過規則來指定允許該資源通過的請求次數,例如下面的代碼定義了資源 HelloWorld 每秒最多隻能通過 20 個請求。

private static void initFlowRules(){
List<flowrule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("HelloWorld");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// Set limit QPS to 20.
rule.setCount(20);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
/<flowrule>

完成上面 3 步,Sentinel 就能夠正常工作了。更多的信息可以參考 使用文檔。

STEP 4. 檢查效果

Demo 運行之後,我們可以在日誌 ~/logs/csp/${appName}-metrics.log.xxx 裡看到下面的輸出:

|--timestamp-|------date time----|-resource-|p |block|s |e|rt
1529998904000|2018-06-26 15:41:44|HelloWorld|20|0 |20|0|0
1529998905000|2018-06-26 15:41:45|HelloWorld|20|5579 |20|0|728
1529998906000|2018-06-26 15:41:46|HelloWorld|20|15698|20|0|0
1529998907000|2018-06-26 15:41:47|HelloWorld|20|19262|20|0|0
1529998908000|2018-06-26 15:41:48|HelloWorld|20|19502|20|0|0
1529998909000|2018-06-26 15:41:49|HelloWorld|20|18386|20|0|0

其中 p 代表通過的請求, block 代表被阻止的請求, s 代表成功執行完成的請求個數, e 代表用戶自定義的異常, rt 代表平均響應時長。

可以看到,這個程序每秒穩定輸出 "hello world" 20 次,和規則中預先設定的閾值是一樣的。

更詳細的說明可以參考: 如何使用

更多的例子可以參考: Sentinel Examples

STEP 5. 啟動 Sentinel 控制檯

您可以參考 Sentinel 控制檯文檔 啟動控制檯,可以實時監控各個資源的運行情況,並且可以實時地修改限流規則。


分享到:


相關文章: