| # coding=utf-8 |
| import random |
| from urllib2 import HTTPError |
| |
| from pyjsonrpc import HttpClient, JsonRpcError |
| |
| from dubbo_client.rpcerror import NoProvider, ConnectionFail, dubbo_client_errors, InternalError |
| |
| |
| __author__ = 'caozupeng' |
| |
| |
| class DubboClient(object): |
| interface = '' |
| group = '' |
| version = '' |
| |
| class _Method(object): |
| |
| def __init__(self, client_instance, method): |
| self.client_instance = client_instance |
| self.method = method |
| |
| def __call__(self, *args, **kwargs): |
| return self.client_instance.call(self.method, *args, **kwargs) |
| |
| def __init__(self, interface, registry, **kwargs): |
| self.interface = interface |
| self.registry = registry |
| self.group = kwargs.get('group', '') |
| self.version = kwargs.get('version', '') |
| self.registry.add_provider_listener(interface) |
| |
| def call(self, method, *args, **kwargs): |
| provides = self.registry.get_provides(self.interface, {}, version=self.version, group=self.group) |
| if len(provides) == 0: |
| raise NoProvider('can not find provide', self.interface) |
| ip_port, service_url = random.choice(provides.items()) |
| # print service_url.location |
| client = HttpClient(url="http://{0}{1}".format(ip_port, service_url.path)) |
| try: |
| return client.call(method, *args, **kwargs) |
| except HTTPError, e: |
| raise ConnectionFail(None, e.filename) |
| except JsonRpcError, error: |
| raise dubbo_client_errors.get(error.code, None) |
| except Exception, ue: |
| raise InternalError(ue.message, None) |
| |
| def __call__(self, method, *args, **kwargs): |
| """ |
| Redirects the direct call to *self.call* |
| """ |
| return self.call(method, *args, **kwargs) |
| |
| def __getattr__(self, method): |
| """ |
| Allows the usage of attributes as *method* names. |
| """ |
| return self._Method(client_instance=self, method=method) |
| |
| |
| if __name__ == '__main__': |
| pass |