Dubbo本身支持多种远程调用方式,例如Dubbo RPC(二进制序列化 + tcp协议)、http invoker(二进制序列化 + http协议)、hessian(二进制序列化 + http协议)、WebServices (文本序列化 + http协议)等。
Dubbo是支持hessian+http协议调用的,hessian是一种二进制序列化的方式。咱们用python调用的dubbo的时候,就是用hessian+http的方式调用,所以dubbo项目要配置使用hessian方式序列化,如果小伙伴要用python调用的时候,注意要找开发小哥哥在项目里面改成hessian方式的序列化,也就是改个配置文件的事,不影响原来的项目,如下图:
接口说明
既然做接口测试,那接口的说明是必须的,问开发GG要,不要问从哪里来。。。。大致包括如下内容:
接口地址
http://192.168.133.129:20880/com.unj.dubbotest.provider.DemoService
接口名
com.unj.dubbotest.provider.DemoService
方法
sayHello,getUsers
参数
name
python调用环境
1、让开发GG把项目里的dubbo加上hessian方式,绿色公害无污染
2、下载python-hessian-master,地址:https://github.com/theatlantic/python-hessian
3、安装,解压后进入该目录,运行python setup.py install
到这里我们python的调用环境就ok了
#引入相关包
from pyhessian.client import HessianProxy
url = 'http://192.168.133.129:20880/' #接口地址
interface = 'com.unj.dubbotest.provider.DemoService' #接口名
full_url=url+interface
params='xiaoqiang'#参数
service = HessianProxy(full_url)
res = service.sayHello(params) #sayHello是接口里的方法
print(res)
==============================================================
Dubbo python client
github :https://github.com/apache/dubbo-python
github中安装方法,就不再介绍,也可以直接在 pycharm 里面搜索 dubbo-client,安装 作者是Joe Cao的那个
python 代码
# -*- coding: utf-8 -*- from dubbo_client import ApplicationConfig, ZookeeperRegistry, DubboClient, DubboClientError service_interface = 'com.truthso.monitor.service.CompareService' registry = ZookeeperRegistry('127.0.0.1:2181') compare_provider = DubboClient(service_interface, registry, version='1.0.0', group='gaopin') print compare_provider .compare({ u'width': 650, u'height': 433, u'phash': u'1011100001101000101100001101110101101100101001010101111001001010', u'sum': 5429, u'ave': 5.0, u'dc': 4331, u'rSum': 144219, u'gSum': 142677, u'bSum': 136723, u'hash': 4064693128758910538, }):
很好理解 service_interface 是我们调用的接口的名称
ZookeeperRegistry 是 zookeeper 的地址
DubboClient 中 version 是接口的版本,group 是想要调用的接口所在的group
直接调用 compare_provider 的具体某一个方法
注意
group 无法指定为 * 会报错说找不到
provider 提供的服务的形式 jsonrpc 也就是,protocol Name 的方式是 jsonrpc 不然无法python调用的时候会报错找不到,但是java可以
但是 如果以前是 protocol 是 dubbo 的方式,现在是 jsonrpc ,可能在java中的处理会有不同,比如返回的原来是对象,现在可能是个json
服务提供provider的改变
因为我的项目是动态提供的服务,也就是服务的配置是从 mysql 中读取的,用的是编码的方式提供的
ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName(config.getApplicationName()); RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setAddress(config.getRegistryAddress()); ProtocolConfig protocol = new ProtocolConfig(); protocol.setName(config.getProtocolName()); protocol.setPort(config.getProtocolPort()); CompareServiceImpl impl = new CompareServiceImpl(); ServiceConfig<CompareService> service = new ServiceConfig<>(); service.setApplication(applicationConfig); service.setRegistry(registryConfig); service.setProtocol(protocol); service.setInterface(CompareService.class); service.setRef(impl); service.setVersion(config.getVersion()); service.setGroup(config.getGroup()); service.export();
ProtocolConfig 相关的配置都是在数据库里面所以,只需要把ProtocolName设置为 jsonrpc 就行
注意
需要添加 maven
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-rpc-jsonrpc</artifactId>
<version>2.7.2</version>
</dependency>
总结:
虽然能调通,但是感觉很多功能不全,比入group直接指定为 * 就不行
如果想用 python client ,provider 必须是 jsonrpc