.NET の gRPC の概要

作成者: James Newton-King

gRPC は言語に依存しない高性能なリモート プロシージャ コール (RPC) フレームワークです。

gRPC の主な利点:

  • 最新の高性能軽量 RPC フレームワーク。
  • 既定でプロトコル バッファーを使用する契約優先の API 開発。言語に依存しない実装を可能にします。
  • 厳密に型指定されたサーバーとクライアントを生成する目的で、さまざまな言語で利用できるツール。
  • クライアント、サーバー、双方向ストリーミング呼び出しをサポートします。
  • Protobuf バイナリ シリアル化でネットワークの使用率を減らします。

以上の利点から gRPC は以下に最適です。

  • 効率性が重要となる軽量のマイクロサービス。
  • 開発に複数の言語が必要になる多言語システム。
  • ストリーミングの要求または応答を処理する必要があるポイントツーポイントのリアルタイム サービス。

警告

ASP.NET Core gRPC には、Azure App Service または IIS と共に使用するための追加の要件があります。 gRPCを使用できる場所の詳細については、「.NET での gRPC でサポートされているプラットフォーム」を参照してください。

.proto ファイルに対する C# ツール サポート

gRPC では、API 開発に対してコントラクト優先のアプローチが使われます。 サービスとメッセージは、 *.proto ファイル内で定義されます。

syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

サービス、クライアント、およびメッセージの .NET 型は、プロジェクトに *.proto ファイルを含めることで自動的に生成されます。

  • Grpc.Tools パッケージにパッケージ参照を追加します。
  • <Protobuf> 項目グループに *.proto ファイルを追加します。
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

gRPC ツール サポートについて詳しくは、「C# を使用した gRPC サービス」をご覧ください。

ASP.NET Core での gRPC サービス

gRPC サービスは ASP.NET Core でホストできます。 サービスは、ログ、依存関係の注入 (DI)、認証、認可などの ASP.NET Core 機能と完全に統合されています。

ASP.NET Core アプリに gRPC サービスを追加する

gRPC には Grpc. AspNetCore パッケージが必要です。 .NET アプリでの gRPC の構成の詳細については、「gRPC を構成する」を参照してください。

gRPC サービス プロジェクト テンプレート

ASP.NET Core gRPC サービス のプロジェクト テンプレートには、スターター サービスが用意されています。

public class GreeterService : Greeter.GreeterBase
{
    private readonly ILogger<GreeterService> _logger;

    public GreeterService(ILogger<GreeterService> logger)
    {
        _logger = logger;
    }

    public override Task<HelloReply> SayHello(HelloRequest request,
        ServerCallContext context)
    {
        _logger.LogInformation("Saying hello to {Name}", request.Name);
        return Task.FromResult(new HelloReply 
        {
            Message = "Hello " + request.Name
        });
    }
}

GreeterServiceGreeterBase 型を継承します。これは *.proto ファイル内の Greeter サービスから生成されます。 サービスは、Program.cs 内でクライアントがアクセスできるようになります。

app.UseEndpoints(endpoints =>
{
    endpoints.MapGrpcService<GreeterService>();
});

ASP.NET Core での gRPC サービスについて詳しくは、「ASP.NET Core を使用した gRPC サービス」をご覧ください。

.NET クライアントを使用して gRPC サービスを呼び出す

gRPC クライアントは、 *.proto ファイルから生成される具象的なクライアントの種類です。 具象 gRPC クライアントには、 *.proto ファイル内の gRPC サービスに変換するためのメソッドが含まれます。

var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);

var response = await client.SayHelloAsync(
    new HelloRequest { Name = "World" });

Console.WriteLine(response.Message);

gRPC クライアントはチャネルを使って作成され、これは gRPC サービスへの長期接続を表します。 チャネルは GrpcChannel.ForAddress を使って作成できます。

クライアントの作成と、さまざまなサービス メソッドの呼び出しについて詳しくは、「.NET クライアントを使用して gRPC サービスを呼び出す」をご覧ください。

