一直都不怎么写java
,因缘际会,需要从外部调试别人写的dubbo
服务,问了下其它同事,都没有代码无关的调试方式,实在不想写java
代码,遂在官上找到了调试方法。

别人的dubbo
自然是指provider
,你需要验证这个接口的可用性,就需要consumer
, registry
(通常)是zk
, 此处用不着monitor
,结构还是很清晰的,但是我想绕过zk这一环,直连provider
, 比如服务ip:port
是10.1.2.155:12345
$ telnet 10.1.2.155 12345
Trying 10.1.2.155...
Connected to 10.1.2.155.
Escape character is '^]'.
dubbo>
回车即进入dubbo
命令行模式
dubbo>ls
com.ops.oss.api.service.AudioQueryService
查看服务列表,可以看到有两个服务,查看一下服务方法列表
dubbo>ls com.ops.oss.api.service.AudioQueryService
queryAlarms
发现有一个queryAlarms
的方法,入参是一个对象
expireSeconds: string
IDs: string-array
先调用一把
dubbo>invoke com.ops.oss.api.service.AudioQueryService.queryAlarms({"expireSeconds": 1, "IDs": ["1122"]})
No such method queryAlarms in service com.ops.oss.api.service.AudioQueryService
很奇怪,明明方法是存在的啊, 网上查看了一下原因,原来是因为入参是一个对象的缘故,需要指定指定入参class
, 这……没法,只得看对方源码了,
本来还挺好的,这一点让人觉着不是特别友好。
dubbo>invoke com.ops.oss.api.service.AudioQueryService.queryAlarms({"class": "com.ops.oss.api.entity.req.AlarmAudioQueryRequest", "expireSeconds": 1, "IDs": ["1122"]})
{"code":0,"data":[],"message":"成功"}
elapsed: 43 ms.
参数调用成功了,如果是方法只有一个参数,就不存在这个问题
每次用telnet的方法其实也不够友好,可以来一段python脚本来实现这个调试思路
import json
import telnetlib
import socket
class Dubbo(telnetlib.Telnet):
prompt = 'dubbo>'
coding = 'utf-8'
def __init__(self, host=None, port=0,
timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
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, arg):
command_str = "invoke {0}.{1}({2})".format(
service_name, method_name, json.dumps(arg))
self.command(Dubbo.prompt, command_str)
print(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__':
Dubbo('10.1.2.155', 12345).invoke(
"com.ops.oss.api.service.AudioQueryService",
"queryAlarms",
{"class": "com.ops.oss.api.entity.req.AlarmAudioQueryRequest", "expireSeconds": 1, "IDs": ["1122"]})
一番折腾下来,还是命令行的方法用起来比较好,比较奇怪的是,问了好几个java开发,他们都不知道这种命令行调试方法,个人学得临时紧急情况调试
起来,还是非常方便的。
refer:
网友评论