擼了一個可除錯 gRPC 的 GUI客戶端

語言: CN / TW / HK

前言

平時大家寫完 gRPC 介面後是如何測試的?往往有以下幾個方法:

寫單測程式碼,自己模擬客戶端測試。

可以搭一個 gRPC-Gateway 服務,這樣就可以在 postman 中進行模擬。

但這兩種方法都不是特別優雅;第一種方法當請求結構體巢狀特別複雜時,在程式碼中維護起來就不是很直觀;而且程式碼會特別長。

第二種方法在 postman 中與請求 HTTP 介面一樣,看起來非常直觀;但需要額為維護一個 gRPC-Gateway 服務,同時介面定義發生變化時也得重新發布,使用起來稍顯複雜。

於是我經過一番搜尋找到了兩個看起來還不錯的工具:

  • BloomRPC
  • https://github.com/fullstorydev/grpcui

首先看 BloomRPC 頁面美觀,功能也很完善;但卻有個非常難受的地方,那就是不支援 int64 資料的請求, 會有精度問題。

這裡我寫了一個簡單的介面,直接將請求的 int64 返回回來。

func (o *Order) Create(ctx context.Context, in *v1.OrderApiCreate) (*v1.Order, error) { 
 fmt.Println(in.OrderId) 
 return &v1.Order{ 
  OrderId: in.OrderId, 
  Reason:  nil, 
 }, nil 
} 

會發現服務端收到的資料精度已經丟失了。

這個在我們大量使用 int64 的業務中非常難受,大部分介面都沒法用了。

grpcui 是我在使用了 BloomRPC 一段時間之後才發現的工具,功能也比較完善; BloomRPC 中的精度問題也不存在。

但由於我之前已經習慣了在 BloomRPC 中去除錯介面,加上日常開發過程中我的瀏覽器幾乎都是開了幾十個 tap 頁面,導致在其中找到 grpcui 不是那麼方便。

所以我就想著能不能有一個類似於 BloomRPC 的獨立 APP,也支援 int64 的工具。

準備

找了一圈,貌似沒有發現。恰好前段時間寫了一個 gRPC 的壓測工具,其實已經把該 APP 需要的核心功能也就是泛化呼叫實現了。

由於核心能力是用 Go 實現的,所以這個 APP 最好也是用 Go 來寫,這樣複用程式碼會更方便一些;正好也想看看用 Go 來實現 GUI 應用效果如何。

但可惜 Go 並沒有提供原生的 GUI 庫支援,最後翻來找去發現了一個庫:fyne

從 star 上看用的比較多,同時也支援跨平臺打包;所以最終就決定使用該庫在構建這個應用。

核心功能

整個 App 的互動流程我參考了 BloomRPC ,但作為一個不懂審美、設計的後端開發來說,整個過程中最難的就是佈局了。

這是我花了好幾個晚上調試出來的第一版頁面,雖然也能用但檢視請求和響應資料非常不方便。

於是又花了一個週末最終版如下(乍一看貌似沒區別):

雖然頁面上與 BloomRPC 還有一定差距,但也不影響使用;關鍵是 int64 的問題解決了;又可以愉快的擼碼了。

安裝

有類似需求也想體驗的朋友可以在這裡下載使用:https://github.com/crossoverJie/ptg/releases/download/0.0.2/ptg-mac-gui.tar

由於我手上暫時沒有 Windows 電腦,所以就沒有打包 exe 程式;有相關需求的朋友可以自行下載原始碼編譯:

git clone [email protected]:crossoverJie/ptg.git 
cd ptg 
make pkg-win 

後續計劃

當前版本的功能還比較簡陋,只支援常用的 unary 呼叫;後續也會逐步加上 stream、metadata、工作空間的儲存與還原等支援。

對頁面、互動有建議也歡迎提出。

原本是準備上傳到 brew 方便安裝的,結果折騰了一晚上因為資料不夠被拒了,所以對大家有幫助或者感興趣的話幫忙點點關注(咋有種直播帶貨的感覺??)

原始碼地址:https://github.com/crossoverJie/ptg