在 ASP.NET Core 上啟用 gRPC Reflection

系統功能愈來愈多,自然而然地 proto 檔也就熟變得愈來愈龐大,如果每次想要手動測試 gRPC 功能時都要手 key proto 實在沒效率 (測試工具可以參考之前筆記 使用grpcurl 呼叫gRPC Service),所以測試一下在 ASP.NET Core 上啟用 gRPC Reflection 是否有改善

基本環境

  1. macOS Catalina 10.15.6
  2. docker desktop community 2.3.0.4(46911)
  3. .NET Core SDK 3.1.301
  4. 預設 gRPC Service 專案範本
  5. NuGet packages

    • Grpc.AspNetCore.Server.Reflection 2.31.0

設定方式

  1. 安裝 NuGet package - Grpc.AspNetCore.Server.Reflection

    • .NET CLI

      dotnet add package Grpc.AspNetCore.Server.Reflection
      
    • Package Manager

      Install-Package Grpc.AspNetCore.Server.Reflection
      
  2. 註冊 gRPC reflection

    Startup.csConfigureServices 方法中進行註冊

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
        //註冊 gRPC reflection
        services.AddGrpcReflection();
    }
    
  3. 設定 gRPC reflection 的 mapping

    Startup.csConfigure 方法中進行設定

    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");
                });
        });
    }
    
  4. 實際使用

    • 語法

      grpcurl -plaintext localhost:5000 list
      
    • 範例

      grpcurl -plaintext localhost:5000 list
      
    • 未設定啟用 reflection 錯誤

      • 錯誤訊息

        Failed to list services: server does not support the reflection API
        
      • 錯誤截圖

        1error

    • 成功設定結果

      • 成功訊息

        greet.Greeter
        grpc.reflection.v1alpha.ServerReflection
        
      • 成功截圖

        3success

心得

設定過程很輕鬆寫意,但如果是以一開始需求的出發點(不想手 key proto 檔)來看,在效率的改善上有限,原因是就 grpcurl 的使用方式而言僅能取得 grpc service 而已,無法取得相對應的 message 資訊:grpcurl 透過 reflection 取得 service 名稱,但個別 grpc service 用的 message 還是得要查閱 proto 檔才能正確呼叫 grpc service,不過這個問題可以搭配其他 cli 工具或是選用其他適合的工具,如果有興趣可以參考其他筆記

參考資訊

  1. 使用grpcurl 呼叫gRPC Service
  2. gRPC Server Reflection in the .NET world
  3. 使用 grpc-cli 呼叫 gRPC Service
  4. 使用 dotnet-grpc-cli 取得 gRPC Service 內容