我的博客地址 studyidea.cn,点击查看更多原创文章html
想象这样一个场景,线上某个服务突发异常,致使上游服务调用异常,数据处于中间状态。服务恢复以后,咱们须要修复这笔数据至正常状态,怎么办?git
若是仅是简单的服务,涉及少许数据变动,咱们能够直接使用 SQL
,变动数据状态。可是有些状况下,服务须要联动调用其余系统,变动其余系统数据。这种状况下,变动数据很是麻烦,须要与其余系统开发沟通,整理数据,一块儿变动。若是涉及还涉及外部系统,数据变动几乎玩不下去了。github
若是服务接口能重试,从新调用,那么数据变动就交给服务自动去调用便可。这个过程咱们须要组装参数,而后调用服务接口。若是你的服务采用 Http
接口,可使用 Curl
等命令重试。若是你的服务使用 Dubbo
,这就须要使用到 Telnet
命令。shell
经过如下指令,链接 Dubbo 服务。apache
telnet IP PORT
#例如:
telnet localhost 20880
复制代码
Dubbo 版本须要大于 2.0.5,远程调用须要注意网络是否可用json
连上以后,按下回车键将会进入如下页面:数组
这个界面与 Shell
相似,须要咱们输入相关命令。例如:bash
命令参考手册:dubbo.apache.org/zh-cn/docs/…。网络
这里咱们重点介绍 invoke
命令,该命令能够用来执行 Dubbo
服务,调用方式以下:ide
# 须要提早调用 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
。
Dubbo
最新版本,若是服务存在多个相同参数的重载方法,且没有使用 class
来明确参数类型,提示用户使用新增的select
命令来选择要调用的方法。
小黑哥在测试 select
命令的过程当中发现了一个 Bug,select
执行未选中的方法。如上,我使用 select 1
但愿执行 1. hello(HelloRequest)
,可是实际上执行的是 2. hello(HelloRequestV2)
。当输入 select 2
时,执行结果以下:
这个 Bug 详情参考小黑哥提的这个 issue github.com/apache/dubb…。这个修复很简单,小黑哥已提交 PR 修复该 Bug。
没想到,写这篇文章过程当中,还能发现一个 Bug,而后成为 Dubbo Committer,哈哈哈哈。
使用 Dubbo Telnet
命令,使用 invoke
命令,能够调用 Dubbo
服务,解决一些生产应急事件。
可是玩归玩,闹归闹,别把生产开玩笑。
随意使用 invoke
命令仍是存在必定危险性,只要知道方法类,服务参数组装规则,就能够远程执行方法,因此生产系统建议按需申请 invoke
权限。
欢迎关注个人公众号:程序通事,得到平常干货推送。若是您对个人专题内容感兴趣,也能够关注个人博客:studyidea.cn