阿里巴巴哨兵Sentinel簡介 | Baeldung

banq發表於2021-04-11

顧名思義,Sentinel微服務的強大後衛。它提供了流量控制,併發限制,電路中斷和自適應系統保護等功能,以確保其可靠性。這是阿里巴巴集團積極維護的開源元件。此外,它正式是Spring Cloud Circuit Breaker的一部分
在本教程中,我們將瞭解Sentinel的一些主要功能。此外,我們將看到一個有關如何使用它,其註釋支援以及其監視儀表板的示例。
Sentinel控制隨機傳入請求的速度,以避免微服務過載。這樣可以確保我們的服務不會因流量激增而中斷。它支援多種流量調整策略。當每秒查詢數(QPS)太高時,這些策略會自動將流量調整為適當的形狀。
這些流量整形策略包括:
  • 直接拒絕模式–當每秒請求數超過設定的閾值時,它將自動拒絕其他請求
  • 慢啟動熱身模式-如果流量突然激增,此模式可確保請求計數持續遞增,直到達到上限

當一個服務同步呼叫另一個服務時,另一種服務可能由於某種原因而關閉。在這種情況下,執行緒將被阻塞,因為它們繼續等待其他服務做出響應。這可能導致資源耗盡,並且呼叫者服務也將無法處理其他請求。這被稱為級聯效應,它可能會破壞我們的整個微服務體系結構。
斷路器可防止此類情況,它將立即阻止對其他服務的所有後續呼叫。超時時間過後,一些請求將透過。如果它們成功,則斷路器將恢復正常流量。否則,超時時間將再次開始。
Sentinel使用最大併發限制的原理來實現斷路。透過限制併發執行緒數,它減少了不穩定資源的影響。
Sentinel還會降級不穩定的資源。當資源的響應時間過長時,將在指定的時間視窗中拒絕對資源的所有呼叫。這樣可以防止呼叫變得非常慢的情況,從而導致級聯效果。
如果系統負載過高,Sentinel可以保護我們的伺服器。它使用load1(系統負載)作為度量標準來啟動流量控制。在以下情況下,該請求將被阻止:
  • 當前系統負載(load1)>閾值(maximumSystemLoad);
  • 當前併發請求(執行緒數)>估計容量(最小響應時間*最大QPS)

 

新增Maven依賴:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.0</version>
</dependency>

讓我們使用Sentinel API在try-catch 塊中用相應的業務邏輯定義資源:

try (Entry entry = SphU.entry("HelloWorld")) {
    // Our business logic here.
    System.out.println("hello world");
} catch (BlockException e) {
    // Handle rejected request.
}

這個try-catch程式碼與資源名稱“HelloWorld”的區塊,作為切入點,我們的業務邏輯,由哨兵Sentinel把守。

 
定義流控制規則

這些規則控制著流向我們資源的流量,例如閾值計數或控制行為,例如,直接拒絕或啟動緩慢。讓我們使用FlowRuleManager.loadRules()來配置流規則:

List<FlowRule> flowRules = new ArrayList<>();
FlowRule flowRule = new FlowRule();
flowRule.setResource(RESOURCE_NAME);
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
flowRule.setCount(1);
flowRules.add(flowRule);
FlowRuleManager.loadRules(flowRules);


此規則定義我們的資源“ RESOURCE_NAME”每秒最多可以響應一個請求。
 

定義降級規則
使用降級規則,我們可以配置斷路器的閾值請求計數,恢復超時和其他設定。讓我們使用DegradeRuleManager.loadRules()配置降級規則:

List<DegradeRule> rules = new ArrayList<DegradeRule>();
DegradeRule rule = new DegradeRule();
rule.setResource(RESOURCE_NAME);
rule.setCount(10);
rule.setTimeWindow(10);
rules.add(rule);
DegradeRuleManager.loadRules(rules);

此規則指定當我們的資源RESOURCE_NAME無法滿足10個請求(閾值計數)時,電路將斷開。Sentinel將阻止對該資源的所有後續請求10秒鐘(時間視窗)。
 

定義系統保護規則
使用系統保護規則,我們可以配置並確保自適應系統保護(load1的閾值,平均響應時間,併發執行緒數)。讓我們使用SystemRuleManager.loadRules()方法配置系統規則:

List<SystemRule> rules = new ArrayList<>();
SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(10);
rules.add(rule);
SystemRuleManager.loadRules(rules);


該規則指定,對於我們的系統,最高的系統負載是每秒10個請求。如果當前負載超過此閾值,則所有其他請求都將被阻止。

 
Sentinel還提供了一個監視儀表板。這樣,我們可以監視客戶端並動態配置規則。我們可以實時檢視到我們定義的資源的傳入流量。需要下載Sentinel Dashboard jar。然後,我們可以使用以下命令啟動儀表板:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

在我們的pom.xml中新增sentinel-transport-simple-http依賴項:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.8.0</version>
</dependency>

啟動應用程式時,我們需要新增儀表板IP地址:

-Dcsp.sentinel.dashboard.server=consoleIp:port


現在,無論何時呼叫資源,儀表板都會從我們的應用程式接收到心跳訊號。還可以使用儀表板動態地控制流程,降級和系統規則。
相應的示例可以在GitHub上找到
相關:

Spring Cloud Gateway的API速率限制


 

相關文章