加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

限流降级神器,带你解读阿里巴巴开源 Sentinel 实现原理

发布时间:2019-07-12 00:20:47 所属栏目:建站 来源:Java高级互联网架构
导读:Sentinel 是阿里中间件团队开源的,面向漫衍式处事架构的轻量级高可用流量节制组件,首要以流量为切入点,从流量节制、熔断降级、体系负载掩护等多个维度来辅佐用户掩护处事的不变性。 各人也许会问:Sentinel 和之前常用的熔断降级库 Netflix Hystrix 有

Chain是链条的意思,从build的要领可看出,ProcessorSlotChain是一个链表,内里添加了许多个Slot。详细的实现必要到DefaultProcessorSlotChain中去看。

  1. public class DefaultProcessorSlotChain extends ProcessorSlotChain { 
  2.  
  3. AbstractLinkedProcessorSlot<?> first = new AbstractLinkedProcessorSlot<Object>() { 
  4.  
  5. @Override 
  6.  
  7. public void entry(Context context, ResourceWrapper resourceWrapper, Object t, int count, Object... args) 
  8.  
  9. throws Throwable { 
  10.  
  11. super.fireEntry(context, resourceWrapper, t, count, args); 
  12.  
  13.  
  14. @Override 
  15.  
  16. public void exit(Context context, ResourceWrapper resourceWrapper, int count, Object... args) { 
  17.  
  18. super.fireExit(context, resourceWrapper, count, args); 
  19.  
  20.  
  21. }; 
  22.  
  23. AbstractLinkedProcessorSlot<?> end = first; @Override public void addFirst(AbstractLinkedProcessorSlot<?> protocolProcessor) { protocolProcessor.setNext(first.getNext()); first.setNext(protocolProcessor); if (end == first) { end = protocolProcessor; } } @Override 
  24. public void addLast(AbstractLinkedProcessorSlot<?> protocolProcessor) 
  25.  
  26. end.setNext(protocolProcessor); 
  27.  
  28. end = protocolProcessor; 
  29.  
  30.  

DefaultProcessorSlotChain中有两个AbstractLinkedProcessorSlot范例的变量:first和end,这就是链表的头结点和尾节点。

建设DefaultProcessorSlotChain工具时,起首建设了首节点,然后把首节点赋值给了尾节点,可以用下图暗示:

限流降级神器,带你解读阿里巴巴开源 Sentinel 实现道理

将第一个节点添加到链表中后,整个链表的布局酿成了如下图这样:

限流降级神器,带你解读阿里巴巴开源 Sentinel 实现道理

将全部的节点都插手到链表中后,整个链表的布局酿成了如下图所示:

限流降级神器,带你解读阿里巴巴开源 Sentinel 实现道理

这样就将全部的Slot工具添加到了链表中去了,每一个Slot都是担任自AbstractLinkedProcessorSlot。而AbstractLinkedProcessorSlot是一种责任链的计划,每个工具中都有一个next属性,指向的是另一个AbstractLinkedProcessorSlot工具。着实责任链模式在许多框架中都有,好比Netty中是通过pipeline来实现的。

知道了SlotChain是怎样建设的了,那接下来就要看下是怎样执行Slot的entry要领的了。

执行SlotChain的entry要领

lookProcessChain要领得到的ProcessorSlotChain的实例是DefaultProcessorSlotChain,那么执行chain.entry要领,就会执行DefaultProcessorSlotChain的entry要领,而DefaultProcessorSlotChain的entry要领是这样的:

  1. @Override 
  2.  
  3. public void entry(Context context, ResourceWrapper resourceWrapper, Object t, int count, Object... args) 
  4.  
  5. throws Throwable { 
  6.  
  7. first.transformEntry(context, resourceWrapper, t, count, args); 
  8.  

也就是说,DefaultProcessorSlotChain的entry现实是执行的first属性的transformEntry要领。

而transformEntry要了解执行当前节点的entry要领,在DefaultProcessorSlotChain中first节点重写了entry要领,详细如下:

  1. @Override 
  2.  
  3. public void entry(Context context, ResourceWrapper resourceWrapper, Object t, int count, Object... args) 
  4.  
  5. throws Throwable { 
  6.  
  7. super.fireEntry(context, resourceWrapper, t, count, args); 
  8.  

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读