1.引言
上一篇我们主要介绍了Sentinel概念上的东西,让大家对Sentinel有一个大致上的认识。本篇将会为大家介绍Sentinel的整体架构设计以及Sentinel的核心模块的简介,后续文章中也会通过Sentinel核心模块的源码为大家深度剖析Sentinel。
2.Sentinel架构设计
我们可以先构思一下如果自己是Sentinel,自己会如何对来源请求进行限流(也可是降级、熔断操作)。首先要有一个对限流目标的评判物,而且这个物要求有时效性,当有了评判物后,我们就可以拿着评判物根据之前规定的限流规则来进行判定是否进行限流。
Sentinel其实也是这样的流程,对数据进行收集,在计算分析。Sentinel的工作链--Slot Chain可以分为两部分:统计数据构建部分和判断部分。其核心结构如下:
统计数据构建部分:
- NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;
- ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的qps,线程数等等,这些信息将用作为多角度限流,降级的依据;
- StatisticSlot 通过滑动窗口算法则用于记录、统计不同角度的运行时指标监控信息;
判断部分:
- ParamFlowSlot 热点数据流控;
- SystemSlot 通过判断系统相关指标来进行限流;
- AuthoritySlot 根据配置的黑白名单和调用来源信息,来做黑白名单控制,对应授权规则;
- FlowSlot 用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制,对应流控规则;
- DegradeSlot 通过统计信息以及预设的规则,来做熔断降级;
3.源码模块以及介绍
源码地址:
- sentinel-adapter 适配器模块,主要实现了对一些常见框架的适配
- sentinel-benchmark 基准测试模块,对核心代码的精确性提供基准测试
- sentinel-cluster 集群流控,主要是负责sentinel集群流控相关功能的
- sentinel-core 限流核心模块,限流、降级、熔断等功能都在这里实现
- sentinel-dashboard 控制台模块,可以对连接上的sentinel客户端实现可视化的管理
- sentinel-demo 样例模块,可参考怎么使用sentinel进行限流、降级等
- sentinel-extension 扩展模块,主要对DataSource进行了部分扩展实现
- sentinel-logging 日志模块
- sentinel-transport 传输模块,提供了基本的监控服务端和客户端的API接口,以及一些基于不同库的实现(Netty和Http)
4.小结
Sentinel使用了责任链这种设计模式,内部构建一个一个资源的调用关系树做为入口,内部采用高性能滑动窗口实现来进行数据采集,同时将各种不同拦截功能构造成一个连接链组成了限流、熔断等核心功能。Sentinel将ProcessorSlot作为SPI接口进行扩展,使得Slot Chain具备了扩展的能力。您可以自行加入自定义的slot并编排slot间的顺序,从而可以给Sentinel添加自定义的功能。然后关于这个责任链,其实他就是一个Slot的链表结构。
至此的前三篇文章介绍了Sentinel是什么、Sentinel的架构以及简单使用。下篇文章就正式开始对Sentinel源码进行剖析了。