1. 程式人生 > >alibaba/Sentinel 分布式 系統流量防衛兵

alibaba/Sentinel 分布式 系統流量防衛兵

art 使用場景 sta 特征 黑白名單 args 規則 我們 view

技術分享圖片

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以及Dashboard

下面的例子將展示應用如何三步接入 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 僅支持 Java 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);
}

完成上面 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|hello world|20|0    |20|0|0
1529998905000|2018-06-26 15:41:45|hello world|20|5579 |20|0|728
1529998906000|2018-06-26 15:41:46|hello world|20|15698|20|0|0
1529998907000|2018-06-26 15:41:47|hello world|20|19262|20|0|0
1529998908000|2018-06-26 15:41:48|hello world|20|19502|20|0|0
1529998909000|2018-06-26 15:41:49|hello world|20|18386|20|0|0

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

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

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

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

STEP 5. 啟動 Sentinel 控制臺

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

詳細文檔

請移步 Wiki,查閱詳細的文檔、示例以及使用說明。若您希望從其它熔斷降級組件(如 Hystrix)遷移或進行功能對比,可以參考 遷移指南。

Please refer to README for README in English。

與 Sentinel 相關的生態(包括社區用戶實現的擴展、整合、示例以及文章)可以參見 Awesome Sentinel,歡迎補充!

如果您正在使用 Sentinel,歡迎在 Wanted: Who is using Sentinel 留言告訴我們您的使用場景,以便我們更好地去改進。

wiki文檔連接:

文檔

  • Read Me
  • 新手指南
  • Sentinel 介紹
  • FAQ
  • Roadmap
  • 如何使用
  • 工作原理
  • 流量控制
  • 集群流控
  • 熔斷降級
  • 熱點參數限流
  • 系統自適應限流
  • 黑白名單控制
  • 實時運行數據
  • 動態規則
  • 控制臺
  • 生產環境使用 Sentinel
  • 註解支持
  • 主流框架適配
  • 開源貢獻指南

alibaba/Sentinel 分布式 系統流量防衛兵