(三) 限流原理分析
项目结构
将Sentinel的源码fork到自己的github库中,接着把源码clone到本地,然后开始源码阅读之旅吧。
首先我们看一下Sentinel项目的整个结构:

- sentinel-core 核心模块,限流、降级、系统保护等都在这里实现
- sentinel-dashboard 控制台模块,可以对连接上的sentinel客户端实现可视化的管理
- sentinel-transport 传输模块,提供了基本的监控服务端和客户端的API接口,以及一些基于不同库的实现
- sentinel-extension 扩展模块,主要对DataSource进行了部分扩展实现
- sentinel-adapter 适配器模块,主要实现了对一些常见框架的适配
- sentinel-demo 样例模块,可参考怎么使用sentinel进行限流、降级等
- sentinel-benchmark 基准测试模块,对核心代码的精确性提供基准测试
限流原理分析
首先从入口开始:SphU.entry(resourceName) 。这个方法会去申请一个entry,如果能够申请成功,则说明没有被限流,否则会抛出BlockException,表示已经被限流了。
从SphU.entry() 方法往下执行会进入到 Env.sph.entry(name, EntryType.OUT, 1, OBJECTS0) ,Sph的默认实现类是 CtSph 。
首先会根据资源名称和类型创建 StringResourceWrapper。这个表示资源的类
public Entry entry(String name, EntryType type, int count, Object... args) throws BlockException {
StringResourceWrapper resource = new StringResourceWrapper(name, type);
return this.entry(resource, count, args);
}