.NET CoreでのgRPCの使用


gRPCは言語に関係のない高性能リモートプロシージャ呼び出し(RPC)フレームワークである.
  • https://grpc.io/docs/guides/
  • https://github.com/grpc/grpc-dotnet
  • https://docs.microsoft.com/zh-cn/aspnet/core/grpc


  • gRPCの主な利点
  • 現代高性能軽量級RPCフレームワーク.
  • 協定優先API開発は、デフォルトでプロトコルバッファを使用し、言語に関係のない実装を許可する.
  • は、強力なタイプのサーバおよびクライアントを生成するために、複数の言語のツールで使用することができる.
  • は、クライアント、サーバ、および双方向ストリーム処理呼び出しをサポートします.
  • Protobufバイナリシーケンス化を使用して、ネットワークの使用を削減します.


  • これらの利点はgRPCを
  • 効率が重要な軽量レベルのマイクロサービス.
  • は、開発のために複数の言語を必要とするPolyglotシステムである.
  • は、ストリーミング処理要求または応答を処理するポイント・ツー・ポイント・リアルタイム・サービスを必要とする.

  • gRPCは今とても簡単です.NET CoreとASP.NET Coreで使用され、すでにオープンソースであり、現在はマイクロソフトの公式ASP.NETプロジェクトの人員はメンテナンスを行い、良好なアクセスを行う.NET Coreエコ.
    次に、gRPCの使用方法について説明する、gRPCを使用するために必要である.NET Core 3.1以上のSDKサポート.gRPCはサービス側とクライアントに分かれているので、2つのプロジェクトを新設し、1つのコンソールはクライアントgRPC_ClientDemo、1つのASPとして使用する.NET Coreプロジェクトは、サービス端末gRPC_ServerDemoとして使用される.
    まずサービス側を完了し、Grpc.AspNetCoreコンポーネントを追加します.
    Install-Package Grpc.AspNetCore
    

    次いで、Startup.csservices.AddGrpc()が追加される.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
    }
    

    gRPCはHTTP/2に基づいて通信するため、構成ファイルにKestrelを追加してHTTP/2を有効にする構成が必要です.
    {
      "Kestrel": {
        "EndpointDefaults": {
          "Protocols": "Http2"
        }
      }
    }
    

    gRPCは従来のapiとは異なり,protoファイルを独自に定義する必要があり,gRPCは協定優先手法を用いてAPI開発を行う.デフォルトでは、プロトコルバッファはインタフェース設計言語(IDL)として使用されます.*protoファイルには次のものが含まれます.
  • gRPCサービスの定義.
  • クライアントとサーバとの間で送信されるメッセージ.

  • protobufファイルの構文の詳細については、公式ドキュメント(protobuf)を参照してください.protoファイルは実際の開発では必ず複数存在しますが、ここではprotoファイルを1つのフォルダに入れ、ProtobufLink関連を利用すれば、protoファイルを1つ維持するだけでよいというテクニックがあります.
    マイクロソフトはdotnet-grpcを提供してくれましたNET Coreグローバルツール、次のコマンドを実行します.
    dotnet tool install -g dotnet-grpc
    
    dotnet-grpcは、Protobuf参照を項として追加するために用いることができる.csprojファイル:
    
    

    詳細については、次の文書を参照してください.https://docs.microsoft.com/zh-cn/aspnet/core/grpc/dotnet-grpc
    解決アクセスフォルダルートディレクトリにProtoフォルダを追加し、hello.proto protoファイルを新規作成し、2つのプロジェクトにそれぞれ接続します.
    .NET Core 下使用 gRPC_第1张图片 hello.protoの作成を開始し、SayHelloメソッドを追加します.
    syntax = "proto3";
    
    package hello; //    
    
    //     
    service HelloService {
        //      SayHello   
        rpc SayHello (HelloRequest) returns (HelloReply);
    }
    
    message HelloRequest {
        string name = 1;
    }
    
    message HelloReply {
        string message = 1;
    }
    

    その後、このサービスを実装し、GreeterService.csをサービス側に追加する.
    using Grpc.Core;
    using Hello;
    using Microsoft.Extensions.Logging;
    using System.Threading.Tasks;
    
    namespace gRPC_ServerDemo.Services
    {
        public class GreeterService : HelloService.HelloServiceBase
        {
            private readonly ILogger _logger;
    
            public GreeterService(ILoggerFactory loggerFactory)
            {
                _logger = loggerFactory.CreateLogger();
            }
    
            public override Task SayHello(HelloRequest request, ServerCallContext context)
            {
                _logger.LogInformation($"Sending hello to {request.Name}");
    
                return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
            }
        }
    }
    
    HelloService.HelloServiceBaseは、protoファイルが自動的に生成するクラスです.
    .NET Core 下使用 gRPC_第2张图片
    リロードメソッドSayHello()が呼び出され、ログが記録され、クライアントから送信されたフィールドnameに戻る.
    構成ファイルでGreeterServiceサービスをルーティングパイプに追加
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGet("/", async context =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    
        endpoints.MapGrpcService();
    });
    

    サービス側の完了をサポートし、サービス側を起動して起動アドレスを取得します.https://localhost:5001.
    次に、クライアント構成アドレスに行って、私たちが書いたサービスを呼び出します.開始する前に、クライアントソリューションで次のnugetパッケージを参照する必要があります.
    Install-Package Grpc.Net.Client
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools
    
    using Grpc.Net.Client;
    using Hello;
    using System;
    using System.Threading.Tasks;
    
    namespace gRPC_ClientDemo
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                using var channel = GrpcChannel.ForAddress("https://localhost:5001");
    
                var client = new HelloService.HelloServiceClient(channel);
    
                await UnaryCallExample(client);
            }
    
            private static async Task UnaryCallExample(HelloService.HelloServiceClient client)
            {
                var reply = await client.SayHelloAsync(new HelloRequest { Name = "  Plus" });
    
                Console.WriteLine("Greeting: " + reply.Message);
            }
        }
    }
    

    サービス側とクライアントを起動して効果を見て、メッセージの送信とメッセージの取得に成功しました.
    .NET Core 下使用 gRPC_第3张图片