个人博客地址 studyidea.cn,点击查看更多原创文章

0x00. 前言

想象这样一个场景,线上某个服务突发异常,导致上游服务调用异常,数据处于中间状态。服务恢复之后,我们需要修复这笔数据至正常状态,怎么办?

如果仅是简单的服务,涉及少量数据变更,我们可以直接使用 SQL,变更数据状态。但是有些情况下,服务需要联动调用其他系统,变更其他系统数据。这种情况下,变更数据非常麻烦,需要与其他系统开发沟通,整理数据,一起变更。如果涉及还涉及外部系统,数据变更几乎玩不下去了。

如果服务接口能重试,重新调用,那么数据变更就交给服务自动去调用即可。这个过程我们需要组装参数,然后调用服务接口。如果你的服务采用 Http 接口,可以使用 Curl 等命令重试。如果你的服务使用 Dubbo ,这就需要使用到 Telnet 命令。

0x01. telnet 进入 Dubbo 调试

通过以下指令,连接 Dubbo 服务。

  1. telnet IP PORT
  2. #例如:
  3. telnet localhost 20880

Dubbo 版本需要大于 2.0.5,远程调用需要注意网络是否可用

连上之后,按下回车键将会进入以下页面:

这个界面与 Shell 类似,需要我们输入相关命令。例如:

命令参考手册:http://dubbo.apache.org/zh-cn/docs/user/references/telnet.html

0x02. invoke 执行 Dubbo 方法

这里我们重点介绍 invoke 命令,该命令可以用来执行 Dubbo 服务,调用方式如下:

  1. # 需要提前调用 cd XxxService,使这个服务成为缺省服务
  2. invoke xxxMethod(1234, "abcd", {"prop" : "value"})
  3. # 调用该服务的方法
  4. invoke XxxService.xxxMethod(1234, "abcd", {"prop" : "value"})
  5. # 调用全路径服务的方法,推荐使用这种方式,精确执行服务方法。
  6. invoke com.xxx.XxxService.xxxMethod(1234, "abcd", {"prop" : "value"})

运行结果如下:

槽点:mac 平台 iterm2 使用 telnet 命令进入 Dubbo 调试,中文输入将会乱码,使用 SecureCRT telnet 就不会乱码。感觉是 mac 平台终端问题,不知道各位小伙伴有没有碰到过?有解决办法的小伙伴,欢迎留个言。

注意点

Invoke 命令内部使用 FastJson,将字符串转化为 Json 对象。

tips: 如果参数为 数组,ListMap,小黑哥有时候想不到怎么转成 Json 字符串。现在知道底层原理了,就好办了。

可以先将数组,List,Map 对象参数组装好,然后调用 FastJson JSONObject.toJSONString(array) 得到 json 字符串。

不同版本解码方式不一样

2.5.3 解码方式:

list = (List) JSON.parse("[" + args + "]", List.class);

2.7.0 解码方式:

list = JSON.parseArray("[" + args + "]", Object.class);

某些 Dubbo 版本 POJO 参数对象需要在 json 字符串中需要指定 class,明确参数类型,例如:

  1. {
  2. "name": "11",
  3. "age": 12,
  4. "class":"xx.xx.Pojo"
  5. }

如果没有传入,将会调用失败,相关问题可以参见这个 Issue:https://github.com/apache/dubbo/issues/3105。所以如果方法参数为 POJO 对象,最好在 json 中传入 class

0x03. select 命令与意外之喜

Dubbo 最新版本,如果服务存在多个相同参数的重载方法,且没有使用 class 来明确参数类型,提示用户使用新增的select 命令来选择要调用的方法。

小黑哥在测试 select 命令的过程中发现了一个 Bugselect 执行未选中的方法。如上,我使用 select 1希望执行 1. hello(HelloRequest),但是实际上执行的是 2. hello(HelloRequestV2)。当输入 select 2 时,执行结果如下:

这个 Bug 详情参考小黑哥提的这个 issue https://github.com/apache/dubbo/issues/5707。这个修复很简单,小黑哥已提交 PR 修复该 Bug

没想到,写这篇文章过程中,还能发现一个 Bug,然后成为 Dubbo Committer,哈哈哈哈。

0x04. 总结

使用 Dubbo Telnet 命令,使用 invoke 命令,可以调用 Dubbo 服务,解决一些生产应急事件。

但是玩归玩,闹归闹,别把生产开玩笑。

随意使用 invoke 命令还是存在一定危险性,只要知道方法类,服务参数组装规则,就可以远程执行方法,所以生产系统建议按需申请 invoke权限。

欢迎关注我的公众号:程序通事,获得日常干货推送。如果您对我的专题内容感兴趣,也可以关注我的博客:studyidea.cn

