0x01: ExecuteLimitFilter
ExecuteLimitFilter ,在服务提供者,通过 的 "executes" 统一配置项开启:
表示每服务的每方法最大可并行执行请求数。
ExecuteLimitFilter是通过信号量来实现的对服务端的并发数的控制。
ExecuteLimitFilter执行流程:
首先会去获得服务提供者每服务每方法最大可并行执行请求数
如果每服务每方法最大可并行执行请求数大于零,那么就基于基于服务 URL + 方法维度获取一个RpcStatus实例
通过RpcStatus实例获取一个信号量,若果获取的这个信号量调用tryAcquire返回false,则抛出异常
如果没有抛异常,那么就调用RpcStatus静态方法beginCount,给这个 URL + 方法维度开始计数
调用服务
调用结束后计数调用RpcStatus静态方法endCount,计数结束
释放信号量
ExecuteLimitFilter
我们接下来看看RpcStatus这个类
这个方法很简单,大概就是给RpcStatus这个类里面的静态属性METHOD_STATISTICS里面设值。外层的map是以url为key,里层的map是以方法名为key。
这个方法是获取信号量,如果这个实例里面的信号量是空的,那么就添加一个,如果不是空的就返回。
0x02: TPSLimiter
TpsLimitFilter 过滤器,用于服务提供者中,提供限流的功能。
配置方式:
通过 配置项,添加到 或 或 中开启,例如:
通过 配置项,设置 TPS 周期。
源码分析
TpsLimitFilter
invoke方法调用了DefaultTPSLimiter的isAllowable,我们进入到isAllowable方法看一下
DefaultTPSLimiter
若要限流,调用 StatItem#isAllowable(url, invocation) 方法,根据 TPS 限流规则判断是否限制此次调用。
StatItem
领取专属 10元无门槛券
私享最新 技术干货