字节二面:Sentinel 是如何实现限流的?

开发
本文我们分析了 Sentinel 是如何实现限流的以及了解了它的基本原理,并通过一个简单的示例演示了 Sentinel 是如何实现限流的。

合理的限流策略是保障系统稳定运行的关键,这篇文章,我们来分析一个在微服务架构中广受欢迎的流量控制组件:Sentinel。

一、什么是 Sentinel?

简单来说,Sentinel 是阿里巴巴开源的一个流量控制组件,用于防止系统过载,保障服务的稳定性和可用性。它不仅支持限流,还具备熔断、降级、系统负载保护等多种功能,非常适合微服务架构下的复杂需求。

比如,你的电商平台在“双十一”期间,面对巨大的访问量,Sentinel 可以帮你合理分配流量,防止某个服务因压力过大而崩溃。

二、基本原理

要了解 Sentinel 的限流原理,首先得明白 限流 是什么。简单来说,限流是控制流量的大小,防止系统因请求过多而崩溃。常见的限流策略有以下几种:

  • QPS(每秒查询数)限流:限制单位时间内的请求数。
  • 线程数限流:限制处理请求的线程数。
  • 热点参数限流:对特定参数的请求进行限流。
  • 关联限流:根据多条规则进行综合限流。
  • 预留规则:为关键业务预留一定的资源。

其中,令牌桶(Token Bucket) 和 漏桶(Leaky Bucket) 是两种常见的限流算法。Sentinel 主要采用令牌桶算法,通过生成固定速率的令牌,控制请求的流入。

想象一下,令牌桶就像一个隔离阀,水管(请求)进入时,必须先获取一个水龙头(令牌)的开关。没有令牌,就暂时不让水(请求)流过。

三、实现机制

1. 核心组件

Sentinel 的限流机制主要由以下几个核心组件组成:

  • 资源(Resource):被保护的资源,比如 HTTP 接口、方法等。
  • 规则(Rule):定义对资源的限流方式和阈值。
  • 拦截器(Interceptor):在请求进入资源之前,进行流量控制判断。

2. 流量统计与动态判断

Sentinel 会实时统计每个资源的请求情况,并根据预设的规则动态判断是否允许请求通过。当请求到达时,拦截器会:

  • 检查当前时间窗口内请求数是否超出限流阈值。
  • 如果未超出,允许请求执行,并记录相应的统计信息。
  • 如果超出,拒绝请求,并返回相应的错误信息。

这个过程几乎是实时且高效的,确保系统在高并发情况下依然能够稳定运行。

四、示例演示

为了更好地理解 Sentinel 的工作原理,接下来,通过一个简单的 Java 示例,来演示如何使用 Sentinel 进行限流。

1. 准备环境

首先,确保你已经搭建好了一个基本的 Java 项目,并引入了 Sentinel 依赖。可以在 pom.xml 中添加:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.4</version>
</dependency>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

2. 编写限流代码

下面是一个简单的示例,展示如何为一个资源设置 QPS 限流规则,并进行流量控制。

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.Collections;

publicclass SentinelDemo {

    // 定义资源名称
    privatestaticfinal String RESOURCE_NAME = "resource";

    public static void main(String[] args) {
        // 初始化限流规则
        initFlowRules();

        // 模拟高并发请求
        for (int i = 0; i < 20; i++) {
            new Thread(() -> {
                try (Entry entry = SphU.entry(RESOURCE_NAME)) {
                    // 资源访问逻辑
                    System.out.println("资源访问成功: " + Thread.currentThread().getName());
                } catch (BlockException ex) {
                    // 资源被限流
                    System.out.println("资源被限流: " + Thread.currentThread().getName());
                }
            }).start();
        }
    }

    private static void initFlowRules() {
        FlowRule rule = new FlowRule();
        rule.setResource(RESOURCE_NAME);
        rule.setGrade(com.alibaba.csp.sentinel.slots.block.RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(5); // 设置 QPS 阈值为5

        FlowRuleManager.loadRules(Collections.singletonList(rule));
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.

3. 运行与测试

运行上述代码,你会看到类似如下的输出:

资源访问成功: Thread-0
资源访问成功: Thread-1
资源访问成功: Thread-2
资源访问成功: Thread-3
资源访问成功: Thread-4
资源被限流: Thread-5
资源被限流: Thread-6
...
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

这里,我们设置了 QPS 阈值为 5,当并发请求超过这个值时,多余的请求会被 限流,即被拒绝。这有助于保护系统不被突发的高流量冲击。

Sentinel 的功能远不止于简单的限流,它还支持 熔断降级、系统负载保护、丰富的规则配置等等。比如,在服务出现异常时,Sentinel 可以自动触发熔断,暂时关闭对该服务的访问,给予系统恢复的时间。

此外,Sentinel 提供了丰富的监控和管理界面,方便开发者实时查看系统状态,并动态调整规则。

五、总结

本文,我们分析了 Sentinel 是如何实现限流的以及了解了它的基本原理,并通过一个简单的示例演示了 Sentinel 是如何实现限流的。从基本原理到实际代码,再到更深入的功能拓展,希望这篇文章能帮助大家更好地理解和应用 Sentinel。

责任编辑:赵宁宁 来源: 猿java
相关推荐

2024-11-05 15:02:41

2024-12-25 15:44:15

2024-02-04 10:08:34

2025-03-28 10:47:05

开发注解Java

2021-05-14 07:45:07

Sentinel 接口限流

2024-08-30 08:59:15

2021-06-30 17:38:03

Trie 树字符Java

2021-03-01 11:53:15

面试伪共享CPU

2024-11-20 16:00:19

MybatisJava数据库

2022-01-17 14:24:09

共享字节面试

2022-05-03 19:38:15

限流微服务Sentinel

2021-05-21 08:30:26

Sentinel GateWay 微服务

2022-05-09 07:35:48

动态集群限流

2022-05-29 21:38:11

限流熔断流量

2020-08-03 08:04:04

限流算法Sentinel

2023-08-10 08:00:42

令牌限流器计数器

2022-05-10 22:00:41

UDPTCP协议

2024-09-06 13:53:28

2024-07-30 14:01:51

Java字节码JVM​

2021-03-15 11:20:46

HTTPS优化前端
点赞
收藏

51CTO技术栈公众号