文章目錄
在 ASP.NET Core 上啟用 gRPC Reflection
系統功能愈來愈多,自然而然地 proto 檔也就熟變得愈來愈龐大,如果每次想要手動測試 gRPC 功能時都要手 key proto 實在沒效率 (測試工具可以參考之前筆記 使用grpcurl 呼叫gRPC Service),所以測試一下在 ASP.NET Core 上啟用 gRPC Reflection 是否有改善
基本環境
- macOS Catalina 10.15.6
- docker desktop community 2.3.0.4(46911)
- .NET Core SDK 3.1.301
- 預設 gRPC Service 專案範本
NuGet packages
- Grpc.AspNetCore.Server.Reflection 2.31.0
設定方式
安裝 NuGet package -
Grpc.AspNetCore.Server.Reflection
.NET CLI
dotnet add package Grpc.AspNetCore.Server.Reflection
Package Manager
Install-Package Grpc.AspNetCore.Server.Reflection
註冊 gRPC reflection
在
Startup.cs
的ConfigureServices
方法中進行註冊public void ConfigureServices(IServiceCollection services) { services.AddGrpc(); //註冊 gRPC reflection services.AddGrpcReflection(); }
設定 gRPC reflection 的 mapping
在
Startup.cs
的Configure
方法中進行設定public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapGrpcService<GreeterService>(); // 設定啟用 gRPC reflection endpoints.MapGrpcReflectionService(); endpoints.MapGet("/", async context => { await context.Response.WriteAsync( "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); }); }); }
實際使用
語法
grpcurl -plaintext localhost:5000 list
範例
grpcurl -plaintext localhost:5000 list
未設定啟用 reflection 錯誤
錯誤訊息
Failed to list services: server does not support the reflection API
錯誤截圖
成功設定結果
成功訊息
greet.Greeter grpc.reflection.v1alpha.ServerReflection
成功截圖
心得
設定過程很輕鬆寫意,但如果是以一開始需求的出發點(不想手 key proto 檔)來看,在效率的改善上有限,原因是就 grpcurl 的使用方式而言僅能取得 grpc service 而已,無法取得相對應的 message 資訊:grpcurl 透過 reflection 取得 service 名稱,但個別 grpc service 用的 message 還是得要查閱 proto 檔才能正確呼叫 grpc service,不過這個問題可以搭配其他 cli 工具或是選用其他適合的工具,如果有興趣可以參考其他筆記
參考資訊
文章作者 Yowko Tsai
上次更新 2020-12-11
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。