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.
}

这个资源名称为“HelloWorld”的 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.定义系统保护规则

使用系统保护规则,我们可以配置并确保自适应系统保护( 负载1 的阈值、平均响应时间、并发线程数)。让我们使用 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 是后备方法名称。当电路损坏时,这种后备方法定义了我们程序的替代流程。让我们使用 @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.准备我们的申请

让我们将 Sentinel-transport-simple-http 依赖项添加到 pom.xml 中:

<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流控、断路器和自适应系统保护的主要功能。

相应的例子可以在 GitHub 上找到。