in dubbo_client/registry.py [0:0]
def get_random_provider(self, interface, **kwargs):
"""
根据权重和是否禁用获取一个provider
:param interface:
:param kwargs:
:return:
"""
group = kwargs.get('group', '')
version = kwargs.get('version', '')
key = self._to_key(interface, version, group)
second_dict = self._service_providers.get(interface, {})
service_url_list = [service_url for service_url in second_dict.get(key, {}).itervalues() if
not service_url.disabled and service_url.weight > 0]
if not service_url_list:
raise NoProvider('can not find provider', interface)
total_weight = 0
same_weight = True
last_service_url = None
for service_url in service_url_list:
total_weight += service_url.weight
if same_weight and last_service_url and last_service_url.weight != service_url.weight:
same_weight = False
last_service_url = service_url
if total_weight > 0 and not same_weight:
offset = random.randint(0, total_weight - 1)
for service_url in service_url_list:
offset -= service_url.weight
if offset < 0:
return service_url
return random.choice(service_url_list)