首页 - 推荐新闻 - 福建省,猫脸老太太,喀斯特地貌-手工制造,手办自己打造,二次元新闻在线

福建省,猫脸老太太,喀斯特地貌-手工制造,手办自己打造,二次元新闻在线

发布时间:2019-07-12  分类:推荐新闻  作者:admin  浏览:195

本文首要研究一下dubbo的TPSLimiter

TPSLimiter

dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/tps/TPSLimiter.java

public interface TPSLimiter {

/**
* judge if the current invocation is allowed by TPS rule
*
* @param url url
* @param invocation invocation
* @return true allow the current invocation, otherwise, return false
*/
boolean isAllowable(URL url, Invocation invocation);

}
  • TPSLimiter界说了isAllowable办法

DefaultTPSLimiter

dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/tps/DefaultTPSLimiter.java

public class DefaultTPSLimiter implements TPSLimiter {

private final ConcurrentMap stats = new ConcurrentHashMap();

@Override
public boolean isAllowable(URL url, Invocation invocation) {
int rate = url.getParameter(TPS_LIMIT_RATE_KEY, -1);
long interval = url.getParameter(TPS_LIMIT_INTERVAL_KEY, DEFAULT_TPS_LIMIT_INTERVAL);
String serviceKey = url.getServiceKey();
if (rate > 0) {
StatItem statItem = stats.get(serviceKey);
if (statItem == null) {
stats.putIfAbsent(serviceKey, new StatItem(serviceKey, rate, interval));
statItem = stats.get(serviceKey);
} else {
//rate or interval has changed, rebuild
if (statItem.getRate() != rate || statItem.getInterval() != interval) {
stats.put(serviceKey, new StatItem(serviceKey, rate, interval));
statItem = stats.get(serviceKey);
}
}
return statItem.isAllowable();
} else {
StatItem statItem = stats.get(serviceKey);
if (statItem != null) {
stats.remove(serviceKey);
}
}

return true;
}

}
  • DefaultTPSLimiter完成了TPSLimiter,它运用ConcurrentHashMap来存储StatItem,其key为URL中的serviceKey;isAllowable办法从URL中读取tps参数,默以为-1,小于0则从ConcurrentHashMap中移除,大于0则创立或许获取StatItem,调用StatItem的isAllowable(重置或递减token并回来成果)

StatItem

dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/tps/StatItem.java

class StatItem {

private String name;

private long lastResetTime;

private long interval;

private LongAdder token;

private int rate;

StatItem(String name, int rate, long interval) {
this.name = name;
this.rate = rate;
this.interval = interval;
this.lastResetTime = System.currentTimeMillis();
this.token = buildLongAdder(rate);
}

public boolean isAllowable() {
long now = System.currentTimeMillis();
if (now > lastResetTime + interval) {
token = buildLongAdder(rate);
lastResetTime = now;
}

if (token.sum() < 0) {
return false;
}
token.decrement();
return true;
}

public long getInterval() {
return interval;
}


public int getRate() {
return rate;
}


long getLastResetTime() {
return lastResetTime;
}

long getToken() {
return token.sum();
}

@Override
public String toString() {
return new StringBuilder(32).append("StatItem ")
.append("[name=").append(name).append(", ")
.append("rate = ").append(rate).append(", ")
.append("interval = ").append(interval).append("]")
.toString();
}

private LongAdder buildLongAdder(int rate) {
LongAdder adder = new LongAdder();
adder.add(rate);
return adder;
}

}
  • StatItem界说了LongAdder类型的token,其isAllowable办法会判别是否需求重置token,假如需求则运用buildLongAdder重置token,不需求的话则在token.sum() < 0时回来false,假如大于等于0则递减token

小结

  • TPSLimiter界说了isAllowable办法
  • DefaultTPSLimiter完成了TPSLimiter,它运用ConcurrentHashMap来存储StatItem,其key为URL中的serviceKey;isAllowable办法从URL中读取tps参数,默以为-1,小于0则从ConcurrentHashMap中移除,大于0则创立或许获取StatItem,调用StatItem的isAllowable(重置或递减token并回来成果)
  • StatItem界说了LongAdder类型的token,其isAllowable办法会判别是否需求重置token,假如需求则运用buildLongAdder重置token,不需求的话则在token.sum() < 0时回来false,假如大于等于0则递减token

doc

  • TPSLimiter
  • DefaultTPSLimiter
  • StatItem
下一篇
快捷导航
最新发布
标签列表