开源项目中的设计模式(一) - Alibaba Sentinel与责任链模式

责任链模式

责任链模式是一种行为型设计模式,他通过将一系列的操作行为串联成一个链路构造出一个链式的结构,每一次调用链路的时候,链路上的每一个行为都可能会对此次调用进行一定的处理。

责任链模式可以用于权限控制,OA流程等等,当然在Java Web中的Filter也使用到了这种设计模式。

Alibaba Sentinel

回到我们的正题,接下来我将讲述开源项目Alibaba Sentinel是如何在项目中应用责任链模式的。

Alibaba Sentinel是一个开源的高可用防护组件,实现了限流熔断等能力。

对于限流熔断的通用场景来说,我们会涉及到的麻烦事在于用户可能会配置非常多的规则,并且每种规则可能有不同的处理逻辑。在这种场合下显然使用责任链模式是非常合适的。

那么我们来看下Sentinel是如何来实现责任链的。

实战

Sentinel定义了一个接口ProcessorSlot,这个接口就是责任链模式的实现核心。

在这个接口中定义了四个方法:

  1. entry 进入Slot
  2. fireEntry entry执行完成后调用
  3. exit 离开Slot
  4. fireExit exit执行完成后调用

以ProcessorSlot为基础,Sentinel定义了抽象实现类AbstractLinkedProcessorSlot,之后包括FlowSlot,DegradeSlot等等实现都继承了这个抽象类来实现,这些Slot就是整个责任链的链路了。

Sentinel通过SlotChainBuilder来对责任链的整个链路进行初始化。在默认实现中各个Slot使用Spi的形式进行定义和管理,并且在此处使用ServiceLoader来进行装载。也就是在此时决定了整个链路的执行顺序和优先级。后续的流量进入之后就会按照预定的顺序执行每个Slot的方法。

Sentinel定义了SphU,SphO等类来实现流量的入口管控,之后流量就会进入到整个链路中执行整个责任链。

java 复制代码
Entry e = new CtEntry(resourceWrapper, chain, context, count, argMap);
try {
    chain.entry(context, resourceWrapper, null, count, prioritized, args);
} catch (BlockException e1) {
    e.exit(count, args);
    throw e1;
} catch (Throwable e1) {
    // This should not happen, unless there are errors existing in Sentinel internal.
    RecordLog.info("Sentinel unexpected exception", e1);
}

责任链模式在Sentinel中的作用

回过头来看整个责任链模式在这个场合中的使用,我们不难发现其优势,在开源项目不断迭代新增功能的情况下,责任链模式对于后续的能力拓展非常有利。如果将来需要新增一种流量的校验模式,我们只需要继承AbstractLinkedProcessorSlot申明一个新的Slot,并且设定好这个Slot的执行顺序,我们无需修改任何之前的代码。

在这种设计下完美符合开闭原则,并且从代码设计上来说也更加利于整理的流程控制。比如在Sentinel中做数据统计也同样是新增了Slot来实现的,从这种角度上来说确实是十分便利。

总结

在这个系列中我不会重复向大家介绍每个设计模式的形态和使用方式,我只会单纯向大家展示开源项目中是如何使用到了这些设计方式,这么做的优势是什么。

相关推荐
武子康19 分钟前
150毫秒和2400毫秒:同一 Agent 任务的两种延迟
人工智能·后端·agent
海边捡石子1 小时前
FreeSWITCH 入门:把电话系统接入语音客服机器人
人工智能·后端
武子康1 小时前
Agent 偏好记忆怎样确认写入:范围、版本与撤销的一个最小例
人工智能·后端·agent
Bazingga1 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
对象存储与RustFS1 小时前
网盘限速逼你开会员?用 RustFS 自己搭一个不限速的“私人网盘
服务器·后端·docker
Thneonl1 小时前
你写的 NetworkPolicy 可能一条都没生效
后端·架构
王中阳Go2 小时前
质保期第 90 天我翻了一遍日志目录:交付后真正会坏的 3 处
人工智能·后端·agent
卷无止境2 小时前
一人公司的全栈选型指南:让 AI Agent 写得快,也让生意跑得稳
后端·python
SL_staff3 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3273 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信