哈嘍,大家好,我是小墨,今天我和大家一起學習一下如何用Python寫一個Dubbo介面測驗工具,
本文實作的效果:輸入服務名、方法名和引數,輸出格式化后的請求結果
對dubbo和telnet有所了解的可以直接移步github
Dubbo和telnet
詳細介紹:
1.Dubbo是阿里巴巴開源的一款RPC(Remote Procedure Call,遠程程序呼叫)框架,用于實作分布式服務的跨服務呼叫,具有遠程通訊、動態配置、地址路由等功能,
2.Dubbo基于dubbo協議,dubbo協議是TCP協議之上的協議,采用單一長連接和 NIO 異步通訊,適合于小資料量大并發的服務呼叫,以及服務消費者機器數遠大于服務提供者機器數的情況,
3.Telnet協議是TCP/IP協議族中的一員,是Internet遠程登錄服務的標準協議和主要方式,Telnet是常用的遠程控制Web服務器的方法,具體介紹可以查看百度百科:Telnet_百度百科
4.Dubbo 2.0.5版本以上開始支持telnet命令呼叫,本文正是基于telnet命令來實作對Dubbo介面的呼叫,
使用telnet命令呼叫dubbo服務
撰寫代碼之前,先簡單了解一下如何使用telnet命令呼叫dubbo服務,
首先打開cmd,使用telnet命令連接服務器(如果提示指令不存在的話,在設定-啟用或關閉Windows功能里勾選“Telnet客戶端“并保存)
其中172.16.51.4是dubbo服務所在的服務器地址,20885是dubbo服務指定的埠,

telnet命令
輸入ls并回車,列出所有可用的服務
輸入ls 服務名,列出服務下所有的方法
輸入ls -l 服務名,列出服務下的所有方法和引數
輸入invoke 服務名.方法名(呼叫引數),呼叫對應服務的dubbo介面
其它Telnet命令參考
telnet呼叫示例
呼叫UserInfoRpcService服務的getUserState方法,引數是一個Long型別數值
如下圖,介面成功回應并回傳了一個json字串(默認不是utf-8編碼,所以中文會亂碼)

終上所述,使用telnet命令的方式呼叫dubbo介面最少需要三步:
1、查找服務的ip和埠(通常是在dubbo-admin或zookeeper查找)
2、telnet連接服務器
3、invoke命令呼叫介面
如果一次兩次還好,如果用的多了,就會感覺很不方便:
1、每次都要查找對應服務的ip埠并手動連接
2、連接一段時間不操作,就會自動斷開連接
3、invoke命令純手輸,輸錯了不能用游標移動到錯誤處修改,只能洗掉重新輸入
4、回應不支持中文,且沒有格式化,需要復制出來手動格式化才具有易讀性
使用Python實作
既然手動輸入telnet命令很不方便,那么使用代碼實作可以做到哪些改進呢?
重復幾次命令操作之后就會發現,除了呼叫時需要填寫的服務名、方法名和引數之外,其余如查找ip埠、連接服務器、格式化回應都是重復性很高的操作,完全可以簡化,
所以我們用Python實作的目標就是:只輸入服務名、方法名、引數并執行,就得到一個易讀的回傳結果,
通過服務名自動查找ip埠
首先人工查找服務的ip埠的步驟是可以省略的,
系統通過dubbo提供服務,需要將服務注冊到指定的注冊中心(通常是使用Zookeeper作為Dubbo的注冊中心),并暴露其服務器ip和埠,既然如此,就可以通過注冊中心查找對應服務的注冊資訊,來自動獲取其ip和埠了,
在Python中,可以通過kazoo庫來連接Zookeeper,代碼如下:

通過實體化Zookeeper物件,并呼叫get_service_address方法,就可以獲得指定服務的ip地址和埠了,
實作telnet命令呼叫并格式化回傳值
完成服務的ip埠查找后,開始進行介面呼叫,并將介面回應格式化成易讀的形式,
在Python中,使用telnetlib庫來完成telnet命令操作,代碼如下:




在run函式中,首先實體化一個DubboTester物件并呼叫invoke方法,執行telnet命令,得到回傳的結果后,再嘗試json決議并格式化,最后得到一個易讀的回傳結果,
執行
通過上述代碼的實作,現在只需要傳入一個包含service、method、params欄位的字典型別資料,就可以呼叫對應的dubbo介面了:
執行結果如下:
完整代碼:github
所謂的光輝歲月,不是有人時多么絢麗多姿,而是無人問津時,你對夢想的執著,在這里推薦一個軟體測驗交流群:642830685,群內會不定期的分享技術干貨,一起交流探討吧,
最后讓我們每天努力一點點,期待你的一飛沖天!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/251443.html
標籤:其他
