Coder Social home page Coder Social logo

dubbo-python2's Introduction

python-dubbo

Python Dubbo Client.

Installation

pip install python-dubbo

Usage

基础使用

from dubbo.client import DubboClient, ZkRegister

# 支持从Zk中获取服务的provider,支持根据provider的权重选择主机
zk = ZkRegister('127.0.0.1:2181')
dubbo_cli = DubboClient('com.qianmi.pc.api.GoodsQueryProvider', zk_register=zk)

# 支持不使用Zk,直接连接指定的远程主机
dubbo_cli = DubboClient('com.qianmi.pc.api.GoodsQueryProvider', host='127.0.0.1:20880')

admin_id = 'A000000'
result = dubbo_cli.call('listByIdString', admin_id)

如何定义参数

python-dubbo支持以下Java类型的参数,表格右边一列代表了在Pyton中与指定Java类型所对应的类型

类型 Java Python
布尔类型 boolean bool
整型 int, long int
浮点类型 float, double float
字符串类型 java.lang.String str
列表类型 Collection & Array []
自定义的对象类型 java.lang.Object 具体使用方法如下所示
使用Java的对象类型
from dubbo.client import DubboClient, ZkRegister
from dubbo.codec.encoder import Object

# 创建channel对象
channel = Object('com.qianmi.pc.base.api.constants.ChannelEnum', values={
    'name': 'D2C'
})

# 创建spu_query_request对象
spu_query_request = Object('com.qianmi.pc.item.api.spu.request.SpuQueryRequest')
spu_query_request['chainMasterId'] = 'A000000'
spu_query_request['channel'] = channel
spu_query_request['pageSize'] = 2000

# 创建consumer并执行查询操作
zk = ZkRegister('172.21.4.71:2181')
spu_query_provider = DubboClient('com.qianmi.pc.item.api.spu.SpuQueryProvider', zk_register=zk)
result = spu_query_provider.call('query', spu_query_request)

如何使用枚举(enum)类型作为参数

# 定义一个枚举类型的对象
channel = Object('com.qianmi.pc.base.api.constants.ChannelEnum')
# 定义参数name并令其值为对应的枚举参数的值,之后使用该定义好的对象作为枚举类型变量即可
channel['name'] = 'D2C'

Reference

  • Python字节相关的转化操作:https://docs.python.org/2/library/struct.html
  • Hessian2的编码规则:http://hessian.caucho.com/doc/hessian-serialization.html
  • 实现Hessian2编码时的参考:参考1参考2
  • 对于部分不清楚且通过查阅文档仍无法了解的编码方式,先使用Java的dubbo客户端正常调用接口,之后使用Wireshark抓包获取请求和响应的数据报文,仔细的分析报文来推测编码方式
  • Dubbo相关的编码规则:参考1参考2
  • Dubbo的心跳机制:http://www.cnblogs.com/java-zhao/p/8539046.html
  • 部分实现参考了dubbo的Java源码中的实现
  • 对于所有的字符串,在网络传输前进行编码,编码一律使用unicode来完成,如果一个字符串是str则先将其decode为unicode之后再进行操作;
  • 对于所有的字符串,在网络上获取到的数据之后进行解码,解码得到的字符串是unicode,之后将其encode为str再交给客户程序;
  • 支持传输utf-8编码和Emoji😋
  • 使用epoll模型来维护所有的链接,如果使用多线程来维护连接将产生过多的thread_context_switch,影响性能
  • 类似于HTTP请求和响应,dubbo的请求和响应也是同步的并且可以看成是一个事务;不过dubbo使用了msg_id来为请求排序,这使得我们不再需要像HTTP请求那样在单个链接上进行同步的请求和响应,因此在单个连接上有多个请求时可以一定程度的降低请求总时间,这种对请求进行编码的理念类似于HTTP2中的stream ID

dubbo-python2's People

Contributors

htynkn avatar ritterhou avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dubbo-python2's Issues

dubbo provider没有指定version的时候会失败

