天天看点

阿里 Sentinel 源码解析(上)简介Sentinel 的数据统计StatisticNodeArrayMetric

简介

Sentinel提供了丰富的限流、熔断功能。它支持控制台配置限流、熔断规则,支持集群限流,并可以将相应服务调用情况可视化。

目前已经有很多项目接入了Sentinel,而本文主要是对Sentinel的限流功能做一次详细的分析。

Sentinel会进行流量统计,执行流量控制规则。而统计数据的展示和规则的设置在 sentinel-dashboard 项目中,这是一个 Spring MVC 应用,有后台管理界面,我们通过这个管理后台和各个应用进行交互。

当然,你不一定需要 dashboard,仅仅使用 sentinel-core,它会将统计信息写入到指定的日志文件中,通过该文件内容来了解每个接口的流量情况。这时只是使用到了 Sentinel 的流量监控功能。

dashboard 应用默认不持久化数据,它的所有数据都在内存,所以 dashboard 重启意味着所有数据都会丢失。你应按需要定制化 dashboard,如至少你应该要持久化规则设置,QPS 数据非常适合存放在时序数据库中,当然如果你的数据量不大,存 MySQL 也问题不大,定期清理一下过期数据即可,因为大部分人应该不会关心一个月以前的 QPS。

Sentinel 的核心将不同 Slot 按序串在一起(责任链模式),从而将不同功能(限流、降级、系统保护)组合在一起。核心结构:

阿里 Sentinel 源码解析(上)简介Sentinel 的数据统计StatisticNodeArrayMetric

slot chain 其实可以分为两部分:统计数据构建部分(statistic)和判断部分(rule checking)。

Sentinel 的数据统计

数据统计模块的内容,这样读者在后面看到相应的内容的时候心里有一些底。这节内容还是比较简单的,当然,如果你希望立马进入 Sentinel 的主流程,可以先跳过这一节。

Sentinel 的定位是流量控制,它有两个维度的控制,一个是控制并发线程数,另一个是控制 QPS,它们都是针对某个具体的接口来设置的,其实说资源比较准确,Sentinel 把控制的粒度定义为 Resource。

要做控制,首先就要先做统计,它要知道当前接口的 QPS 和并发是多少,进而判断一个新的请求能不能让它通过。

数据统计的代码在

StatisticNode

阿里 Sentinel 源码解析(上)简介Sentinel 的数据统计StatisticNodeArrayMetric

QPS 数据使用了滑动窗口:

阿里 Sentinel 源码解析(上)简介Sentinel 的数据统计StatisticNodeArrayMetric

保存最近60秒的统计信息。 windowLengthInMs 故意设置为1000毫秒,表示每秒每个桶,这样我们就可以获得每秒的准确统计信息。

阿里 Sentinel 源码解析(上)简介Sentinel 的数据统计StatisticNodeArrayMetric

线程数量的计数器,即统计并发量

阿里 Sentinel 源码解析(上)简介Sentinel 的数据统计StatisticNodeArrayMetric

可知,Sentinel 统计了 秒 和 分 两个维度,现在看其实现类

ArrayMetric

Sentinel中的基本度量标准类,使用内部 BucketLeapArray。

阿里 Sentinel 源码解析(上)简介Sentinel 的数据统计StatisticNodeArrayMetric

属性

以分钟维度统计的使用来说,使用子类 BucketLeapArray 实现。

阿里 Sentinel 源码解析(上)简介Sentinel 的数据统计StatisticNodeArrayMetric

构造器

阿里 Sentinel 源码解析(上)简介Sentinel 的数据统计StatisticNodeArrayMetric