.NET 上的 gRPC 概觀

作者:James Newton-King

gRPC 是不限於語言的高效能遠端程序呼叫 (RPC) 架構。

gRPC 的主要優點包括:

  • 新式高效能輕量型的 RPC 架構。
  • 根據預設使用 Protocol Buffers 的合約優先式 API 開發,使您得以進行不限於語言的實作。
  • 適用於多種語言的工具,可產生強型別伺服器及用戶端。
  • 支援用戶端、伺服器及雙向資料流呼叫。
  • 透過 Protobuf 二進位序列化減少網路使用量。

這些優點讓 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 套件。
  • .proto 檔案新增至 <Protobuf> 項目群組。
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

如需 gRPC 工具支援的相關詳細資訊,請參閱使用 C# 的 gRPC 服務

ASP.NET Core 上的 gRPC 服務

gRPC 服務可以裝載於 ASP.NET Core。 服務與 ASP.NET Core 功能 (例如記錄、相依性插入 (DI)、驗證和授權) 完整整合。

將 gRPC 服務新增至 ASP.NET Core 應用程式

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
        });
    }
}

GreeterService 繼承自 GreeterBase 類型,這是從 .proto 檔案中的 Greeter 服務所產生。 服務可在 Program.cs 中供用戶端存取:

app.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 架構。
  • 根據預設使用 Protocol Buffers 的合約優先式 API 開發,使您得以進行不限於語言的實作。
  • 適用於多種語言的工具,可產生強型別伺服器及用戶端。
  • 支援用戶端、伺服器及雙向資料流呼叫。
  • 透過 Protobuf 二進位序列化減少網路使用量。

這些優點讓 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 套件。
  • .proto 檔案新增至 <Protobuf> 項目群組。
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

如需 gRPC 工具支援的相關詳細資訊,請參閱使用 C# 的 gRPC 服務

ASP.NET Core 上的 gRPC 服務

gRPC 服務可以裝載於 ASP.NET Core。 服務與 ASP.NET Core 功能 (例如記錄、相依性插入 (DI)、驗證和授權) 完整整合。

將 gRPC 服務新增至 ASP.NET Core 應用程式

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
        });
    }
}

GreeterService 繼承自 GreeterBase 類型,這是從 .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 服務

其他資源