阿里巴巴Sentinel簡介
- Spring Cloud
- Sentinel
1.概述
顧名思義, Sentinel是微服務的強大後衛。它提供了流量控制,並發限制,電路中斷和自適應系統保護等功能,以確保其可靠性。這是阿里巴巴集團積極維護的開源組件。此外,它正式是Spring Cloud Circuit Breaker的一部分。
在本教程中,我們將了解Sentinel的一些主要功能。此外,我們將看到一個有關如何使用它,其註釋支持以及其監視儀表板的示例。
2.特點
2.1 流量控制
Sentinel控制隨機傳入請求的速度,以避免微服務過載。這樣可以確保我們的服務不會因流量激增而中斷。它支持多種流量調整策略。當每秒查詢數(QPS)太高時,這些策略會自動將流量調整為適當的形狀。
這些流量整形策略包括:
- 直接拒絕模式–當每秒請求數超過設置的閾值時,它將自動拒絕其他請求
- 慢啟動熱身模式-如果流量突然激增,此模式可確保請求計數持續遞增,直到達到上限
2.2 斷路和降級
當一個服務同步調用另一個服務時,另一種服務可能由於某種原因而關閉。在這種情況下,線程將被阻塞,因為它們繼續等待其他服務做出響應。這可能導致資源耗盡,並且呼叫者服務也將無法處理其他請求。這被稱為級聯效應,它可能會破壞我們的整個微服務體系結構。
為防止此類情況,斷路器進入了圖片。它將立即阻止對其他服務的所有後續調用。超時時間過後,一些請求將通過。如果它們成功,則斷路器將恢復正常流量。否則,超時時間將再次開始。
Sentinel使用最大並發限制的原理來實現斷路。通過限制並發線程數,它減少了不穩定資源的影響。
Sentinel還會降級不穩定的資源。當資源的響應時間過長時,將在指定的時間窗口中拒絕對資源的所有調用。這樣可以防止呼叫變得非常慢的情況,從而導致級聯效果。
2.3 自適應系統保護
如果系統負載過高,Sentinel可以保護我們的服務器。它使用load1
(系統負載)作為度量標準來啟動流量控制。在以下情況下,該請求將被阻止:
- 當前系統負載(
load1
)>閾值(highestSystemLoad
); - 當前並發請求(線程數)>估計容量(最小響應時間*最大QPS)
3.使用方法
3.1 添加Maven依賴
在我們的Maven項目中,我們需要pom.xml
sentinel-core
依賴項:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.0</version>
</dependency>
3.2 定義資源
讓我們使用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
塊用作Sentinel保護的業務邏輯的入口點。
3.3 定義流控制規則
這些規則控制著流向我們資源的流量,例如閾值計數或控制行為,例如,直接拒絕或啟動緩慢。讓我們使用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”每秒最多可以響應一個請求。
3.4 定義降級規則
使用降級規則,我們可以配置斷路器的閾值請求計數,恢復超時和其他設置。
讓我們使用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秒鐘(時間窗口)。
3.5。定義系統保護規則
使用系統保護規則,我們可以配置並確保自適應系統保護( load1
閾值,平均響應時間,並發線程數)。讓我們使用SystemRuleManager.loadRules()
方法配置系統規則:
List<SystemRule> rules = new ArrayList<>();
SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(10);
rules.add(rule);
SystemRuleManager.loadRules(rules);
該規則指定,對於我們的系統,最高的系統負載是每秒10個請求。如果當前負載超過此閾值,則所有其他請求都將被阻止。
4.註釋支持
Sentinel還提供了面向方面的註釋支持,用於定義資源。
首先,我們將為sentinel-annotation-aspectj
添加Maven依賴項:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.8.0</version>
</dependency>
然後,將@Configuration
添加到我們的配置類中,以將前哨方面註冊為Spring bean:
@Configuration
public class SentinelAspectConfiguration {
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
}
@SentinelResource
指示資源定義。它具有類似於value
屬性,該屬性定義了資源名稱。屬性fallback
是fallback方法名稱。當電路斷開時,這種後備方法定義了我們程序的替代流程。讓我們使用@SentinelResource
批註定義資源:
@SentinelResource(value = "resource_name", fallback = "doFallback")
public String doSomething(long i) {
return "Hello " + i;
}
public String doFallback(long i, Throwable t) {
// Return fallback value.
return "fallback";
}
這定義了名稱為resource_name
以及後備方法。
5.監控儀表板
Sentinel還提供了一個監視儀表板。這樣,我們可以監視客戶端並動態配置規則。我們可以實時查看到我們定義的資源的傳入流量。
5.1 啟動儀表板
首先,我們需要下載Sentinel Dashboard jar 。然後,我們可以使用以下命令啟動儀表板:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
儀表板應用程序啟動後,我們可以按照下一部分中的步驟連接我們的應用程序。
5.2 準備我們的依賴項
讓我們在我們的pom.xml
sentinel-transport-simple-http
依賴項:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.0</version>
</dependency>
5.3 將我們的應用程序連接到儀表板
啟動應用程序時,我們需要添加儀表板IP地址:
-Dcsp.sentinel.dashboard.server=consoleIp:port
現在,無論何時調用資源,儀表板都會從我們的應用程序接收到心跳信號:
我們還可以使用儀表板動態地控制流程,降級和系統規則。
六,結論
在本文中,我們了解了阿里巴巴Sentinel流量控制,斷路器和自適應系統保護的主要功能。