Traceback (most recent call last):
File "/Users/duval/workspace/pycharm/kafkaDemo/Main.py", line 21, in
result = dubbo_cli.call('listMarket', stockMarket, extraParam)
File "/usr/local/lib/python2.7/site-packages/dubbo/client.py", line 67, in call
host = self.__zk_register.get_provider_host(self.__interface)
File "/usr/local/lib/python2.7/site-packages/dubbo/client.py", line 137, in get_provider_host
self._get_providers_from_zk(path, interface)
File "/usr/local/lib/python2.7/site-packages/dubbo/client.py", line 156, in _get_providers_from_zk
self._register_consumer(providers)
File "/usr/local/lib/python2.7/site-packages/dubbo/client.py", line 238, in _register_consumer
'version': provider_fields['version'],
KeyError: 'version'

pip install python-dubbo==0.0.3b10 安装成功,运行失败

Installed /usr/local/lib/python3.8/site-packages/python_dubbo-0.0.5-py3.8.egg
Processing dependencies for python-dubbo==0.0.5
Searching for kazoo==2.4.0
Best match: kazoo 2.4.0
Adding kazoo 2.4.0 to easy-install.pth file

Using /usr/local/lib/python3.8/site-packages
Searching for six==1.15.0
Best match: six 1.15.0
Adding six 1.15.0 to easy-install.pth file

Using /usr/local/lib/python3.8/site-packages
Finished processing dependencies for python-dubbo==0.0.5

运行提示:
from dubbo.client import DubboClient, ZkRegister
提示失败:ModuleNotFoundError: No module named 'dubbo.client'; 'dubbo' is not a package

调用java对象时,当参数出现True/False时,Java应用提示类型转换错误

您好,可以帮忙解决一下吗?
代码如下:

dataQueryModel = Object("com.xxxx.DataQueryModelConfig")
dataQueryModel["pushdown"] = True
dataQueryModel["limit"] = False
dataQueryModel["params"] = {}
dataQueryModel["sql"] = "xxxx"

dubbo_cli = DubboClient("xxxxxModelService", 
                    version="1.0.0", 
                    dubbo_version="2.0.2",
                    host="xxxxx")
result = dubbo_cli.call('queryDataQueryModel', 
                        [110, True, dataQueryModel], 
                        timeout=3000)

错误信息如下:
java.lang.Boolean cannot be cast to com.xxxx.DataQueryModelConfig

解码时报错 KeyError: 90

从日志来看,成功连接到了dubbo 的provider, 但是在解码时报错KeyErroor:90

received response head with invoke_id=0, host=127.0.0.1:21085
received normal response body with invoke_id=0, host=127.0.0.1:21085
90
Traceback (most recent call last):
File "/home/dobbo_test/dubbo/connection/connections.py", line 226, in _parse_response
result = res.read_next()
File "/home/dobbo_test/dubbo/codec/decoder.py", line 414, in read_next
return func(self)
File "/home/dobbo_test/dubbo/codec/decoder.py", line 311, in read_list
result.append(self.read_next())
File "/home/dobbo_test/dubbo/codec/decoder.py", line 414, in read_next
return func(self)
File "/home/dobbo_test/dubbo/codec/decoder.py", line 242, in read_object
field_value = self.read_next()
File "/home/dobbo_test/dubbo/codec/decoder.py", line 414, in read_next
return func(self)
File "/home/dobbo_test/dubbo/codec/decoder.py", line 300, in read_list
result.append(self.read_next())
File "/home/dobbo_test/dubbo/codec/decoder.py", line 414, in read_next
return func(self)
File "/home/dobbo_test/dubbo/codec/decoder.py", line 270, in read_class
return self.read_object()
File "/home/dobbo_test/dubbo/codec/decoder.py", line 52, in wrapper
return func(*args, **kwargs) # 原始方法正常执行
File "/home/dobbo_test/dubbo/codec/decoder.py", line 242, in read_object
field_value = self.read_next()
File "/home/dobbo_test/dubbo/codec/decoder.py", line 414, in read_next
return func(self)
File "/home/dobbo_test/dubbo/codec/decoder.py", line 374, in read_map
value = self.read_next()
File "/home/dobbo_test/dubbo/codec/decoder.py", line 413, in read_next
func = functions[data_type]
KeyError: 90
Event set, invoked_id=0
90
NoneType: None
Exception 90 for host 127.0.0.1:21085

