每日一技|巧用 Telnet 调试 Dubbo 服务
个人博客地址 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: 如果参数为 数组,
List
,Map
,小黑哥有时候想不到怎么转成 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
命令的过程中发现了一个 Bug,select
执行未选中的方法。如上,我使用 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 服务的更多相关文章
- 分布式系列 - dubbo服务telnet命令
dubbo服务发布之后,我们可以利用telnet命令进行调试.管理.Dubbo2.0.5以上版本服务提供端口支持telnet命令,下面我以通过实例抛砖引玉一下: 1.连接服务 测试对应IP和端口下的d ...
- 分布式系列 - dubbo服务telnet命令【转】
dubbo服务发布之后,我们可以利用telnet命令进行调试.管理.Dubbo2.0.5以上版本服务提供端口支持telnet命令,下面我以通过实例抛砖引玉一下: 1.连接服务 测试对应IP和端口下的d ...
- dubbo服务telnet命令
转载 https://www.cnblogs.com/feiqihang/p/4387330.html dubbo服务发布之后,我们可以利用telnet命令进行调试.管理.Dubbo2.0.5以上版本 ...
- dubbo服务telnet命令的使用
转自:https://www.cnblogs.com/feiqihang/p/4387330.html dubbo服务发布之后,我们可以利用telnet命令进行调试.管理.Dubbo2.0.5以上版本 ...
- dubbo服务调试管理实用命令
公司如果分项目组开发的,各个项目组调用各项目组的接口,有时候需要在联调环境调试对方的接口,可以直接telnet到dubbo的服务通过命令查看已经布的接口和方法,并能直接invoke具体的方法,我们可以 ...
- 使用telnet进行Dubbo接口测试
telnet进入dubbo 查看pid $ jps -l 26048 org.apache.catalina.startup.Bootstrap 12388 org.jetbrains.jps.cmd ...
- dubbo服务接口开发者必备调试利器,你值得拥有
dubbo服务接口开发者必备调试利器,你值得拥有 学习了:https://my.oschina.net/vboxtop/blog/1524290 找到了:http://www.vbox.top/?fr ...
- Dubbo入门到精通学习笔记(十二):Dubbo消费端直连提供者(开发调试)、Dubbo服务只订阅(开发调试)、Dubbo服务只注册
文章目录 Dubbo消费端直连提供者(开发调试) Dubbo服务只订阅(开发调试) Dubbo服务只注册 Dubbo消费端直连提供者(开发调试) Dubbo 官方文档: 用户指南 >> 示 ...
- 跟我学习dubbo-使用Maven构建Dubbo服务的可执行jar包(4)
Dubbo服务的运行方式: 1.使用Servlet容器运行(Tomcat.Jetty等)----不可取 缺点:增加复杂性(端口.管理) 浪费资源(内存) 官方:服务容器是一个standalone的启动 ...
随机推荐
- Python - Tuple 怎么用,为什么有 tuple 这种设计?
背景 看到有同学很执着的用 tuple,想起自己刚学 python 时,也是很喜欢 tuple,为啥?因为以前从来没见过这种样子的数据 (1,2), 感觉很特别,用起来也挺好用 i,j=(1,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 ...
- DEVOPS技术实践_17:Jenkins使用扩展邮件功能发送邮件
一 环境准备 1.1 安装插件Email Extension 系统管理-管理插件-安装Email Extension插件 1.2 配置 配置jenkins邮箱的全局配置:系统管理-系统设置-完成邮箱配 ...
- C# 为什么说事件是一种特殊的委托
很多人说C#的事件是一种特殊的委托,其实并不是,这是对事件的一种误解 C# 事件模型的五个组成部分 1.事件的拥有者 2.事件成员(事件的本身) 3.事件响应者 4.事件处理器:本质上是一种回调方法 ...
- 百度DMA+小度App的蓝牙语音解决方案展示
前记 跟着百度也有一段时间了,经过一年多的努力,我们也做出了一些基于百度的语音助手的产品方案.下面就给大家秀一下我们做的产品.有类似需求的朋友可以多多交流.我们的合作方式十分灵活,可以卖芯片你自己 ...
- 机器学习-Pandas 知识点汇总(吐血整理)
Pandas是一款适用很广的数据处理的组件,如果将来从事机械学习或者数据分析方面的工作,咱们估计70%的时间都是在跟这个框架打交道.那大家可能就有疑问了,心想这个破玩意儿值得花70%的时间吗?咱不是还 ...
- 子网划分及NAT技术总结
近段项目需要用到网络相关的知识,硬着头皮又回顾了一波,这里做一下记录. 一 分类的IP地址 我们使用的IP地址(IP V4)可以划分为A,B,C,D,E 5个类型,其中的D,为组播地址,E类地址为保留 ...
- Django进阶一
目录 表关系创建 django请求生命周期流程 路由层 无名分组 有名分组 反向解析 路由分发 名称空间 虚拟环境 django版本区别 伪静态 视图层 三板斧 JsonResponse前后端交互数据 ...
- ubuntu(linux)虚拟主机部署桌面,使用window链接
买的ubuntu只有命令行,想安装一个桌面,远程操控 网上教程很多,我主要遇到一个问题,百思不得其解 之间安装的不是连接超时,就是拒绝连接 又重新参考这篇博客安装后才解决 说一下大致流程,详细的见这位 ...
- JavaScript中函数式编程中文翻译
JavaScript 中的函数式编程 原著由 Dan Mantyla 编写 近几年来,随着 Haskell.Scala.Clojure 等学院派原生支持函数式编程的偏门语言越来越受到关注,同时主流的 ...