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

0x00. 前言

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

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

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

0x01. telnet 进入 Dubbo 调试

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

telnet  IP PORT
#例如:
telnet localhost 20880

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

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

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

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

0x02. invoke 执行 Dubbo 方法

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

# 需要提前调用 cd XxxService,使这个服务成为缺省服务
invoke xxxMethod(1234, "abcd", {"prop" : "value"})
# 调用该服务的方法
invoke XxxService.xxxMethod(1234, "abcd", {"prop" : "value"})
# 调用全路径服务的方法,推荐使用这种方式,精确执行服务方法。
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,明确参数类型,例如:

{
"name": "11",
"age": 12,
"class":"xx.xx.Pojo"
}

如果没有传入,将会调用失败,相关问题可以参见这个 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基础试题(一)

    1.执行 Python 脚本的两种方式 1.python 进入解释器 2.python 1.py 执行文件 limux里 ./1.py 2.简述位.字节的关系 8位1个字节.计算机处理以字节为单位,存 ...

  2. 数据库基础之Mysql

    数据库的简介 数据库 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展性, ...

  3. 【抖音测试开发日常实习】一二三四面面经,攒人品求Offer

    总结: 一.流程 (估计)一面二面技术leader面,三面部门领导面,四面肯定是HR面 二.系统 用的牛客网面试系统,长相大概是这样:   打字聊天框我在听不清对面声音的时候用过,感觉没啥卵用,手撕代 ...

  4. 专业版12.0试用,打开演示账套,提示“列名FPlatver无效”

    你好,我代表研发来说明一下这个问题:一.产生的原因:由于KIS产品今年陆续都增加了应用平台,前期平台兼容性还有些问题,如果一台电脑有多个不同版本的平台,就会产生冲突,因此报错.1.可能您的机器装了多个 ...

  5. NOIP2009 压轴---最优贸易

    链接:https://ac.nowcoder.com/acm/contest/959/H来源:牛客网 C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市.任意两个城市之间最多只有一条道路 ...

  6. AbstractRoutingDataSource动态数据源切换

    操作数据一般都是在DAO层进行处理,可以选择直接使用JDBC进行编程(http://blog.csdn.net/yanzi1225627/article/details/26950615/) 或者是使 ...

  7. win32简单的sockeTCP协议通信

    什么也不说了看代码 首先是服务端代码 #include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #i ...

  8. $Poj1723/AcWing123\ Soldiers$ 排序

    $Poj$ $AcWing$ $Description$ $Sol$ 分别处理$x$坐标和$y$坐标.$y$坐标显然很好处理,就是排个序然后取中位数就好了.$x$没有$y$那么直接叭.所以我首先写了个 ...

  9. 大数据学习之路-Centos6安装python3.5

    Centos 6.8安装python3.5.2 因为学习所需,需要用到python3.x的环境,目前Linux系统默认的版本都是python2.x的,还有一些自带的工具需要用到python2.6版本, ...

  10. DLC双端锁,CAS,ABA问题

    一.什么是DLC双端锁?有什么用处? 为了解决在多线程模式下,高并发的环境中,唯一确保单例模式只能生成一个实例 多线程环境中,单例模式会因为指令重排和线程竞争的原因会出现多个对象 public cla ...