その他の技術情報

gRPC は言語に依存しない高性能なリモート プロシージャ コール (RPC) フレームワークです。

gRPC の主な利点:

  • 最新の高性能軽量 RPC フレームワーク。
  • 既定でプロトコル バッファーを使用する契約優先の API 開発。言語に依存しない実装を可能にします。
  • 厳密に型指定されたサーバーとクライアントを生成する目的で、さまざまな言語で利用できるツール。
  • クライアント、サーバー、双方向ストリーミング呼び出しをサポートします。
  • Protobuf バイナリ シリアル化でネットワークの使用率を減らします。

以上の利点から gRPC は以下に最適です。

  • 効率性が重要となる軽量のマイクロサービス。
  • 開発に複数の言語が必要になる多言語システム。
  • ストリーミングの要求または応答を処理する必要があるポイントツーポイントのリアルタイム サービス。

警告

ASP.NET Core gRPC には、Azure App Service または IIS と共に使用するための追加の要件があります。 gRPCを使用できる場所の詳細については、「.NET での gRPC でサポートされているプラットフォーム」を参照してください。

.proto ファイルに対する C# ツール サポート

gRPC では、API 開発に対してコントラクト優先のアプローチが使われます。 サービスとメッセージは、 *.proto ファイル内で定義されます。

syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

サービス、クライアント、およびメッセージの .NET 型は、プロジェクトに *.proto ファイルを含めることで自動的に生成されます。

  • Grpc.Tools パッケージにパッケージ参照を追加します。
  • <Protobuf> 項目グループに *.proto ファイルを追加します。
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

gRPC ツール サポートについて詳しくは、「C# を使用した gRPC サービス」をご覧ください。

ASP.NET Core での gRPC サービス

gRPC サービスは ASP.NET Core でホストできます。 サービスは、ログ、依存関係の注入 (DI)、認証、認可などの ASP.NET Core 機能と完全に統合されています。

ASP.NET Core アプリに gRPC サービスを追加する

gRPC には Grpc. AspNetCore パッケージが必要です。 .NET アプリでの gRPC の構成の詳細については、「gRPC を構成する」を参照してください。

gRPC サービス プロジェクト テンプレート

gRPC サービスのプロジェクト テンプレートには、スターター サービスが用意されています。

public class GreeterService : Greeter.GreeterBase
{
    private readonly ILogger<GreeterService> _logger;

    public GreeterService(ILogger<GreeterService> logger)
    {
        _logger = logger;
    }

    public override Task<HelloReply> SayHello(HelloRequest request,
        ServerCallContext context)
    {
        _logger.LogInformation("Saying hello to {Name}", request.Name);
        return Task.FromResult(new HelloReply 
        {
            Message = "Hello " + request.Name
        });
    }
}

GreeterServiceGreeterBase 型を継承します。これは *.proto ファイル内の Greeter サービスから生成されます。 サービスは、Startup.cs 内でクライアントがアクセスできるようになります。

app.UseEndpoints(endpoints =>
{
    endpoints.MapGrpcService<GreeterService>();
});

ASP.NET Core での gRPC サービスについて詳しくは、「ASP.NET Core を使用した gRPC サービス」をご覧ください。

.NET クライアントを使用して gRPC サービスを呼び出す

gRPC クライアントは、 *.proto ファイルから生成される具象的なクライアントの種類です。 具象 gRPC クライアントには、 *.proto ファイル内の gRPC サービスに変換するためのメソッドが含まれます。

var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);

var response = await client.SayHelloAsync(
    new HelloRequest { Name = "World" });

Console.WriteLine(response.Message);

gRPC クライアントはチャネルを使って作成され、これは gRPC サービスへの長期接続を表します。 チャネルは GrpcChannel.ForAddress を使って作成できます。

クライアントの作成と、さまざまなサービス メソッドの呼び出しについて詳しくは、「.NET クライアントを使用して gRPC サービスを呼び出す」をご覧ください。

その他の技術情報