限流组件Sentienl

Sentienl是分布式系统的防御系统,以流量为切入点,通过设置流量控制、服务熔断达到保护系统的目的

Slot介绍:

  • NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;

  • ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;

  • StatisticSlot 则用于记录、统计不同纬度的 runtime 指标监控信息(滑动窗口);

  • PaeamFlowSlot 对应热点流控

  • FlowSlot 则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;

  • AuthoritySlot 则根据配置的黑白名单和调用来源信息,来做黑白名单控制;

  • DegradeSlot 则通过统计信息以及预设的规则,来做熔断降级;

  • SystemSlot 则通过系统的状态,例如 load1 等,来控制总的入口流量;

Context

Context对资源操作的上下文,每个操作属于一个Context,如果代码中没有指定Context,会创建一个默认的,一个Context生命周期可包含多个资源,当最后一个资源在exit()是会清理Context

NodeSelectorSlot

这个 slot 主要负责收集资源的路径,并将这些资源的调用路径以树状结构存储起来,用于根据调用路径进行流量控制。实现代码:

 //来自appA访问Context,Context名字为entrance1
 ContextUtil.enter("entrance1", "appA");
 //获取资源的操作对象
 try{
 Entry nodeA = SphU.entry("nodeA");
}catch(BlockException e){
	//若资源被限流  执行降级处理
}
if (nodeA != null) {
    nodeA.exit();
 }
 //释放
 ContextUtil.exit();

Node之间的关系

Node:用于完成统计的接口

StatisticNode:统计节点,node的实现类

EntranceNode:入口节点,统计总体流量数据

DefaultNode:默认节点,统计一个资源在Context中数据

Cluster:集群节点,统计资源在Context中总体流量数据

 entryWithPriority

entryWithPriority方法从Threadlocal中获取context,一个请求线程绑定一个context

Context context = ContextUtil.getContext();
//若context是NullContext类型,表示已经超出阈值
if(context instanceof NullContext){
//返回无序检测的资源操作
   return new CtEntry(resourceWrapper,bull,context);
}

查找SlotCain,若槽链为空也说明chain数量超出阈值

不为空则创建资源操作对象

Context创建

Context创建参数需要名称以及来源,从Threadlocal中获取context

若为空,从缓存map中获取(key为名称,value为EntranceNode),若map的size大于阈值,返回null

不为空,加锁、在重新判断context是否为空,双重检测防止并发创建

创建entranceNode后写入缓存map,在封装为context写入Threadlocal

Chain创建

若builder不为空直接使用,构建chain,

否则加载配置文件通过SPI方式创建builder,通过链表进行节点连接,使用order实现先后顺序

再从缓存中获取DefaultNode,(若没有使用可重入锁判断创建DefaultNode),切换到下一个节点

StatisticSlot.java

//调用slotchain中所有slot,完成规则检测
fireEntry(context,resourcewrapper,node,count,prioritized,args);
若检测通过,则增加线程数量与qps

FlowSlot

先获取指定资源所有流控规则,遍历判断每个规则,若无法通过抛出异常

规则(阈值、流控模式、流控效果:0快速失败、1:warm up类似令牌桶算法、2:排队类似漏斗算法3:1+2

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远走与梦游

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值