权重算法
通过学习Nacos,在nacos中源码发现NamingService.selectOneHealthyInstance的权重算法。
基础含义
权重是一个相对的概念,是针对某一指标而言。某一指标的权重是指该指标在整体评价中的相对重要程度。
如:学生期末总评是对学生平时成绩,期中考成绩,期末考成绩的综合评价,但是这三个成绩所占期末总评的成绩的比重不一样。若平时成绩占30%,期中考成绩占30%,期末考成绩占40%,那么期末总评=平时成绩0.3+期中考成绩0.3+期末考成绩0.4。
再打个比方说, 一件事情, 你给它打100分, 你的老板给它打60分, 如果平均, 则是(100+60)/2=80分. 但因为老板说的话分量比你重, 假如老板的权重是2, 你是1, 这时求平均值就是加权平均了, 结果是(1001 + 602)/(1+2)=73.3分, 显然向你的老板那里倾斜了。假如老板权重是1,你的权重是3,结果是(1003+60*1)/(1+3)=90。这就是根据权重的不同进行的平均数的计算,所以又叫加权平均数
在源码中,我们发现 的方法是 refresh()以及randomWithWeight()
protected static Instance getHostByRandomWeight(List<Instance> hosts) {
LogUtils.NAMING_LOGGER.debug("entry randomWithWeight");
if (hosts != null && hosts.size() != 0) {
LogUtils.NAMING_LOGGER.debug("new Chooser");
List<Pair<Instance>> hostsWithWeight = new ArrayList();
Iterator var2 = hosts.iterator();
while(var2.hasNext()) {
Instance host = (Instance)var2.next();
if (host.isHealthy()) {
hostsWithWeight.add(new Pair(host, host.getWeight()));
}
}
LogUtils.NAMING_LOGGER.debug(