blob: 68c72e45e1434d1671072a920bc21cc4f7a340d7 [file] [log] [blame]
# -*- coding: utf-8 -*-
import logging
from connection.connections import connection_pool
logger = logging.getLogger('dubbo.py')
class DubboClient(object):
"""
用于实现dubbo调用的客户端
"""
def __init__(self, interface, version='1.0.0', dubbo_version='2.4.10', zk_register=None, host=None):
"""
:param interface: 接口名,例如:com.qianmi.pc.es.api.EsProductQueryProvider
:param version: 接口的版本号,例如:1.0.0,默认为1.0.0
:param dubbo_version: dubbo的版本号,默认为2.4.10
:param zk_register: zookeeper注册中心管理端,参见类:ZkRegister
:param host: 远程主机地址,用于绕过zookeeper进行直连,例如:172.21.4.98:20882
"""
self.__interface = interface
self.__version = version
self.__dubbo_version = dubbo_version
self.__zk_register = zk_register
self.__host = host
def call(self, method, args=(), timeout=None):
"""
执行远程调用
:param method: 远程调用的方法名
:param args: 方法参数
1. 对于没有参数的方法,此参数不填;
2. 对于只有一个参数的方法,直接填入该参数;
3. 对于有多个参数的方法,传入一个包含了所有参数的列表;
:param timeout: 请求超时时间(秒),不设置则不会超时。默认不设置,如无特殊需求不建议设置
* 不设置超时时间在某些极限情况下可能导致此连接一直阻塞;
* 设置超时时间会增加远程调用的时间;
:return:
"""
if not isinstance(args, (list, tuple)):
args = [args]
if self.__zk_register: # 优先从zk中获取provider的host
host = self.__zk_register.get_provider_host(self.__interface)
else:
host = self.__host
# logger.debug('get host {}'.format(host))
request_param = {
'dubbo_version': self.__dubbo_version,
'version': self.__version,
'path': self.__interface,
'method': method,
'arguments': args
}
# logger.debug(request_param)
result = connection_pool.get(host, request_param, timeout)
return result
if __name__ == '__main__':
pass