Alibaba Sentinel 简介

1、概览

Sentinel,哨兵。顾名思义,它是微服务的强大守护者。它提供流量控制、并发限制、熔断和自适应系统保护等功能,以确保微服务的可靠性。它是一个开源组件,由阿里巴巴集团积极维护。此外,它还是 Spring Cloud Circuit Breaker 的官方组成部分。

本文将带你了解 Alibaba Sentinel 的核心功能,包括的流量控制、熔断器和自适应系统保护,以及它的注解支持和监控仪表盘。

2、功能

2.1、流量控制

Sentinel 控制随机传入请求的速度,以避免微服务超载。这可确保服务不会因流量激增而瘫痪。它支持各种流量整形策略。当每秒查询次数(QPS)过高时,这些策略会自动将流量调整为适当的形状。

这些流量整形策略包括:

  • 直接拒绝模式(Direct Rejection Mode)- 当每秒请求数超过设定阈值时,它会自动拒绝后续的请求。
  • 慢启动预热模式(Slow Start Warm-Up Mode) - 如果有突发的流量激增,此模式确保请求计数逐渐增加,直到达到上限为止。

2.2、熔断和降级

当一个服务同步调用另一个服务时,另一个服务有可能因某种原因宕机。在这种情况下,线程会被阻塞,因为它们一直在等待另一个服务的响应。这会导致资源耗尽,调用方服务也将无法处理更多请求。这就是所谓的级联效应,可能会导致整个微服务架构崩溃。

为了防止出现这种情况,引入了熔断器(Circuit Breaker)。它会立即阻止对其他服务的所有后续调用。在超时时间过后,一些请求会通过。如果请求成功,熔断器就会恢复正常流量。否则,超时时间将重新开始计时。

Sentinel 利用最大并发限制原理实现熔断。它通过限制并发线程的数量来减少不稳定资源的影响。

Sentinel 也会将不稳定的资源降级。当资源的响应时间过长时,对资源的所有调用都将在指定的时间窗口内被拒绝。这样可以防止调用变得非常缓慢,从而导致连锁效应。

2.3、自适应系统保护

Sentinel 会在系统负载过高时保护服务器。它使用 load1(系统负载)作为启动流量控制的指标。在以下情况下,请求将被阻止:

  • 当前系统负载(load1) > 临界值(highestSystemLoad)。
  • 当前并发请求(线程数) > 预计容量(最短响应时间 * 最大 QPS)

3、用法

3.1、添加 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")) {
    // TODO 业务逻辑。
    System.out.println("hello world");
} catch (BlockException e) {
    // TODO 处理被拒绝的请求。
}

这个资源名为 HelloWorldtry-catch 块是业务逻辑的入口点,由 Sentinel 保护。

3.3、定义流量控制规则

这些规则控制流向资源的流量,如阈值计数(Threshold Count)或控制行为(Control Behavior) - 例如,直接拒绝或慢启动。

使用 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 个请求(Threshold Count)时,将熔断。Sentinel 将在 10 秒(Time Window)内阻止对该资源的所有后续请求。

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 配置类,将 SentinelResourceAspect 注册为 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";
}

如上,定义了名为 resource_name 的资源以及 fallback 方法。

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 dashboard

还可以使用仪表板动态操作流量、降级和系统规则。

6、总结

本文介绍了 Alibaba Sentinel 的核心功能,包括的流量控制、熔断器和自适应系统保护,以及它的注解支持和监控仪表盘。


Ref:https://www.baeldung.com/java-sentinel-intro