切換語言為:簡體

開源 Go 微服務 RPC 框架 Kitex

  • 爱糖宝
  • 2024-08-30
  • 2068
  • 0
  • 0

「背景」

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 呼叫的過程。未來,我們計劃在以下幾個方面進行改進和擴充套件:

  1. 計劃支援 gRPC(含基於 gRPC/HTTP2 的 Thrift Streaming)協議,以適應更多的使用場景。

  2. 支援透過服務發現獲取 Kitex Server 地址。

  3. 在 Kitex Server 支援 Reflection 能力之後,kitexcall 將跟進,實現無需 IDL 檔案,即可獲取服務詳情和進行服務呼叫,使用將會更加便捷。

  4. 支援可解析的輸出格式(如 JSON),以便與其他自動化工具整合(例如 CI/CD、IDE 外掛等場景)。

歡迎對 Kitex 和 kitexcall 感興趣的開發者加入社羣,共同貢獻程式碼和創意。我們相信,在大家的共同努力下,kitexcall 將成為 Kitex 開發者手中的一把利器,讓微服務開發變得更加高效和便捷。訪問 github.com/kitex-contrib/kitexcall 瞭解更多資訊,並加入我們吧!

「專案地址」

GitHub:github.com/cloudwego


0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.