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分服務端和客戶端,所以新建兩個專案,一個控制臺當作客戶端gRPC_ClientDemo,一個ASP.NET Core 專案當作服務端gRPC_ServerDemo,
先將服務端搞定,添加Grpc.AspNetCore組件
Install-Package Grpc.AspNetCore
然后Startup.cs中添加services.AddGrpc(),
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
}
因為 gRPC 是基于 HTTP/2 來通信的,所以需要在組態檔中添加Kestrel 啟用 HTTP/2 的配置,
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
}
}
gRPC 與傳統的api是不同的,需要我們自己定義proto檔案,gRPC 使用協定優先方法進行 API 開發, 默認情況下,協議緩沖區 (protobuf) 用作介面設計語言 (IDL), *.proto 檔案包含:
- gRPC 服務的定義,
- 在客戶端與服務器之間發送的訊息,
有關 protobuf 檔案的語法的詳細資訊,可以查看官方檔案 (protobuf),
proto檔案在實際開發中肯定會有多個存在,這里有一個技巧就是將proto檔案放在一個檔案夾內,然后利用Protobuf的Link關聯即可,這樣就只用維護一份proto檔案即可,
同時微軟還幫我們提供了dotnet-grpc,.NET Core 全域工具,請運行以下命令:
dotnet tool install -g dotnet-grpc
dotnet-grpc 可以用于將 Protobuf 參考作為 <Protobuf /> 項添加到 .csproj 檔案:
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
具體用法可以查看檔案:https://docs.microsoft.com/zh-cn/aspnet/core/grpc/dotnet-grpc
在解決訪問檔案夾根目錄添加 Proto 檔案夾,新建一個hello.protoproto檔案,將其分別連接到兩個專案中,

現在來開始撰寫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<GreeterService>();
}
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
_logger.LogInformation($"Sending hello to {request.Name}");
return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
}
}
}
HelloService.HelloServiceBase是proto檔案為我們自動生成的類,

呼叫多載方法SayHello(),記錄了一條日志然后回傳客戶端傳進來的欄位name,
在組態檔中將GreeterService服務添加到路由管道中
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
});
endpoints.MapGrpcService<GreeterService>();
});
支持我們服務端完成,啟動服務端拿到啟動地址,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);
}
}
}
啟動服務端和客戶端看看效果,成功發送訊息和獲取訊息,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/35122.html
標籤:.NET Core
上一篇:json 反序列化成表
