04. Python调用Dubbo接口
2024年10月28日大约 6 分钟
04. Python调用Dubbo接口
1. dubboclient介绍
DubboClient:是一个基于telnetlib类库封装的,用于测试dubbo接口的客户端工具类
说明:
telnetlib 是python内置的模块,用来创建Telnet协议的连接
telnetlib 模块提供一个实现telnet协议的类Telnet,通过该类可以模拟调用dubbo接口
安装
- pip install dubboclient
2. dubboclient用法
- 实现步骤
1. 导包 from dubboclient import DubboClient
2. 创建 DubboClient类实例,指定 IP 和 port
3. 使用实例调用 invoke() 方法。 传入 :服务名、方法名、实参(方法使用)。获取响应结果
4. 打印响应结果
1. 实例化DubboClient
class dubboclient.DubboClient(host=None, port=0):
"""
实例化DubboClient对象
host: dubbo服务地址
port: dubbo服务端口
"""
pass
# 1. 导包 from dubboclient import DubboClient
from dubboclient import DubboClient
# 2. 创建 DubboClient类实例,指定 IP 和 port
dubboclt = DubboClient("192.168.10.31", 20880)
2. 调用dubbo接口方法
def invoke(self, service_name, method_name, *args):
"""
调用接口
:param service_name: 服务名称
:param method_name: 方法名称
:param args: 方法参数列表
:return: 接口响应数据
"""
3. 案例
1. 传递普通参数
根据手机号,查询会员信息(传递 普通参数)
dubbo>ls -l MemberService
com.ithiema.health.pojo.Member findByTelephone(java.lang.String)
java.util.List getMemberReport(java.util.List)
void add(com.ithiema.health.pojo.Member)
接口定义:Member findByTelephone(String telephone)
参数:
字符串格式手机号。唯一
返回值:
成功:返回会员的信息内容。string类型 包裹的 字典数据。
失败:返回 null。string类型
需求:
调用MemberService服务中findByTelephone接口,获取响应数据并打印,请求参数(手机号:18000000000)
实现步骤分析:
1. 创建DubboClient对象
2. 调用服务接口
3. 获取响应数据
# 1. 导包 from dubboclient import DubboClient
from dubboclient import DubboClient
# 2. 创建 DubboClient类实例,指定 IP 和 port
dubboclt = DubboClient("192.168.10.31", 20880)
# 3. 使用 实例调用 invoke() 方法。 传入 :服务名、方法名、实参(方法使用)。获取响应结果
resp = dubboclt.invoke("MemberService", "findByTelephone", "18000000000")
# 4. 打印响应结果
print("响应结果 =", resp)
print("type(resp) =", type(resp))
2. 传递对象参数
添加会员(传递 对象参数)
dubbo>ls -l MemberService
com.ithiema.health.pojo.Member findByTelephone(java.lang.String)
java.util.List getMemberReport(java.util.List)
void add(com.ithiema.health.pojo.Member)
接口定义:void add(com.ithiema.health.pojo.Member)
参数:
private Integer id;//主键
private String fileNumber;//档案号
private String name;//姓名
private String sex;//性别
private String idCard;//身份证号
private String phoneNumber;//手机号
private Date regTime;//注册时间
private String password;//登录密码
private String email;//邮箱
private Date birthday;//出生日期
private String remark;//备注
返回值:
成功:返回 会员的信息内容。string类型 包裹的 字典数据。
失败:返回 null。string类型
需求:
1. 调用MemberService服务中add添加会员接口,获取响应数据并打印
2. 请求参数(档案号:D0001, 姓名:李白, 手机号:18000000001)
3. 请求参数Member对应的完整包名和类名:com.ithiema.pojo.Member
实现步骤分析:
1. 调用服务接口时,如果传递的是一个实体类,需要通过class指定参数对象的类型
2. 请求参数:
`{"name": "杜甫", "phoneNumber": "13048379884","class":"com.ithiema.health.pojo.Member"}`
# 1. 导包
from dubboclient import DubboClient
# 2. 创建 dubboclient 实例
dubboclt = DubboClient("192.168.10.31", 20880)
# 准备 add 方法,所需要的数据
info = {"name": "杜甫", "phoneNumber": "13048379884"}
# 如果 class 已经存在,覆盖原有class值; 如果不存在 class,新增一组 元素到 字典中。
info["class"] = "com.ithiema.health.pojo.Member"
# 3. 调用 invoke 传 服务名、方法名、实参。得响应结果
resp = dubboclt.invoke("MemberService", "add", info)
# 4. 打印
print("响应结果 =", resp)
print("type(resp) =", type(resp))
3. 根据日期统计会员数(传递 字符串列表)
dubbo>ls -l MemberService
com.ithiema.health.pojo.Member findByTelephone(java.lang.String)
java.util.List getMemberReport(java.util.List)
void add(com.ithiema.health.pojo.Member)
接口定义:List<Integer> getMemberReport(List<String> months)
参数:
1. 字符串列表。用字符串表示年、月,用“.”衔接
如:["2021.3", "2021.9"]
返回值:
成功:返回列表,对应参数设置的月份的会员数。
失败:Failed
# 根据日期统计会员数(传递 字符串列表)
# 1. 导包
from dubboclient import DubboClient
# 2. 创建 dubboclient 实例
dubboclt = DubboClient("192.168.10.31", 20880)
# 3. 用实例 调用invoke() ,传入 服务名、方法名、实参。 得响应结果
months = ["2024-8"]
resp = dubboclt.invoke("MemberService", "getMemberReport", months)
# 4. 查看响应结果
print("响应结果 =", resp)
print("type(resp) =", type(resp))
4. 添加预约设置
dubbo>ls -l OrderSettingService
void editNumberByDate(com.ithiema.health.pojo.OrderSetting)
java.util.List getOrderSettingByMonth(java.lang.String)
void add(java.util.List)
接口定义:void add(List<OrderSetting> list)
参数:
private Integer id ;
private Date orderDate;//预约设置日期
private int number;//可预约人数
private int reservations ;//已预约人数
1. 字典列表。字典有 orderDate 和 number 两个字段。
如:[{"orderDate":"2021-09-20 16:45:12","number":20}]
2. 日期格式:"2021-09-20 16:45:12",必须包含时分秒,否则失败。
返回值:
成功:null
失败:Failed
# 1. 导包
from dubboclient import DubboClient
# 2. 创建 dubboclient 实例
dubboclt = DubboClient("192.168.10.31", 20880)
# 准备 add 方法,所需要的数据
info = [{"orderDate": "2024-08-20 00:00:00", "number": 400}]
# 3. 调用 invoke 传 服务名、方法名、实参。得响应结果
resp = dubboclt.invoke("OrderSettingService", "add", info)
# 4. 打印
print("响应结果 =", resp)
print("type(resp) =", type(resp))
5. 按月统计预约设置信息
dubbo>ls -l OrderSettingService
void editNumberByDate(com.ithiema.health.pojo.OrderSetting)
java.util.List getOrderSettingByMonth(java.lang.String)
void add(java.util.List)
接口定义:List getOrderSettingByMonth(String date)
参数:
字符串,如:"2021-09"
返回值:
成功:返回字符串类型数据,字符串内容为列表
失败:Failed
# 1. 导包
from dubboclient import DubboClient
# 2. 创建 dubboclient 实例
dubboclt = DubboClient("192.168.10.31", 20880)
# 月份
moths = "2024.08"
# 3. 调用 invoke 传 服务名、方法名、实参。得响应结果
resp = dubboclt.invoke("OrderSettingService", "getOrderSettingByMonth", moths)
# 4. 打印
print("响应结果 =", resp)
print("type(resp) =", type(resp))
6. 根据日期修改预约设置数量
dubbo>ls -l OrderSettingService
void editNumberByDate(com.ithiema.health.pojo.OrderSetting)
java.util.List getOrderSettingByMonth(java.lang.String)
void add(java.util.List)
接口定义:void editNumberByDate(OrderSetting orderSetting)
参数:
private Integer id ;
private Date orderDate;//预约设置日期
private int number;//可预约人数
private int reservations ;//已预约人数
1. 自定义类,用 字典 根据接口文档组织数据
2. 需要使用 class 指定参数对象的类型
如:{"orderDate":"2021-10-13 21:04:33","number":15,
"class":"com.ithiema.pojo.OrderSetting"}
3. 日期格式为:"2021-10-13 21:04:33",必须包含时分秒
返回值:
成功:null
失败:Failed
# 1. 导包
from dubboclient import DubboClient
# 2. 创建 dubboclient 实例
dubboclt = DubboClient("192.168.10.31", 20880)
# 日期 和 设置数据
date = {"orderDate": "2024-08-20 00:00:00", "number": 120}
date["class"] = "com.ithiema.health.pojo.OrderSetting"
# 3. 调用 invoke 传 服务名、方法名、实参。得响应结果
resp = dubboclt.invoke("OrderSettingService", "editNumberByDate", date)
# 4. 打印
print("响应结果 =", resp)
print("type(resp) =", type(resp))
7. 根据用户名查询用户信息
dubbo>ls -l UserService
com.ithiema.health.pojo.User findByUsername(java.lang.String)
接口定义:User findByUsername(String username)
参数:字符串类型,如:'admin'
返回值:
用户存在:返回用户信息
用户不存在:返回 null
# 1. 导包
from dubboclient import DubboClient
# 2. 创建 dubboclient 实例
dubboclt = DubboClient("192.168.10.31", 20880)
# 管理用户名
name = "xiaoming"
# 3. 调用 invoke 传 服务名、方法名、实参。得响应结果
# 编码错误,可以修改源码
# try:
# all_data = response_data.decode('gbk')
# except UnicodeDecodeError:
# all_data = response_data.decode('gbk', errors='ignore')
resp = dubboclt.invoke("UserService", "findByUsername", name)
resp = dubboclt.invoke("UserService", "findByUsername", name)
# 4. 打印
print("响应结果 =", resp)
print("响应结果 =", resp.decode("utf-8",errors='ignore'))
print("type(resp) =", type(resp))
4. 分析bug来源
现有问题
远程调用的 7个dubbo接口 存在的问题:
1. 代码有大量冗余
2. 测试接口时,除了要给测试数据之外, 还需要指定服务名、方法名
3. 传参时,除了要考虑测试数据外,还要分析是否要添加 class 字段及对应数据。
4. 返回的数据类型统一为string(不具体)
封装目标
1. 只关心:测试数据、响应结果
2. 返回的结果 分别为不同的具体类型。