前言
gRPC是一款廣泛應用的rpc框架,因為基於C/S架構,服務啟動之后,需要編寫對應的客戶端才能調用,調試起來相對麻煩一些,這里主要介紹一下如何通過swagger-ui來調試grpc服務。
grpc-swagger
gRPC-swagger 是基於 gRPC 反射開發的一款 gRPC 調試工具,可以使用 swagger-ui 方便地展示和調用 gRPC 方法。因為 gRPC-swagger 是基於反射開發,所以使用時無需修改 proto 及相關的代碼實現,只需在啟動服務時開啟反射功能(不只java,其他語言也可以)。下圖是使用效果
項目地址
使用方法
啟動grpc-swagger服務
grpc-swagger是基於spring boot開發,可以下載jar包直接運行:
wget https://github.com/grpc-swagger/grpc-swagger/releases/latest/download/grpc-swagger.jar
java -jar grpc-swagger.jar
啟動服務時開啟反射
該工具是基於gRPC反射做的,所以需要在啟動服務時開啟反射,下面是java開啟反射的方式:
添加依賴
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-services</artifactId>
<version>${grpc.version}</version>
</dependency>
開啟反射
Server server = ServerBuilder.forPort(SERVER_PORT)
.addService(new HelloServiceImpl())
// 這里開啟反射
.addService(ProtoReflectionService.newInstance())
.build()
.start();
其他語言開啟方式參考GRPC Server Reflection Protocol
注冊服務
因為我們一開始並不知道對應的gRPC服務提供哪些服務方法,所以這里有個注冊服務的過程,其所做的事就是輸入目標服務的地址,然后通過反射來獲取當前gRPC服務提供的服務方法。當前提供一個簡單的頁面,地址是 http://localhost:8080/ui/r.html
,在Endpoint Register里填入grpc 服務的地址,成功注冊之后會在 Services 里列出可用的服務
使用 swagger-ui 調用gRPC服務
下面就比較簡單了,通過鏈接跳過來就是一個swagger-ui的頁面,點擊 Try it out 就可以開始調試了。
實現原理
這里說下大概的實現原理:
- gRPC 提供了反射的功能,通過反射,我們可以實現獲取服務的定義、動態的調用gRPC方法、JSON和PB相互轉換等功能,這里的實現主要是利用了這個功能。
- Swagger-ui 也提供了文檔的格式規范,我們將獲取到的gRPC服務定義轉換成swagger-ui需要的格式,就可以使用swagger-ui來進行服務定義的展示和調用了。
如果還有興趣的同學,可以去看下源碼。