個人部落格地址 studyidea.cn,點選檢視更多原創文章
0x00. 前言
想象這樣一個場景,線上某個服務突發異常,導致上游服務呼叫異常,資料處於中間狀態。服務恢復之後,我們需要修復這筆資料至正常狀態,怎麼辦?
如果僅是簡單的服務,涉及少量資料變更,我們可以直接使用 SQL
,變更資料狀態。但是有些情況下,服務需要聯動呼叫其他系統,變更其他系統資料。這種情況下,變更資料非常麻煩,需要與其他系統開發溝通,整理資料,一起變更。如果涉及還涉及外部系統,資料變更幾乎玩不下去了。
如果服務介面能重試,重新呼叫,那麼資料變更就交給服務自動去呼叫即可。這個過程我們需要組裝引數,然後呼叫服務介面。如果你的服務採用 Http
介面,可以使用 Curl
等命令重試。如果你的服務使用 Dubbo
,這就需要使用到 Telnet
命令。
0x01. telnet 進入 Dubbo 除錯
通過以下指令,連線 Dubbo 服務。
telnet IP PORT
#例如:
telnet localhost 20880
複製程式碼
Dubbo 版本需要大於 2.0.5,遠端呼叫需要注意網路是否可用
連上之後,按下Enter鍵將會進入以下頁面:
這個介面與 Shell
類似,需要我們輸入相關命令。例如:
命令參考手冊: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"})
複製程式碼
執行結果如下:
槽點: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 github.com/apache/dubb…。這個修復很簡單,小黑哥已提交 PR 修復該 Bug。
沒想到,寫這篇文章過程中,還能發現一個 Bug,然後成為 Dubbo Committer,哈哈哈哈。
0x04. 總結
使用 Dubbo Telnet
命令,使用 invoke
命令,可以呼叫 Dubbo
服務,解決一些生產應急事件。
但是玩歸玩,鬧歸鬧,別把生產開玩笑。
隨意使用 invoke
命令還是存在一定危險性,只要知道方法類,服務引數組裝規則,就可以遠端執行方法,所以生產系統建議按需申請 invoke
許可權。
歡迎關注我的公眾號:程式通事,獲得日常乾貨推送。如果您對我的專題內容感興趣,也可以關注我的部落格:studyidea.cn