Skip to content
On this page

sentinel

Sentinel是一个面向分布式微服务架构的轻量级高可用流量控制组件,它主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度帮助用户保护服务的稳定性。

Sentinel具有以下特点:

丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 完备的实时监控:Sentinel提供实时的监控控制台,可以实时查看应用的流量、QPS、响应时间、异常比例等指标,以及配置和管理限流规则、熔断规则等。 广泛的开源生态:Sentinel提供了与多种开源框架/库的整合模块,例如与Spring Cloud、Dubbo、gRPC等的整合。 完善的SPI扩展点:Sentinel提供了简单易用、完善的SPI扩展接口,可以通过实现扩展接口来定制逻辑,例如定制规则管理、适配动态数据源等。

示例

Sentinel的使用步骤大致可以分为三步:

  1. 引入依赖:根据你的项目类型和框架,选择合适的Sentinel依赖,例如Spring Boot、Spring Cloud、Dubbo等。
  2. 定义资源:资源是Sentinel的保护对象,可以是方法签名、URL、服务名称等。你需要用Sentinel API的SphU.entry("资源名")和entry.exit()来包围你需要控制流量的代码。
  3. 定义规则:规则是Sentinel的控制逻辑,可以是限流规则、熔断规则、热点规则等。你可以用Sentinel API的FlowRuleManager.loadRules()等方法来加载规则,或者用Sentinel控制台来配置和管理规则。

下面是一个简单的示例代码,演示了如何使用Sentinel API来定义资源和限流规则:

java
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

import java.util.ArrayList;
import java.util.List;

public class SentinelDemo {

    public static void main(String[] args) {
        // 定义资源名
        String resourceName = "HelloWorld";
        // 配置限流规则
        initFlowRules(resourceName);

        while (true) {
            // 定义资源
            Entry entry = null;
            try {
                entry = SphU.entry(resourceName);
                // 资源中的逻辑
                System.out.println("hello world");
            } catch (BlockException e) {
                // 资源访问被阻止,被限流或被降级
                System.out.println("blocked!");
            } finally {
                // 释放资源
                if (entry != null) {
                    entry.exit();
                }
            }
        }
    }

    private static void initFlowRules(String resourceName){
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        // 设置资源名
        rule.setResource(resourceName);
        // 设置限流阈值为每秒 5 个请求
        rule.setCount(5);
        // 设置限流模式为 QPS
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rules.add(rule);
        // 加载限流规则
        FlowRuleManager.loadRules(rules);
    }
}

Sentinel和Hystrix有什么区别?

Sentinel和Hystrix都是分布式系统的流量控制和熔断组件,但是它们有一些区别,主要有以下几点:

  • 隔离策略:Hystrix支持线程池和信号量两种隔离策略,可以防止故障的传播和级联。Sentinel不提供隔离策略,而是依赖于应用本身的线程池或者执行模型。
  • 资源定义:Hystrix的资源定义和隔离规则强相关,需要使用Hystrix Command来包装资源,并指定隔离规则。Sentinel的资源定义和规则配置的耦合度更低,只需要用Sentinel API来标识资源,规则可以在任何时候动态修改。
  • 规则配置:Hystrix的规则配置比较固定,需要在代码中或者配置文件中指定。Sentinel的规则配置更灵活,可以通过API、控制台、动态数据源等方式来配置和管理。
  • 流量控制:Hystrix的流量控制只支持基于QPS的限流模式,而Sentinel支持多种限流模式,如QPS、并发数、响应时间等,并且支持集群限流和链路限流等功能。
  • 熔断降级:Hystrix的熔断降级只支持基于异常比例和异常数的触发条件,而Sentinel支持多种触发条件,如异常比例、异常数、平均响应时间、慢调用比例等,并且支持基于RT、异常比例、异常数的自适应降级策略。

Released under the MIT License.