前言
想象这样一个场景,线上某个服务突发异常,导致上游服务调用异常,数据处于中间状态。服务恢复之后,我们需要修复这笔数据至正常状态,怎么办?
如果仅是简单的服务,涉及少量数据变更,我们可以直接使用 SQL
,变更数据状态。但是有些情况下,服务需要联动调用其他系统,变更其他系统数据。这种情况下,变更数据非常麻烦,需要与其他系统开发沟通,整理数据,一起变更。如果涉及还涉及外部系统,数据变更几乎玩不下去了。
如果服务接口能重试,重新调用,那么数据变更就交给服务自动去调用即可。这个过程我们需要组装参数,然后调用服务接口。如果你的服务采用 Http
接口,可以使用 Curl
等命令重试。如果你的服务使用 Dubbo
,这就需要使用到 Telnet
命令。
telnet 进入 Dubbo 调试
通过以下指令,连接 Dubbo 服务。(Dubbo 版本需要大于 2.0.5,远程调用需要注意网络是否可用)
1telnet IP PORT
2#例如:
3telnet localhost 20880
连上之后,按下回车键将会进入以下页面:
这个界面与 Shell
类似,需要我们输入相关命令(命令参考手册:http://dubbo.apache.org/zh-cn/docs/user/references/telnet.html)。例如
invoke 执行 Dubbo 方法
这里我们重点介绍 invoke
命令,该命令可以用来执行 Dubbo
服务,调用方式如下:
1# 需要提前调用 cd XxxService,使这个服务成为缺省服务
2invoke xxxMethod(1234, "abcd", {"prop" : "value"})
3# 调用该服务的方法
4invoke XxxService.xxxMethod(1234, "abcd", {"prop" : "value"})
5# 调用全路径服务的方法,推荐使用这种方式,精确执行服务方法。
6invoke com.xxx.XxxService.xxxMethod(1234, "abcd", {"prop" : "value"})
运行结果如下:
注意点
Invoke
命令内部使用 FastJson
,将字符串转化为 Json
对象。Dubbo Telnet
命令,调用invoke
命令,可以调用 Dubbo
服务,解决一些生产应急事件。但是玩归玩,闹归闹,别把生产开玩笑。随意使用 invoke
命令还是存在一定危险性,只要知道方法类,服务参数组装规则,就可以远程执行方法,所以生产系统建议按需申请 invoke
权限。