.NET 上的 gRPC 概觀

作者 :James Newton-King

gRPC 與 RPC) 架構無關、高效能的遠端過程呼叫 (。

gRPC 的主要優點包括:

  • 新式高效能輕量型的 RPC 架構。
  • 根據預設使用 Protocol Buffers 的合約優先式 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 套件。
  • 將檔案新增 .proto<Protobuf> 專案群組。
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

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

ASP.NET Core 上的 gRPC 服務

gRPC 服務可以裝載在 ASP.NET Core 上。 服務與 ASP.NET 核心功能完全整合,例如記錄、相依性插入 (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 型別,這是從 Greeter 檔案中的 .proto 服務產生的。 服務可供用戶端 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 非常適合:

  • 首重效率的輕量型微服務。
  • 必須使用多種語言進行開發的多語言系統。
  • 必須處理資料流要求或回應的點對點即時服務。

警告

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 套件。
  • 將檔案新增 .proto<Protobuf> 專案群組。
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

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

ASP.NET Core 上的 gRPC 服務

gRPC 服務可以裝載在 ASP.NET Core 上。 服務與 ASP.NET 核心功能完全整合,例如記錄、相依性插入 (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 型別,這是從 Greeter 檔案中的 .proto 服務產生的。 服務可供用戶端 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 服務

其他資源