美文网首页
dubbo服务直连调试技巧

dubbo服务直连调试技巧

作者: wu_sphinx | 来源:发表于2019-08-04 11:17 被阅读0次

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

    image.png

    别人的dubbo自然是指provider,你需要验证这个接口的可用性,就需要consumer, registry(通常)是zk, 此处用不着monitor,结构还是很清晰的,但是我想绕过zk这一环,直连provider, 比如服务ip:port10.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:

    相关文章

      网友评论

          本文标题:dubbo服务直连调试技巧

          本文链接:https://www.haomeiwen.com/subject/nobedctx.html