赞
踩
dubbo中的负载类图如下:
1. dubbo中的负载均衡采用模板方法方式设计,其中接口LoadBalance定义了选取Ivnvoker的策略,根据Invocation,url,List选择出一个合适的Invoker。其中声明了方法如下:
<T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation)public abstract class AbstractLoadBalance implements LoadBalance {
static int calculateWarmupWeight(int uptime, int warmup, int weight) {
int ww = (int) ((float) uptime / ((float) warmup / (float) weight));
return ww < 1 ? 1 : (ww > weight ? weight : ww);
}
public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) {
if (invokers == null || invokers.size() == 0)
return null;
if (invokers.size() == 1)
return invokers.get(0);
// 调用模板方法
return doSelect(invokers, url, invocation);
}
// 具体选择哪个Invoker的算法由子类具体实现
protected abstract <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation);
/** 计算每个Invoker的权重,集群中的每一个provider都是一个Invoker,
** 每一个provider可以在服务端设置权重,即consumer在进行选择Inovker时
** 要计算每一个invoker的权重,从而选择出更合适的invoker
**/
protected int getWeight(Invoker<?> invoker, Invocation invocation) {
int weight = invoker.getUrl().getMethodParameter(invocation.getMethodName(), Constants.WEIGHT_KEY, Constants.DEFAULT_WEIGHT);
if (weight > 0) {
long timestamp = invoker.getUrl().getParameter(Constants.REMOTE_TIMESTAMP_KEY, 0L);
if (timestamp > 0L) {
int uptime = (int) (System.currentTimeMillis() - timestamp);
int warmup = invoker.getUrl().getParameter(Constants.WARMUP_KEY, Constants.DEFAULT_WARMUP);
if (uptime > 0 && uptime < warmup) {
weight = calculateWarmupWeight(uptime, warmup, weight);
}
}
}
return weight;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。