sentinel
文章平均质量分 68
胖柯G
这个作者很懒,什么都没留下…
展开
-
sentinel源码分析-09流量整形控制器
这里首先计算两个请求之间的间隔时间costTime,通过costTime计算下次请求可以通过的时间expectedTime,如果expectedTime <= currentTime说明当前时间已经到达expectedTime ,则请求可以正常通过,否则说明当前时间请求需要等待,计算等待时间waitTime,如果waitTime比设置的最大等待时间大则直接不允许通过,如果没有达到最大排队时间则等待waitTime后通过。关注控制每秒传入请求的计数,类似于令牌桶算法。原创 2023-08-26 17:35:51 · 86 阅读 · 0 评论 -
sentinel源码分析-08流量数据统计
这里就是将时间按照窗口数量化分成相同大小的环形桶,当前请求过来时,根据请求的时间查看落在那个时间窗口内,这里我们以成功通过后的数据统计为入口。我们可以看到统计节点主要是保存三种实时统计指标,每秒统计信息、每分钟的统计信息、并发线程数。ArrayMetric底层又是通过LeapArray来完成数据的统计,其中几个重要的属性。这里通过当前时间获取有效结果的时间窗集合,然后遍历所有时间窗集合然后或的成功的请求总数。这里array可以理解就是一个环形的桶,首先计算当前时间落在那个桶中,及计算索引值。原创 2023-08-26 17:01:25 · 132 阅读 · 0 评论 -
sentinel源码分析-07GatewayFlowSlot网关限流
如果没有设置pattern则直接返回取值结果,如果设置pattern则可能是针对某类参数生效,支持3种模式精确匹配、子串匹配和正则匹配,如果匹配成功则返回参数值否则返回默认值$NM,它会匹配热点参数规则的参数例外项,但是例外项的阈值是100万,等同于直接放行。解析设置的参数放入参数数组,如果有没有参数的规则,则将参数数组的最后一位设置成默认参数$D,为了进行资源的所有无参数例外项的热点规则流控校验。这里设置了两个分组,并设置了对应匹配分组的规则。将无参网关流控规则,转换为热点参数规则。原创 2023-08-19 17:55:02 · 212 阅读 · 0 评论 -
sentinel源码分析-06热点参数限流
这里是一个简单的令牌桶,每次执行逻辑查看是否需要限流时,计算上次添加令牌的时间距离当前时间差,如果时间大于一个周期,则重置令牌桶令牌数量,然后立即使用acquireCount个令牌,如果已经存在令牌桶则计算上次添加时间到当前时间差可以放入的令牌数和剩余令牌数之和是否能够支持acquireCount个令牌,如果达不到则需要限流。热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。这里获取热点数据流控规则,通过配置规则中的设置的索引获取对应需要限流的热点参数。原创 2023-08-19 16:27:21 · 75 阅读 · 0 评论 -
sentinel源码分析-05核心链路调用
这里可能是为了高并发考虑,使用copyOnWrite操作,clusterNodeMap是使用static volatile修饰的,如果直接put其他线程无法感知到map内容的变化,通过copyOnWrite操作重新赋值,会使clusterNodeMap地址发生改变,其他线程会感知到变化,保证数据一致性,同时起到读写分离的效果,提高读写并发,同时创建的临时map进行了初始容量的赋值,不会因为扩容导致性能波动。资源调用会创建一个CtEntry,然后开始执行上面创建的执行链。原创 2023-08-19 16:24:12 · 72 阅读 · 0 评论 -
sentinel源码分析-03构建执行链
这里又是通过SPI机制获取所有SlotChainBuilder的实现类,查看META-INF.services下的com.alibaba.csp.sentinel.slotchain.SlotChainBuilder文件。上文中我们分析了核心逻辑入口是SphU.entry(target, EntryType.IN),我们只分析了一些初始化逻辑下面,我们分析一下核心限流处理逻辑。首先查看之前线程有没有创建了context,如果已经有了就直接获取,如果没有则创建默认的context。这里主要完成以下几个事情。原创 2023-08-12 17:50:07 · 54 阅读 · 0 评论 -
sentinel源码分析-04核心概念介绍
sentinel中的资源类,可以通过注解SentinelResource指定资源,具体的资源类是ResourceWrapper,包装了name和entryType属性,用户可以为需要保护的对象创建一个资源类,然后再配置相对于的规则就可以实现对资源的保护,同时资源和规则是解耦的,而且规则可以在运行时进行修改。原创 2023-08-12 18:22:19 · 121 阅读 · 0 评论 -
sentinel源码分析-02客户端处理服务端下发请求
这里代码比较长,其实主要逻辑就是将字符串请求解析为CommandRequest请求,根据请求获取对应的处理器,如果没有找到返回错误请求,如果有对象请求处理器,则执行命令处理然后返回请求结果。到这里我们分析完了服务端下发命令到客户端后客户端是如何处理请求和保存数据的,我们发现这些数据都保存在内存中,组件重启就会丢失,所以需要外部持久化存储规则数据。sentinel客户端中会存储一些限流规则而这些限流规则是我们通过页面配置后由服务端下发下来的,下面让我们来看看客户端是如何接收服务端下发的命令的。原创 2023-08-06 14:26:55 · 89 阅读 · 0 评论 -
sentinel源码分析-01客户端启动和注册
w.func.init()方法会执行每个InitFunc实现类的init()方法,根据InitOrder注解对初始化实现类进行排序,值越小优先级越高,会先执行CommandCenterInitFunc和HeartbeatSenderInitFunc的init方法。这里通过SPI机制会去加载META-INF/services/下的com.alibaba.csp.sentinel.init.InitFunc文件获取InitFunc接口的实现类。查看CommonFilter.doFilter方法。原创 2023-08-06 14:23:23 · 158 阅读 · 0 评论