Sentinel最全详解(图文全面总结)

Sentinel最全详解(图文全面总结)

Sentinel是构建微服务的核心,也是SpringCloudAlibaba核心组件,下面我就全面来详解Sentinel@mikechen

本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。

Sentinel最全详解(图文全面总结)

Sentinel

Sentinel 是一个由阿里开发的流量控制组件,主要用于:分布式系统中的流量控制、和熔断降级。

其主要目标:保护分布式系统的稳定性、和可用性,通过对应用的实时流量进行监控、和控制,防止服务过载、和异常传播。

Sentinel最全详解(图文全面总结)

Sentinel 功能

Sentinel 的核心功能,包含:流量控制(限流)、熔断(降级)、实时监控、和保护等等。

如下图所示:

Sentinel最全详解(图文全面总结)

流量控制

限流:是指对系统的请求进行限制,以防止过载、和确保系统的稳定性。

Sentinel 提供了多种限流策略,列如:基于 QPS(每秒请求数)限制、基于线程数限制、和基于调用关系的热点参数限流………等。

如下图所示:

Sentinel最全详解(图文全面总结)

常见的限流算法:有计数器、滑动时间窗口、和漏桶算法…….等等。

计数器算法(Fixed Window Counter)

计数器算法是最简单的一种限流算法,它将时间分割成固定的时间窗口,每个窗口内记录请求数,如果请求数超过了设定的阈值,则进行限流。

实现原理:

  • 将时间分为固定的窗口,例如 :1 分钟;
  • 在每个时间窗口内维护一个计数器,记录请求数;
  • 如果在当前窗口内的请求数超过了设定的阈值,则拒绝请求。

滑动时间窗口算法(Sliding Window Log)

滑动时间窗口算法:通过记录每个请求的时间戳,并根据时间戳判断当前窗口内的请求数是否超过限制。

实现原理:

  • 第一,记录每个请求的时间戳;
  • 其次,定期清理超出窗口时间的请求记录;
  • 计算当前窗口内的请求数,如果超过设定的阈值,则拒绝请求。

漏桶算法(Leaky Bucket)

漏桶算法将请求放入一个漏桶中,以固定的速率处理请求,当漏桶满时,新请求会被丢弃。

如下图所示:

Sentinel最全详解(图文全面总结)

大致流程,如下:

实现原理:

  • 请求到达时,如果漏桶未满,则将请求放入漏桶中;
  • 漏桶以固定速率处理请求;
  • 如果漏桶满了,则新请求被丢弃。

示例:

public class LeakyBucket {
    private int water = 0; // 当前漏桶中的水量
    private final int capacity; // 漏桶容量
    private final int leakRate; // 漏水速率(每毫秒漏多少)
    private long lastLeakTime = System.currentTimeMillis();

    public LeakyBucket(int capacity, int leakRate) {
        this.capacity = capacity;
        this.leakRate = leakRate;
    }

    public synchronized boolean allowRequest() {
        long now = System.currentTimeMillis();
        // 计算漏掉的水
        long leakedWater = (now - lastLeakTime) * leakRate;
        water = Math.max(0, water - (int)leakedWater);
        lastLeakTime = now;

        if (water < capacity) {
            water++;
            return true;
        } else {
            return false;
        }
    }
}

最后,总结下:

  • 计数器算法 :简单易实现,但存在窗口边界问题;
  • 滑动时间窗口算法 :解决了窗口边界问题,但内存开销较大;
  • 漏桶算法:可以平滑请求流量,但实现稍复杂。

熔断降级

熔断(降级):当某个资源出现不稳定、或不可用时,可以通过熔断机制暂时停止对该资源的调用,防止故障扩散。

如下图所示:

Sentinel最全详解(图文全面总结)

Sentinel 提供常见的熔断降级规则,如下:

响应时间(RT)熔断

当资源的平均响应时间超过阈值,且持续超过设定的时间窗口时,触发熔断;

列如:当资源的平均响应时间超过 500ms ,且在 1 分钟内持续出现,则熔断该资源。

异常比例(Exception Ratio)熔断

当资源的异常比例,超过阈值且持续超过设定的时间窗口时,触发熔断;

列如:当资源的异常比例超过 50% ,且在 1 分钟内持续出现,则熔断该资源。

异常数(Exception Count)熔断

当资源在单位时间窗口内的异常数超过阈值时,触发熔断。

列如:当资源在 1 分钟内的异常数超过 100 次,则熔断该资源。

实时监控和统计

除此之外,Sentinel 还提供详细的实时监控、和统计信息,协助开发者了解系统运行状况。

Sentinel最全详解(图文全面总结)

Sentinel 控制台是一个可视化的工具,用于展示实时监控数据、管理规则、和查看系统的整体健康状况。

Sentinel使用

1.加入Maven 依赖pom

在 Maven 项目,中引入 Sentinel 依赖:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>版本号</version>
</dependency>

2.配置规则

可以通过代码,配置:

DegradeRule rule = new DegradeRule();
rule.setResource("someResource");
rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
rule.setCount(500); // 平均响应时间阈值(ms)
rule.setTimeWindow(60); // 熔断持续时间(秒)
DegradeRuleManager.loadRules(Collections.singletonList(rule));

也可以,通过注解配置:

@SentinelResource(value = "someResource", blockHandler = "handleBlock", fallback = "fallback")
public String someMethod() {
    // 业务逻辑
    return "success";
}

public String handleBlock(BlockException ex) {
    return "请求被熔断";
}

public String fallback(Throwable ex) {
    return "服务降级处理";
}

3.运行监控

Sentinel最全详解(图文全面总结)

通过 Sentinel 控制台监控,实时流量数据和系统状态,及时发现、和解决问题。

本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。

Sentinel最全详解(图文全面总结)

© 版权声明

相关文章

2 条评论

您必须登录才能参与评论!
立即登录
  • 头像
    郁小月u 读者

    学到了💪

    无记录
  • 头像
    炒鸡帅帅虎 投稿者

    收藏了,感谢分享

    无记录