实践 | Sentinel 扩展性设计

简介:

Sentinel 提供多样的 SPI 接口用于提供扩展的能力。用户可以在用同一个 sentinel-core 的基础上自行扩展接口实现,从而可以方便地给 Sentinel 添加自定义的逻辑。

初始化逻辑扩展机制

为了统一初始化的流程,我们抽象出了 InitFunc 接口代表 Sentinel 的一些初始化逻辑,如:

  • 注册动态规则源(示例
  • 注册 StatisticSlot 回调函数(示例
  • 启动 Command Center
  • 初始化心跳发送

我们可以通过注解设置 InitFunc 执行的优先级。当应用首次访问资源时,注册的初始化函数会依次执行。若希望手动提前触发初始化,可以在相应的位置(如 Spring Bean)调用 InitExecutor.doInit() 函数,重复调用只会执行一次。

Slot Chain 扩展机制

Sentinel 内部是通过一系列的 slot 组成的 slot chain 来完成各种功能的,包括构建调用链、调用数据统计、规则检查等。各个 slot 之间的顺序非常重要。Sentinel 将 SlotChainBuilder 作为 SPI 接口进行扩展,使得 Slot Chain 具备了扩展的能力。用户可以自行加入自定义的 slot 并编排 slot 间的顺序,从而可以给 Sentinel 添加自定义的功能。

Slot Chain SPI

比如我们想要在请求 pass 后记录当前的 context 和资源信息,则可以实现一个简单的 slot:

public class DemoSlot extends AbstractLinkedProcessorSlot<DefaultNode> {

    @Override
    public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count, Object... args)
        throws Throwable {
        System.out.println("Current context: " + context.getName());
        System.out.println("Current entry resource: " + context.getCurEntry().getResourceWrapper().getName());
        fireEntry(context, resourceWrapper, node, count, args);
    }

    @Override
    public void exit(Context context, ResourceWrapper resourceWrapper, int count, Object... args) {
        System.out.println("Exiting for entry on DemoSlot: " + context.getCurEntry().getResourceWrapper().getName());
        fireExit(context, resourceWrapper, count, args);
    }
}

然后实现一个 SlotChainBuilder,可以在 DefaultSlotChainBuilder 的基础上将我们新的 slot 添加到链的尾部(当然也可以不用 DefaultSlotChainBuilder,自由组合现有的 slot):

package com.alibaba.csp.sentinel.demo.slot;

public class DemoSlotChainBuilder implements SlotChainBuilder {

    @Override
    public ProcessorSlotChain build() {
        ProcessorSlotChain chain = new DefaultSlotChainBuilder().build();
        chain.addLast(new DemoSlot());
        return chain;
    }
}

最后在 resources/META-INF/services 目录下的 SPI 配置文件 com.alibaba.csp.sentinel.slotchain.SlotChainBuilder 中添加上实现的 SlotChainBuilder 的类名即可生效:

# Custom slot chain builder
com.alibaba.csp.sentinel.demo.slot.DemoSlotChainBuilder

Sentinel 的热点限流模块就是利用了 Slot Chain 的扩展机制来将热点限流功能添加到原有的功能链中。

StatisticSlot Callback

之前 StatisticSlot 里面包含了太多的逻辑,像普通 QPS 和 热点参数 QPS 的 addPass/addBlock 等逻辑统计都在 StatisticSlot 里面,各个逻辑都杂糅在一起,不利于扩展。因此有必要为 StatisticSlot 抽象出一系列的 callback,从而使 StatisticSlot 具备基本的扩展能力,并将一系列的逻辑从 StatisticSlot 解耦出来,更为清晰。目前 Sentinel 提供了两种 callback:

  • ProcessorSlotEntryCallback:包含 onPassonBlocked 两个回调函数,分别对应请求通过 StatisticSlot 和请求被 blocked 的时候执行。
  • ProcessorSlotExitCallback:包含 onExit 回调函数,当请求经 StatisticSlot exit 的时候执行。

用户只需将实现的 callback 注册到 StatisticSlotCallbackRegistry 即可生效。

动态规则源

Sentinel 的 动态规则数据源 用于从外部的存储中读取及写入规则。Sentinel 将动态规则数据源划分为两种类型:读数据源(ReadableDataSource)和写数据源(WritableDataSource),从而使不同类型的数据源职责更加清晰:

  • 读数据源仅负责监听或轮询读取远程存储的变更。
  • 写数据源仅负责将规则变更写入到规则源中。

我们只需要自己实现动态规则源,然后将其注册至对应的 RuleManager 上,这样就可以实时地配置规则并进行拉取/推送了。注册动态规则源时可以借助 Sentinel 的 InitFunc SPI 在初始化时自动注册。

Transport 扩展机制

  • CommandCenter 可扩展:用户可以用不同的网络协议或不同的库来实现 Transport API Server。
  • HeartbeatSender 可扩展:用户可以用不同的网络协议和心跳策略来实现心跳发送(上报到控制台)。
  • CommandHandler 可扩展:用户可以自行实现 CommandHandler 并注册到 SPI 配置文件中来为 CommandCenter 添加自定义的命令。

欢迎关注“阿里巴巴中间件”,加入中间件开发者群,与技术同行。

101020104542_0949_2_Jpeg

相关文章
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
302 1
|
监控 Java Sentinel
使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)
Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
644 3
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
监控 Java Nacos
SpringCloud基础5——微服务保护、Sentinel
sentinel、雪崩问题、流量控制、隔离和降级、授权规则、规则持久化
SpringCloud基础5——微服务保护、Sentinel
|
监控 Java 应用服务中间件
SpringCloud面试之流量控制组件Sentinel详解
SpringCloud面试之流量控制组件Sentinel详解
1028 0
|
Java 开发者 Sentinel
Spring Cloud系列——使用Sentinel进行微服务保护
Spring Cloud系列——使用Sentinel进行微服务保护
383 5
|
监控 Java API
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
454 0
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
|
监控 Dubbo 应用服务中间件
通用快照方案问题之Sentinel与SpringCloud和Dubbo的整合如何解决
通用快照方案问题之Sentinel与SpringCloud和Dubbo的整合如何解决
173 0
|
Java 数据安全/隐私保护 Sentinel
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流