in dubbo/client.py [0:0]
def _routing_with_wight(self, interface):
"""
根据接口名称以及配置好的权重信息获取一个host
:param interface:
:return:
"""
hosts = self.hosts[interface]
if not hosts:
raise RegisterException('no providers for interface {}'.format(interface))
# 此接口没有权重设置,使用朴素的路由算法
if interface not in self.weights or not self.weights[interface]:
return random.choice(hosts)
weights = self.weights[interface]
hosts_weight = []
for host in hosts:
hosts_weight.append(int(weights.get(host, 100)))
hit = random.randint(0, sum(hosts_weight) - 1)
for i in xrange(len(hosts)):
if hit <= sum(hosts_weight[:i + 1]):
return hosts[i]
raise RegisterException('Error for finding [{}] host with weight.'.format(interface))