「背景」
Kitex 是位元組跳動基礎架構服務框架團隊推出的 Go 微服務 RPC 框架,支援 Thrift、Kitex Protobuf、gRPC 等訊息協議,具有高效能、強可擴充套件的特點。Kitex 於 2021 年 9 月正式開源後,已在多家外部企業成功落地,為他們帶來了真實的成本、效能和穩定性收益。
然而,對於開發者來說,有一個痛點是,爲了驗證 Server 端程式碼,發起 RPC 測試請求的流程比較繁瑣。
「痛點」
給 Kitex 服務傳送 RPC 測試請求的過程通常包括:
1. 「生成客戶端程式碼」:根據 IDL 檔案生成 Kitex Client 相關程式碼。
2. 「構造測試請求」:構建請求、呼叫方法、處理響應。
3. 「配置多種選項」:設定傳輸協議、元資訊、異常處理等。
這一過程不僅耗時,且在頻繁測試時,每次都需修改和編譯程式碼,效率較低。一個能簡化這些步驟、快速傳送 RPC 請求的工具,將大幅提升開發效率。
「kitexcall 介紹」
詳情可以參考:github.com/kitex-contr…
爲了簡化開發者的工作,社羣推出了 kitexcall 這個命令列工具,基於 Kitex 提供的 「JSON 泛化呼叫」,極大地簡化了 Kitex 客戶端的編寫過程。開發者只需透過簡單的命令列操作,就可以輕鬆發起 Kitex 請求,而不再需要編寫繁瑣的程式碼。
kitexcall 目前已釋出 v0.1.1 版本,具備以下功能特點:
「支援 Thrift/Protobuf」:可以處理 Thrift 和 Protobuf 格式的 IDL。
「支援多種傳輸協議」:包括 Buffered、TTHeader、Framed、TTHeaderFramed,未來還將支援 gRPC。
「靈活的客戶端選項」:支援指定常用的客戶端選項,如 client.WithHostPorts。
「多種資料輸入方式」:請求資料可以從命令列引數或本地檔案讀取。
「元資訊傳遞」:支援單跳透傳和持續透傳的元資訊,並接收伺服器返回的反向透傳元資訊。
「業務異常處理」:接收並處理業務自定義的異常錯誤碼和資訊。
「多種輸出格式」:預設輸出人類友好的可讀格式,未來將支援可解析的格式,便於與其他自動化工具整合。
下面,我們透過一個簡單的例子,展示如何使用 kitexcall 發起一個 Kitex 請求。
「使用示例」
首先安裝 kitexcall 命令列工具:
go install github.com/kitex-contrib/kitexcall@latest
以 github.com/cloudwego/kitex-examples 的 Echo 服務為例,將其 IDL 檔案儲存為 echo.thrift。
namespace go api struct Request { 1: string message } struct Response { 1: string message } service Echo { Response echo(1: Request req) }
為方便測試,你可以用如下步驟在本機啟動這個 Echo 服務(預設監聽 8888 埠):
$ git clone https://github.com/cloudwego/kitex-examples.git $ cd kitex-examples/basic/server/ $ go run . [Info] KITEX: server listen at addr=[::]:8888
使用 kitexcall 發起請求非常簡單,只要在命令列中指定 IDL 檔案、方法名稱、請求報文(JSON 格式)和 Server 地址即可:
kitexcall -idl-path echo.thrift -m echo -d '{"message": "hello"}' -e 127.0.0.1:8888
然後就可以看到 kitexcall 輸出服務端返回的響應報文:
[Status]: Success { "message": "hello" }
如果你希望從檔案中讀入請求資料,也可以先建立請求資料檔案 input.json:
{"message": "hello"}
並在 kitexcall 的引數中用 -f 引數指定檔名:
kitexcall -idl-path echo.thrift -m echo -f input.json -e 127.0.0.1:8888
「原理簡介」
kitexcall 工具基於 Kitex 提供的 JSON 泛化呼叫實現。其原理簡單介紹如下:
1. 「Descriptor Provider」
kitexcall 使用 Kitex 提供的 DescriptorProvider 介面來解析 Thrift 或 Protobuf 的 IDL 檔案,獲取服務定義。
2. 「泛化物件建立」
解析 IDL 檔案後,kitexcall 建立泛化物件(如 JSONThriftGeneric 或 JSONPbGeneric),將 JSON 資料轉換為內部請求格式,並將響應資料轉換回 JSON 格式。
3. 「客戶端初始化」
kitexcall 使用泛化物件和客戶端選項(如傳輸協議、元資訊處理等)來建立泛化客戶端。該客戶端可以呼叫 IDL 檔案中定義的任何服務方法。
4. 「請求構建與傳送」
kitexcall 從命令列輸入或檔案中讀取 JSON 格式的請求資料,構建請求物件併發送請求,同時設定傳輸協議和元資訊。
5. 「響應處理」
接收到響應後,kitexcall 將其格式化為 JSON 並輸出。如果啟用了元資訊回傳機制,還會輸出從服務端返回的元資訊。
「未來展望」
kitexcall 作為一個社羣驅動的專案,致力於簡化開發者使用 Kitex 進行 RPC 呼叫的過程。未來,我們計劃在以下幾個方面進行改進和擴充套件:
計劃支援 gRPC(含基於 gRPC/HTTP2 的 Thrift Streaming)協議,以適應更多的使用場景。
支援透過服務發現獲取 Kitex Server 地址。
在 Kitex Server 支援 Reflection 能力之後,kitexcall 將跟進,實現無需 IDL 檔案,即可獲取服務詳情和進行服務呼叫,使用將會更加便捷。
支援可解析的輸出格式(如 JSON),以便與其他自動化工具整合(例如 CI/CD、IDE 外掛等場景)。
歡迎對 Kitex 和 kitexcall 感興趣的開發者加入社羣,共同貢獻程式碼和創意。我們相信,在大家的共同努力下,kitexcall 將成為 Kitex 開發者手中的一把利器,讓微服務開發變得更加高效和便捷。訪問 github.com/kitex-contrib/kitexcall 瞭解更多資訊,並加入我們吧!
「專案地址」
GitHub:github.com/cloudwego