Menu
快讀
  • 旅遊
  • 生活
    • 美食
    • 寵物
    • 養生
    • 親子
  • 娛樂
    • 動漫
  • 時尚
  • 社會
  • 探索
  • 故事
  • 科技
  • 軍事
  • 国际
快讀

每日一技:巧用 Telnet 調試 Dubbo 服務

2020 年 2 月 6 日 追逐仰望星空

推薦閱讀:

  • 都是“Redis惹的禍”,害我差點挂在美團三面,真是“虛驚一場”
  • 6大面試技能樹:JAVA基礎+JVM+算法+數據庫+計算機網絡+操作系統
每日一技:巧用 Telnet 調試 Dubbo 服務

0x00. 前言

想象這樣一個場景,線上某個服務突發異常,導致上遊服務調用異常,數據處于中間狀態。服務恢複之後,我們需要修複這筆數據至正常狀態,怎麽辦?

如果僅是簡單的服務,涉及少量數據變更,我們可以直接使用 SQL,變更數據狀態。但是有些情況下,服務需要聯動調用其他系統,變更其他系統數據。這種情況下,變更數據非常麻煩,需要與其他系統開發溝通,整理數據,一起變更。如果涉及還涉及外部系統,數據變更幾乎玩不下去了。

如果服務接口能重試,重新調用,那麽數據變更就交給服務自動去調用即可。這個過程我們需要組裝參數,然後調用服務接口。如果你的服務采用 Http 接口,可以使用 Curl 等命令重試。如果你的服務使用 Dubbo ,這就需要使用到 Telnet 命令。

0x01. telnet 進入 Dubbo 調試

通過以下指令,連接 Dubbo 服務。

telnet  IP PORT
#例如:
telnet localhost 20880
複制代碼

Dubbo 版本需要大于 2.0.5,遠程調用需要注意網絡是否可用

連上之後,按下回車鍵將會進入以下頁面:

每日一技:巧用 Telnet 調試 Dubbo 服務

這個界面與 Shell 類似,需要我們輸入相關命令。例如:

每日一技:巧用 Telnet 調試 Dubbo 服務

命令參考手冊:dubbo.apache.org/zh-cn/docs/…。

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"})
複制代碼

運行結果如下:

每日一技:巧用 Telnet 調試 Dubbo 服務

槽點:mac 平台 iterm2 使用 telnet 命令進入 Dubbo 調試,中文輸入將會亂碼,使用 SecureCRT telnet 就不會亂碼。感覺是 mac 平台終端問題,不知道各位小夥伴有沒有碰到過?有解決辦法的小夥伴,歡迎留個言。

注意點

Invoke 命令內部使用 FastJson,將字符串轉化爲 Json 對象。

每日一技:巧用 Telnet 調試 Dubbo 服務

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 命令來選擇要調用的方法。

每日一技:巧用 Telnet 調試 Dubbo 服務

小黑哥在測試 select 命令的過程中發現了一個 Bug,select 執行未選中的方法。如上,我使用 select 1希望執行 1. hello(HelloRequest),但是實際上執行的是 2. hello(HelloRequestV2)。當輸入 select 2 時,執行結果如下:

每日一技:巧用 Telnet 調試 Dubbo 服務

這個 Bug 詳情參考小黑哥提的這個 issue github.com/apache/dubb…。這個修複很簡單,小黑哥已提交 PR 修複該 Bug。

沒想到,寫這篇文章過程中,還能發現一個 Bug,然後成爲 Dubbo Committer,哈哈哈哈。

每日一技:巧用 Telnet 調試 Dubbo 服務

0x04. 總結

使用 Dubbo Telnet 命令,使用 invoke 命令,可以調用 Dubbo 服務,解決一些生産應急事件。

但是玩歸玩,鬧歸鬧,別把生産開玩笑。

隨意使用 invoke 命令還是存在一定危險性,只要知道方法類,服務參數組裝規則,就可以遠程執行方法,所以生産系統建議按需申請 invoke權限。

作者:樓下小黑哥
鏈接:https://juejin.im/post/5e3a35e4518825494d4fc0c0
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

相關文章:

  • 面試清單(Java崗)Java+JVM+數據庫+算法+Spring+中間件+設計模式
  • 微服務最佳實踐:MSE 微服務引擎
  • 計算機網絡-計算機網絡 (功能,組成,定義,分類)概述
  • 現代編程語言哪家強?2020年,你或許應該了解這7門編程語言
  • 網易開發三年,現跳槽螞蟻花呗,4面順利通過,拿下Java崗offer
  • 工作五年程序員一枚,不了解Java agent技術,感覺要涼
科技

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

©2025 快讀 | 服務協議 | DMCA | 聯繫我們