python consumer send request to provider, the provider can reciver the request correct but the consumer can not reciver response

DEBUG:python-dubbo:Current IP Address: 192.168.1.128
DEBUG:python-dubbo:Create consumer {'methods': u'sayHello', 'timestamp': 1549863219591L, 'pid': 17308, 'connected': 'true', 'interface': u'com.xiaoze.api.service.DemoService', 'check': 'false', 'category': 'consumers', 'dubbo': u'2.6.2', 'application': 'search_platform', 'version': u'1.0.0', 'side': 'consumer', 'revision': u'1.0.0'}
DEBUG:kazoo.client:Sending request(xid=3): Exists(path='/dubbo/com.xiaoze.api.service.DemoService/consumers', watcher=None)
DEBUG:kazoo.client:Received response(xid=3): ZnodeStat(czxid=753, mzxid=753, ctime=1549852990368L, mtime=1549852990368L, version=0, cversion=87, aversion=0, ephemeralOwner=0, dataLength=0, numChildren=1, pzxid=910)
DEBUG:kazoo.client:Sending request(xid=4): Create(path='/dubbo/com.xiaoze.api.service.DemoService/consumers/consumer%3A%2F%2F192.168.1.128%2Fcom.xiaoze.api.service.DemoService%3Fapplication%3Dsearch_platform%26category%3Dconsumers%26check%3Dfalse%26connected%3Dtrue%26dubbo%3D2.6.2%26interface%3Dcom.xiaoze.api.service.DemoService%26methods%3DsayHello%26pid%3D17308%26revision%3D1.0.0%26side%3Dconsumer%26timestamp%3D1549863219591%26version%3D1.0.0', data='', acl=[ACL(perms=31, acl_list=['ALL'], id=Id(scheme='world', id='anyone'))], flags=1)
DEBUG:kazoo.client:Sending request(xid=5): GetChildren(path='/dubbo/com.xiaoze.api.service.DemoService/configurators', watcher=<bound method ZkRegister._watch_configurators of <dubbo.client.ZkRegister object at 0x00000000041BC630>>)
DEBUG:kazoo.client:Received response(xid=4): u'/dubbo/com.xiaoze.api.service.DemoService/consumers/consumer%3A%2F%2F192.168.1.128%2Fcom.xiaoze.api.service.DemoService%3Fapplication%3Dsearch_platform%26category%3Dconsumers%26check%3Dfalse%26connected%3Dtrue%26dubbo%3D2.6.2%26interface%3Dcom.xiaoze.api.service.DemoService%26methods%3DsayHello%26pid%3D17308%26revision%3D1.0.0%26side%3Dconsumer%26timestamp%3D1549863219591%26version%3D1.0.0'
DEBUG:kazoo.client:Received response(xid=5): []
DEBUG:python-dubbo:Start request, host=192.168.56.1:20880, params={'path': 'com.xiaoze.api.service.DemoService', 'version': '1.0.0', 'dubbo_version': '2.4.10', 'method': 'sayHello', 'arguments': ['A000000']}
DEBUG:python-dubbo:Waiting response, invoke_id=0, timeout=60000, host=192.168.56.1:20880
DEBUG:python-dubbo:Send ❤ request for invoke_id 1, host=192.168.56.1:20880
DEBUG:python-dubbo:Send ❤ request for invoke_id 2, host=192.168.56.1:20880
DEBUG:python-dubbo:Send ❤ request for invoke_id 3, host=192.168.56.1:20880
DEBUG:python-dubbo:192.168.56.1:20880 closed by client.
DEBUG:python-dubbo:192.168.56.1:20880 timeout and reconnected by client.
DEBUG:python-dubbo:Send ❤ request for invoke_id 4, host=192.168.56.1:20880
DEBUG:python-dubbo:Send ❤ request for invoke_id 5, host=192.168.56.1:20880
DEBUG:python-dubbo:Send ❤ request for invoke_id 6, host=192.168.56.1:20880
DEBUG:python-dubbo:192.168.56.1:20880 closed by client.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.