Dubbo之TpsLimitFilter

TpsLimitFilter:

我们这里以TpsLimitFilter为例来说明Filter的实现。TpsLimitFilter用于限制远程调用的TPS,即每秒可以执行多少次远程调用。其源码如下:

 首先,根据Activate注解可以看到,该Filter的激活条件是服务提供方,并且URL中配置了名为Constants.TPS_LIMIT_RATE_KEY的参数。该Filter持有一个TPSLimiter的实例,然后调用其isAllowable方法判断一次调用是否被允许。

TPSLimiter是一个接口,只有一个isAllowable方法,参数是URL和调用上下文。

代码如下

TPSLimiter 默认实现 DefaultTPSLimiter 代码如下:



 

首先从URL中获取配置的限制,限制由两个参数组成,表示在interval毫秒的时间内允许执行rate个调用,默认周期是60秒,不限制速率。实际的判断动作委托给StatItem类,每个服务设置了tps限制的服务都有一个StatItem类的实例,DefaultTPSLimiter持有所有这些实例。StatItem保存了限制信息和调用次数,并负责判断当次调用是否允许,判断代码如下,算法是,首先看本次调用距上次调用是否超过了一个限制周期,如果超过,则记录当前的时间作为重新统计的复位时间,如果没有,则看调用次数有没有超过限制的次数。

代码如下:

 

正常测试案列:



 

异常测试案列:



 上面这个异常是,Constants.TPS_LIMIT_RATE_KEY设置的为5,

所以 filter.invoke(invoker, invocation) 循环5次;可以正常的运行,

一旦超过5次,就会出现异常。

猜你喜欢

转载自kuanghe.iteye.com/blog/2393306