美文网首页
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服务直连调试技巧

    一直都不怎么写java,因缘际会,需要从外部调试别人写的dubbo服务,问了下其它同事,都没有代码无关的调试方式,...

  • dubbo记录

    目录 《dubbo入门》《dubbo管理控制台》《dubbo超时重传》《dubbo直连》《dubbo实现服务降级》...

  • 高可用

    1、zookeeper宕机与dubbo直连 现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。...

  • dubbo直连引发的dubbo重试失效

    dubbo直连引发的dubbo重试失效DubboInvoker与FailoverClusterInvoker直连会...

  • Dubbo剖析-服务直连

    一、前言 为了方便开发及测试,一般需要绕过注册中心,只测试指定ip的服务提供者,这时候服务消费方和服务提供方就是点...

  • Dubbo引用服务

    引用服务时序 引用服务 1. 直连引用服务:[https://dubbo.apache.org/zh/docs/v...

  • dubbo高可用

    1、注册中心宕机与dubbo直连 2、负载均衡(4种) 3、服务降级 4、服务容错

  • dubbo-直连的问题

    dubbo客户端如果采用直连的方式调用服务,那么在客户端初始化时,就会与直连的url建立连接,如果连接建立失败就会...

  • dubbo直连

    dubbo的直连方式即消费方不通过zookeeper注册中心去调用注册的服务,而是直接绕过zookeeper环节直...

  • dubbo直连

    dubbo版本:2.7.1-SNAPSHOT 本地一般都是直连测试环境的依赖服务默认配置是在本地 home 下的 ...

网友评论

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

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