vlambda博客
学习文章列表

阿里开源Sentinel流控框架基本介绍与简单使用

一、简介

1. Sentinel 是什么?

Sentinel是去年7月由阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件。

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

(引自官方文档)

2. 主要优势和特性

  1. 轻量级,核心库无多余依赖,性能损耗小。

  2. 方便接入,开源生态广泛。

  3. 丰富的流量控制场景。

  4. 易用的控制台,提供实时监控、机器发现、规则管理等能力。

  5. 完善的扩展性设计,提供多样化的 SPI 接口,方便用户根据需求给 Sentinel 添加自定义的逻辑。

3. 与Hystrix对比

之前大家熟知的容错组件Hystrix,在去年宣布停止开发,因此许多的开发人员在选型时将目光投向了Sentienl。这里将它们做一下对比:

阿里开源Sentinel流控框架基本介绍与简单使用


阿里开源Sentinel流控框架基本介绍与简单使用

Resource

在Sentinel中,Resource-资源 是最重要的一个概念,可以是代码块、方法、接口等任何需要保护的东西。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源,然后定义规则就可以了,剩下的通通交给Sentinel来处理了。

Slot

Sentinel的工作流程就是围绕着一个个插槽所组成的插槽链来展开的。每个插槽都有自己的功能,通过一定的编排顺序,来达到最终的限流降级的目的。默认的各个插槽之间的顺序是固定的,因为有的插槽需要依赖其他的插槽计算出来的结果才能进行工作。

Context

Context 代表调用链路上下文,贯穿一次调用链路中的所有 Entry。Context 维护着当前调用链的元数据:入口节点、本次调用链路节点、调用来源等信息,通过 ThreadLocal 传递。

Entry

Entry是Sentinel中用来表示请求是否通过限流的一个凭证。每次执行 SphU.entry()SphO.entry() 都会返回一个 Entry 给调用者。资源调用结束时需要 entry.exit()

Entry 包含了资源名、curNode(当前统计节点)、originNode(来源统计节点)等信息。

Node

Sentinel中保存统计数据的对象:

  • StatisticNode:最为基础的统计节点,包含秒级和分钟级两个滑动窗口结构。

  • DefaultNode:链路节点,用于统计调用链路上某个资源的数据,维持树状结构。

  • ClusterNode:簇节点,用于统计每个资源全局的数据(不区分调用链路),以及存放该资源的按来源区分的调用数据。

  • EntranceNode:入口节点,特殊的链路节点,对应某个 Context 入口的所有调用数据。

三、基本使用

1. 引入依赖

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

注意: 从 Sentinel 1.5.0 开始仅支持 JDK 1.7 或者以上版本。Sentinel 1.5.0 之前的版本最低支持 JDK 1.6。

2. 定义资源

Sentinel 在使用上提供了两种形式,一种是异常捕获形式,一种是布尔形式。也就是当限流被触发时,是抛出异常来还是返回一个 false:

2.1 SphU-抛出异常的方式定义资源

Entry entry = null;
try {
    entry = SphU.entry("myResource");
    // 被保护的业务逻辑
catch (BlockException e1) {
    // 资源访问阻止,被限流或被降级
    // 进行相应的处理操作
finally {
    if (entry != null) {
        entry.exit();
    }
}

2.2 SphO-返回布尔值方式定义资源,当资源发生了限流之后就会返回false

if (SphO.entry("myResource")) {
    try {
        // 被保护的业务逻辑
    } finally {
        SphO.exit();
    }
else {
    // 资源访问阻止,被限流或被降级
    // 进行相应的处理操作
}

2.3 使用注解

以上这两种方式都是通过硬编码的形式定义资源然后进行资源埋点的,对业务代码的侵入太大,sentinel从0.1.1版本开始加入了注解的支持,可以通过@SentinelResource注解来定义资源。通过注解除了可以定义资源外,还可配置 blockHandlerfallback 方法来进行限流之后的处理。

@SentinelResource(value = "myResource")
public void test() {
    System.out.println("Hello World!");
}

3. 定义规则

使用 Sentinel 需要我们提供限流规则

private void initRules() {
    // 配置规则
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule();
    rule.setResource("myResource");    // 限流规则的作用对象
    // 配置规则:QPS不得超出10
    rule.setCount(10);    
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);    // 设置限流阈值类型为QPS模式
    rule.setLimitApp("default");    // 针对的调用来源,default代表不区分来源
    rules.add(rule);
    // 加载规则
    FlowRuleManager.loadRules(rules);
}

详细使用示例参见:sentinel-demo-basic

四、动态配置规则

在上面的示例中,我们通过硬编码来对资源进行规则配置,而在实际项目中,规则应该需要支持动态配置,Sentinel官方提供了多种DataSource(规则源)用于动态配置规则,比如Nacos、Apollo、Zookeeper等。

1. DataSource 扩展

DataSource 扩展常见的实现方式有:

  • 拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这样做的方式是简单,缺点是无法及时获取变更。(目前支持:文件、Consul)

  • 推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,这种方式有更好的实时性和一致性保证。(目前支持:ZooKeeper, Redis, Nacos, Apollo)

2. 使用 Nacos 作为规则源

2.1 引入依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.7.1</version>
</dependency>

2.2 注册数据源

创建 NacosDataSource 并将其注册至对应的 RuleManager 上即可。比如:

// remoteAddress 代表 Nacos 服务端的地址
// groupId 和 dataId 对应 Nacos 中相应配置
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(remoteAddress, groupId, dataId,
    source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));

FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

2.3 配置规则

在Nacos控制界面相应groupId和dataId下的配置内容中,使用json格式填写配置内容:

[
    {
        "resource""/myResource",
        "limitApp""default",
        "grade"1,
        "count"5,
        "strategy"0,
        "controlBehavior"0,
        "clusterMode"false
    }
]

Nacos搭建及使用相关参见:Nacos整合SpringCloud实现配置管理和服务发现

详细示例参见:sentinel-demo-nacos-datasource

五、Dashboard控制台

Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。

1. 启动控制台

从release页下载最新dashboard jar包:https://github.com/alibaba/Sentinel/releases

使用命令启动:

# 指定控制台端口为8080
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

2. 客户端接入控制台

2.1 引入依赖

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

2.2 配置启动参数

3. 查看应用情况

根据指定的控制台端口,访问http://localhost:8080/,即可打开管理页面,查看机器列表和监控信息:

阿里开源Sentinel流控框架基本介绍与简单使用
阿里开源Sentinel流控框架基本介绍与简单使用


长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