每日一技|巧用 Telnet 调试 Dubbo 服务的更多相关文章

  1. 分布式系列 - dubbo服务telnet命令

    dubbo服务发布之后,我们可以利用telnet命令进行调试.管理.Dubbo2.0.5以上版本服务提供端口支持telnet命令,下面我以通过实例抛砖引玉一下: 1.连接服务 测试对应IP和端口下的d ...

  2. 分布式系列 - dubbo服务telnet命令【转】

    dubbo服务发布之后,我们可以利用telnet命令进行调试.管理.Dubbo2.0.5以上版本服务提供端口支持telnet命令,下面我以通过实例抛砖引玉一下: 1.连接服务 测试对应IP和端口下的d ...

  3. dubbo服务telnet命令

    转载 https://www.cnblogs.com/feiqihang/p/4387330.html dubbo服务发布之后,我们可以利用telnet命令进行调试.管理.Dubbo2.0.5以上版本 ...

  4. dubbo服务telnet命令的使用

    转自:https://www.cnblogs.com/feiqihang/p/4387330.html dubbo服务发布之后,我们可以利用telnet命令进行调试.管理.Dubbo2.0.5以上版本 ...

  5. dubbo服务调试管理实用命令

    公司如果分项目组开发的,各个项目组调用各项目组的接口,有时候需要在联调环境调试对方的接口,可以直接telnet到dubbo的服务通过命令查看已经布的接口和方法,并能直接invoke具体的方法,我们可以 ...

  6. 使用telnet进行Dubbo接口测试

    telnet进入dubbo 查看pid $ jps -l 26048 org.apache.catalina.startup.Bootstrap 12388 org.jetbrains.jps.cmd ...

  7. dubbo服务接口开发者必备调试利器,你值得拥有

    dubbo服务接口开发者必备调试利器,你值得拥有 学习了:https://my.oschina.net/vboxtop/blog/1524290 找到了:http://www.vbox.top/?fr ...

  8. Dubbo入门到精通学习笔记(十二):Dubbo消费端直连提供者(开发调试)、Dubbo服务只订阅(开发调试)、Dubbo服务只注册

    文章目录 Dubbo消费端直连提供者(开发调试) Dubbo服务只订阅(开发调试) Dubbo服务只注册 Dubbo消费端直连提供者(开发调试) Dubbo 官方文档: 用户指南 >> 示 ...

  9. 跟我学习dubbo-使用Maven构建Dubbo服务的可执行jar包(4)

    Dubbo服务的运行方式: 1.使用Servlet容器运行(Tomcat.Jetty等)----不可取 缺点:增加复杂性(端口.管理) 浪费资源(内存) 官方:服务容器是一个standalone的启动 ...

随机推荐

  1. Python - Tuple 怎么用,为什么有 tuple 这种设计?

    背景 看到有同学很执着的用 tuple,想起自己刚学 python 时,也是很喜欢 tuple,为啥?因为以前从来没见过这种样子的数据 (1,2), 感觉很特别,用起来也挺好用 i,j=(1,2), ...

  2. python中交换两个变量值的方法

    a = 4b = 5 #第1种c = 0c = aa = bb = c #第2种a = a+bb = a-ba = a-b #第3种a,b = b,a print("a=%d,b=%d&qu ...

  3. DEVOPS技术实践_17:Jenkins使用扩展邮件功能发送邮件

    一 环境准备 1.1 安装插件Email Extension 系统管理-管理插件-安装Email Extension插件 1.2 配置 配置jenkins邮箱的全局配置:系统管理-系统设置-完成邮箱配 ...

  4. C# 为什么说事件是一种特殊的委托

    很多人说C#的事件是一种特殊的委托,其实并不是,这是对事件的一种误解 C#  事件模型的五个组成部分 1.事件的拥有者 2.事件成员(事件的本身) 3.事件响应者 4.事件处理器:本质上是一种回调方法 ...

  5. 百度DMA+小度App的蓝牙语音解决方案展示

    前记   跟着百度也有一段时间了,经过一年多的努力,我们也做出了一些基于百度的语音助手的产品方案.下面就给大家秀一下我们做的产品.有类似需求的朋友可以多多交流.我们的合作方式十分灵活,可以卖芯片你自己 ...

  6. 机器学习-Pandas 知识点汇总(吐血整理)

    Pandas是一款适用很广的数据处理的组件,如果将来从事机械学习或者数据分析方面的工作,咱们估计70%的时间都是在跟这个框架打交道.那大家可能就有疑问了,心想这个破玩意儿值得花70%的时间吗?咱不是还 ...

  7. 子网划分及NAT技术总结

    近段项目需要用到网络相关的知识,硬着头皮又回顾了一波,这里做一下记录. 一 分类的IP地址 我们使用的IP地址(IP V4)可以划分为A,B,C,D,E 5个类型,其中的D,为组播地址,E类地址为保留 ...

  8. Django进阶一

    目录 表关系创建 django请求生命周期流程 路由层 无名分组 有名分组 反向解析 路由分发 名称空间 虚拟环境 django版本区别 伪静态 视图层 三板斧 JsonResponse前后端交互数据 ...

  9. ubuntu(linux)虚拟主机部署桌面,使用window链接

    买的ubuntu只有命令行,想安装一个桌面,远程操控 网上教程很多,我主要遇到一个问题,百思不得其解 之间安装的不是连接超时,就是拒绝连接 又重新参考这篇博客安装后才解决 说一下大致流程,详细的见这位 ...

  10. JavaScript中函数式编程中文翻译

    JavaScript 中的函数式编程 原著由 Dan Mantyla 编写 近几年来,随着 Haskell.Scala.Clojure 等学院派原生支持函数式编程的偏门语言越来越受到关注,同时主流的 ...