简介
支持调用dubbo接口的python库有hessian、dubbo_telnet、telnetlib
- hessian:通过http协议请求
- dubbo_telnet:通过模拟控制台命令行调用telnet实现,官方不再维护
- telnetlib:通过模拟控制台命令行调用telnet实现,python3自带包
案例代码
from telnetlib import Telnet
import re
Host = '10.12.224.14'
Port = 20880
interface = 'com.bjpowernode.dubbo.service.UserService'
t = Telnet(Host, Port, timeout=10)
# s = t.read_until(b"dubbo>", timeout=2)
t.write('invoke com.bjpowernode.dubbo.service.UserService.queryUserById(1223,"lili")'.encode('utf-8'))
t.write(b'\n')
data = t.read_until(b"dubbo>", timeout=2).decode('utf-8').strip('dubbo>')
print(data)
res = re.search(r'(\{.*\})', data).group()
print(res)
print(type(res))
>
{"id":1223,"username":"lili"}
elapsed: 1 ms.
{"id":1223,"username":"lili"}
<class 'str'>
b"invoke com.bjpowernode.dubbo.service.UserService.queryUserById(1223, 'lisi123')"
{"id":1223,"username":"lisi123"}
函数封装
from telnetlib import Telnet
import re
def do_telnet(host, interface: str, method: str, data, port=20880, finish_flag='dubbo>'):
dt = Telnet(host, port, timeout=5)
server_data = 'invoke {}.{}{}'.format(interface, method, data).encode('utf-8')
dt.write(server_data + b'\n')
response = dt.read_until(finish_flag.encode('utf-8'), timeout=2).decode('utf-8').strip(finish_flag)
res = re.search(r'(\{.*\})', response).group()
return res
if __name__ == '__main__':
Host = '10.12.224.14'
Port = 20880
interface = 'com.bjpowernode.dubbo.service.UserService'
method = 'queryUserById'
data = (1223, 'lisi123')
r = do_telnet(Host, interface, method, data)
print(r)
>
{"id":1223,"username":"lisi123"}