kitexcall:用 JSON 發(fā)起 RPC 請求的命令行神器
01、背景
Kitex 是字節(jié)跳動基礎架構(gòu)服務框架團隊推出的 Go 微服務 RPC 框架,支持 Thrift、Kitex Protobuf、gRPC 等消息協(xié)議,具有高性能、強可擴展的特點。Kitex 于 2021 年 9 月正式開源后,已在多家外部企業(yè)成功落地,為他們帶來了真實的成本、性能和穩(wěn)定性收益。然而,對于開發(fā)者來說,有一個痛點是,為了驗證 Server 端代碼,發(fā)起 RPC 測試請求的流程比較繁瑣。
02、痛點
給 Kitex 服務發(fā)送 RPC 測試請求的過程通常包括:1. 生成客戶端代碼:根據(jù) IDL 文件生成 Kitex Client 相關(guān)代碼。2. 構(gòu)造測試請求:構(gòu)建請求、調(diào)用方法、處理響應。3. 配置多種選項:設置傳輸協(xié)議、元信息、異常處理等。這一過程不僅耗時,且在頻繁測試時,每次都需修改和編譯代碼,效率較低。一個能簡化這些步驟、快速發(fā)送 RPC 請求的工具,將大幅提升開發(fā)效率。
03、kitexcall 介紹
詳情可以參考:https://github.com/kitex-contrib/kitexcall
為了簡化開發(fā)者的工作,社區(qū)推出了 kitexcall 這個命令行工具,基于 Kitex 提供的 JSON 泛化調(diào)用,極大地簡化了 Kitex 客戶端的編寫過程。開發(fā)者只需通過簡單的命令行操作,就可以輕松發(fā)起 Kitex 請求,而不再需要編寫繁瑣的代碼。
kitexcall 目前已發(fā)布 v0.1.1 版本,具備以下功能特點:
- 支持 Thrift/Protobuf:可以處理 Thrift 和 Protobuf 格式的 IDL。
- 支持多種傳輸協(xié)議:包括 Buffered、TTHeader、Framed、TTHeaderFramed,未來還將支持 gRPC。
- 靈活的客戶端選項:支持指定常用的客戶端選項,如 client.WithHostPorts。
- 多種數(shù)據(jù)輸入方式:請求數(shù)據(jù)可以從命令行參數(shù)或本地文件讀取。
- 元信息傳遞:支持單跳透傳和持續(xù)透傳的元信息,并接收服務器返回的反向透傳元信息。
- 業(yè)務異常處理:接收并處理業(yè)務自定義的異常錯誤碼和信息。
- 多種輸出格式:默認輸出人類友好的可讀格式,未來將支持可解析的格式,便于與其他自動化工具集成。
下面,我們通過一個簡單的例子,展示如何使用 kitexcall 發(fā)起一個 Kitex 請求。
04、使用示例
首先安裝 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 服務(默認監(jiān)聽 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 發(fā)起請求非常簡單,只要在命令行中指定 IDL 文件、方法名稱、請求報文(JSON 格式)和 Server 地址即可:
kitexcall -idl-path echo.thrift -m echo -d '{"message": "hello"}' -e 127.0.0.1:8888
然后就可以看到 kitexcall 輸出服務端返回的響應報文:
[Status]: Success{ "message": "hello"}
如果你希望從文件中讀入請求數(shù)據(jù),也可以先創(chuàng)建請求數(shù)據(jù)文件 input.json:
{"message": "hello"}
并在 kitexcall 的參數(shù)中用 -f 參數(shù)指定文件名:
kitexcall -idl-path echo.thrift -m echo -f input.json -e 127.0.0.1:8888
05、原理簡介
kitexcall 工具基于 Kitex 提供的 JSON 泛化調(diào)用實現(xiàn)。其原理簡單介紹如下:
1. Descriptor Provider
kitexcall 使用 Kitex 提供的 DescriptorProvider 接口來解析 Thrift 或 Protobuf 的 IDL 文件,獲取服務定義。
2. 泛化對象創(chuàng)建
解析 IDL 文件后,kitexcall 創(chuàng)建泛化對象(如 JSONThriftGeneric 或 JSONPbGeneric),將 JSON 數(shù)據(jù)轉(zhuǎn)換為內(nèi)部請求格式,并將響應數(shù)據(jù)轉(zhuǎn)換回 JSON 格式。
3. 客戶端初始化
kitexcall 使用泛化對象和客戶端選項(如傳輸協(xié)議、元信息處理等)來創(chuàng)建泛化客戶端。該客戶端可以調(diào)用 IDL 文件中定義的任何服務方法。
4. 請求構(gòu)建與發(fā)送
kitexcall 從命令行輸入或文件中讀取 JSON 格式的請求數(shù)據(jù),構(gòu)建請求對象并發(fā)送請求,同時設置傳輸協(xié)議和元信息。
5. 響應處理
接收到響應后,kitexcall 將其格式化為 JSON 并輸出。如果啟用了元信息回傳機制,還會輸出從服務端返回的元信息。
06、未來展望
kitexcall 作為一個社區(qū)驅(qū)動的項目,致力于簡化開發(fā)者使用 Kitex 進行 RPC 調(diào)用的過程。未來,我們計劃在以下幾個方面進行改進和擴展:
1. 計劃支持 gRPC(含基于 gRPC/HTTP2 的 Thrift Streaming)協(xié)議,以適應更多的使用場景。
2. 支持通過服務發(fā)現(xiàn)獲取 Kitex Server 地址。
3. 在 Kitex Server 支持 Reflection 能力之后,kitexcall 將跟進,實現(xiàn)無需 IDL 文件,即可獲取服務詳情和進行服務調(diào)用,使用將會更加便捷。
4. 支持可解析的輸出格式(如 JSON),以便與其他自動化工具集成(例如 CI/CD、IDE 插件等場景)。
歡迎對 Kitex 和 kitexcall 感興趣的開發(fā)者加入社區(qū),共同貢獻代碼和創(chuàng)意。我們相信,在大家的共同努力下,kitexcall 將成為 Kitex 開發(fā)者手中的一把利器,讓微服務開發(fā)變得更加高效和便捷。訪問 github.com/kitex-contrib/kitexcall 了解更多信息,并加入我們吧!
項目地址GitHub:https://github.com/cloudwego
官網(wǎng):www.cloudwego.io