当前位置: 首页 > news >正文

dubbo invoke 日期参数怎么传_每日一技|巧用 Telnet 调试 Dubbo 服务

0x00. 前言

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

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

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

0x01. telnet 进入 Dubbo 调试

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

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

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

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

bf5ff1fe88e139d47c57c5e30603d5bc.png

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

f76d7632a4e80ecc9ec43622bedb1196.png

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

0x02. 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"})

运行结果如下:

d7674af79dc08286c2a5c4f19420481c.png

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

注意点

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

79e2d963e121b07a7eef50650680acec.png

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 命令来选择要调用的方法。

632fdc74244d4ba0649c8de88b39609c.png

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

53f6261d3ce55b76e392e74d161ac178.png

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

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

13ad93af44e4b00a5eb5cab7cddf0aaf.gif

0x04. 总结

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

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

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

END -

f55b7a9f79b3a4cb14e29d698c5b16da.png

「技术分享」某种程度上,是让作者和读者,不那么孤独的东西。欢迎关注我的微信公众号:「Kirito的技术分享」

相关文章:

  • 360安全助手 -- 强力卸载电脑上的软件 的问题
  • basic语言基础 chm_专升本:计算机基础知识点大全
  • 等候环境对他的事业完全有利才动手的人,将永远不会成功。
  • python随机生成运算符_我怎样才能随机选择一个数学运算符并用它来问重复出现的数学问题?...
  • IIS7中注册wcf
  • 平均聚类系数_模糊数学笔记:五、模糊聚类
  • 看到苹果的把视频转接线当金条卖,我彻底怒了。。。。。。。
  • python特效源代码_Python基于pygame实现的弹力球效果(附源码)
  • 在Google Doc不可用的时候,见识了Google的18国语言道歉, 力压苹果5国
  • 软件验收标准和验收方法_软件测试干货:项目验收测试和产品验收测试的区别...
  • python 3d人脸重建_一张图实现3D人脸建模!中科院博士ECCV的新研究
  • 3G互联下的“位置”之争!
  • 如何在python中安装包_如何给python安装包
  • 线性回归数据_R数据科学——线性回归七
  • t450加固态硬盘教程_Thinkpad t450s拆机换240G ssd+加8G内存
  • [nginx文档翻译系列] 控制nginx
  • Android 架构优化~MVP 架构改造
  • Cookie 在前端中的实践
  • Date型的使用
  • java第三方包学习之lombok
  • js 实现textarea输入字数提示
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • SQLServer插入数据
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 开源地图数据可视化库——mapnik
  • 首页查询功能的一次实现过程
  • 用mpvue开发微信小程序
  • gunicorn工作原理
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 带你开发类似Pokemon Go的AR游戏
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)bark-ml
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • ??javascript里的变量问题
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [240621] Anthropic 发布了 Claude 3.5 Sonnet AI 助手 | Socket.IO 拒绝服务漏洞
  • [AIGC] HashMap的扩容与缩容:动态调整容量以提高性能
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [C++] vector list 等容器的迭代器失效问题
  • [Cloud Networking] Layer 2
  • [DNS网络] 网页无法打开、显示不全、加载卡顿缓慢 | 解决方案
  • [Electron]ipcMain.on和ipcMain.handle的区别
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [LeetCode]-Integer to Roman 阿拉伯数字转罗马数字
  • [LeetCode]—Longest Palindromic Substring 最长回文子串
  • [Python]list.append字典的时候,修改字典会导致list内容变化的问题
  • [Python人工智能] 四十四.命名实体识别 (5)利用bert4keras构建Bert-CRF实体识别模型(实体位置)
  • [ruby on rails] array、jsonb字段
  • [Shell]Linux常用快捷键