一、python语言也可以实现对dubbo接口的调用与测试,可以使用python+hessian结合的方式,也可以使用python+telnet结合的方式模拟命令行的模式来实现对dubbo接口的测试;
二、网上关于python+hessian协议的博客比较多,本人试了试,终究是没有在本机上测试通过,所以选择了:python+telnet的方法在编译器里实现了Python源生代码对dubbo接口调用测试;
三、具体源代码如下:
import json
import telnetlib
class Dubbo(telnetlib.Telnet):
prompt = 'dubbo>'
coding = 'utf-8'
def __init__(self, host=None, port=0):
super().__init__(host, port)
self.write(b'\n')
def command(self, flag, str_=""):
data = self.read_until(flag.encode())
self.write(str_.encode() + b"\n")
return data
def invoke(self, service_name, method_name):
command_str = "invoke {0}.{1}()".format(
service_name, method_name)
self.command(Dubbo.prompt, command_str)
data = self.command(Dubbo.prompt, "")
data = json.loads(data.decode(Dubbo.coding, errors='ignore').split('\n')[0].strip())
return data
if __name__ == '__main__':
conn = Dubbo('serviceIp', port)
result = conn.invoke(
"serviceName",
"serviceName.method"
)
print(result)
1、代码讲解第20行:
num20行:“invoke {0}{1}()”.format(service_name,method_name)
(1)、invoke为调用dubbo接口的命令名称;
(2)、{0}为invoke命令后需要接的第一个参数,它的值将由传入进来的service_name取代,一般是传入服务名称,这里的写法只是为了占位;
(3)、{1}为invoke命令后需要接的第二个参数,它的值将由传入进来的method_name取代,一般是传入被调用的方法名称,这里的写法只是为了占位;
(4)、()为invoke命令后需要接的第三个参数,此处的例子表示的是这个dubbo服务被调用的方法,是不需要传入参数就能直接调用成功的,虽然不需要传入参数,但是必需写上();
(5)、问题:如果被调用的dubbo服务的方法需要传入对应的参数,怎么处理呢?
答:num20行代码改写为:“invoke {0}{1}({2})”.format(service_name,method_name,param_data),需要在第三个参数处添加占位符,并在调用该方法时传入对应的参数,一般是key:value格式的参数,即python中的字典格式的数据;
2、代码讲解第28行:
conn = Dubbo(‘serviceIp’, port)
(1)serviceIp:被调用服务所属的IP地址;
(2)port:被调用服务所对应的可访问的外部暴露的端口;
注意:如果端口号为内部端口,这种方式调用会报错。