文章插图
- Sentinel是面向分布式服务架构的流量治理组件,以流量为切入点提供熔断限流的功能保证系统的稳定性 。
- Sentinel 里面以Entry作为限流的资源对象,每个Entry创建的同时会关联一系列功能插槽(slot chain) 。
- Sentinel提供了通用的原生Slot处理不同的逻辑 , 同时支持自定义Slot来定制功能 。
public interface ProcessorSlot<T> {void entry(Context context, ResourceWrapper resourceWrapper, T param, int count, boolean prioritized,Object... args) throws Throwable;void fireEntry(Context context, ResourceWrapper resourceWrapper, Object obj, int count, boolean prioritized,Object... args) throws Throwable;void exit(Context context, ResourceWrapper resourceWrapper, int count, Object... args);void fireExit(Context context, ResourceWrapper resourceWrapper, int count, Object... args);}public abstract class AbstractLinkedProcessorSlot<T> implements ProcessorSlot<T> {private AbstractLinkedProcessorSlot<?> next = null;@Overridepublic void fireEntry(Context context, ResourceWrapper resourceWrapper, Object obj, int count, boolean prioritized, Object... args)throws Throwable {// 触发下一个处理器对象的处理if (next != null) {next.transformEntry(context, resourceWrapper, obj, count, prioritized, args);}}void transformEntry(Context context, ResourceWrapper resourceWrapper, Object o, int count, boolean prioritized, Object... args)throws Throwable {T t = (T)o;// 执行具体处理器的逻辑,由具体的处理器自行实现entry(context, resourceWrapper, t, count, prioritized, args);}public void setNext(AbstractLinkedProcessorSlot<?> next) {// 绑定下一个处理器的逻辑this.next = next;}} public class NodeSelectorSlot extends AbstractLinkedProcessorSlot<Object> {private volatile Map<String, DefaultNode> map = new HashMap<String, DefaultNode>(10);@Overridepublic void entry(Context context, ResourceWrapper resourceWrapper, Object obj, int count, boolean prioritized, Object... args)throws Throwable {// 1、处理器处理本身的逻辑DefaultNode node = map.get(context.getName());context.setCurNode(node);// 2、处理器驱动触发下一个处理器fireEntry(context, resourceWrapper, node, count, prioritized, args);}}
说明:- Sentinel中的Slot需要实现
com.alibaba.csp.sentinel.slotchain.ProcessorSlot的通用接口 。 - 自定义Slot一般继承抽象类AbstractLinkedProcessorSlot且只要改写entry/exit方法实现自定义逻辑 。
- Slot通过next变量保存下一个处理器Slot对象 。
- 在自定义实现的entry方法中需要通过fireEntry触发下一个处理器的执行,在exit方法中通过fireExit触发下一个处理器的执行 。
public class DefaultSlotChainBuilder implements SlotChainBuilder {@Overridepublic ProcessorSlotChain build() {// 责任链的头部对象ProcessorSlotChainProcessorSlotChain chain = new DefaultProcessorSlotChain();// sortedSlotList获取所有的处理器对象List<ProcessorSlot> sortedSlotList = SpiLoader.of(ProcessorSlot.class).loadInstanceListSorted();for (ProcessorSlot slot : sortedSlotList) {if (!(slot instanceof AbstractLinkedProcessorSlot)) {continue;}// 通过尾添法将职责slot添加到DefaultProcessorSlotChain当中chain.addLast((AbstractLinkedProcessorSlot<?>) slot);}return chain;}}public class DefaultProcessorSlotChain extends ProcessorSlotChain {// 创建DefaultProcessorSlotChain的头尾节点first和endAbstractLinkedProcessorSlot<?> first = new AbstractLinkedProcessorSlot<Object>() {@Overridepublic void entry(Context context, ResourceWrapper resourceWrapper, Object t, int count, boolean prioritized, Object... args)throws Throwable {super.fireEntry(context, resourceWrapper, t, count, prioritized, args);}@Overridepublic void exit(Context context, ResourceWrapper resourceWrapper, int count, Object... args) {super.fireExit(context, resourceWrapper, count, args);}};AbstractLinkedProcessorSlot<?> end = first;@Overridepublic void addLast(AbstractLinkedProcessorSlot<?> protocolProcessor) {end.setNext(protocolProcessor);end = protocolProcessor;}}
说明:- ProcessorSlotChain作为Slot的责任链,负责责任链的构建和执行 。
- 责任链上的处理器对象
推荐阅读
- CORS 跨域资源共享在Spring Boot中的实现
- Java面试题之SpringBoot 框架
- 一文读懂Spring框架中的不同类型事件
- RouterSploit:一款功能强大的嵌入式设备渗透测试框架
- 校友眼中的李雪琴是个“怪人”,内耗严重,父母离婚是病因!
- 杨梅核能吞吗?杨梅核吞入胃中的好处
- 杭州电子厂老板,25年来待客只用“假茅台”,行家:高手中的高手
- 筱在名字中的寓意是什么
- 薛平贵中的西凉是哪里 西凉是哪里
- 祭祀之礼是指 祭祀之礼是指五礼中的