我的博客地址 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