.net6的gRPC
gRPC 是一种高性能,跨语言的远程过程调用 (RPC) 框架,由 Google 开源,基于底层 HTTP/2 协议标准和协议层 Protobuf 序列化协议开发,适用于高性能轻量级微服务,需要多种语言用于开发的 Polyglot 系统,需要处理流式处理请求或响应的点对点实时服务。gRPC 通过定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型),在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用,客户端则拥有一个存根能够像服务端一样的方法。下面将详细介绍 .NET 6 中的 gRPC 使用。
Protobuf 序列化机制
Protobuf 是 gRPC 使用的默认序列化机制,相比于 JSON,Protobuf 格式的数据更小,网络传输速度更快。在 .NET 6 中,可以使用以下代码定义一个消息类型:
message HelloRequest {
string name = 1;
}
在 .NET 6 中,需要使用 Grpc.Tools
NuGet 包来编译 .proto 文件,生成 C# 代码。在 Visual Studio 中,可以通过右键单击 .proto 文件,选择“属性”,在“生成操作”中选择“GrpcServices”来生成 C# 代码。在命令行中,可以使用以下命令来生成 C# 代码:
cmd
dotnet grpc compile --grpc-root .\protos\ --output .\generated\ .\protos\hello.proto
在生成的 C# 代码中,可以使用以下代码来创建一个消息:
csharp
var request = new HelloRequest
{
Name = "World"
};
gRPC 服务器
在 .NET 6 中,可以使用以下代码来创建一个 gRPC 服务器:
csharp
using var server = new Server
{
Services = { Greeter.BindService(new GreeterService()) },
Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
};
server.Start();
其中 Greeter
是定义在 .proto 文件中的服务类型,GreeterService
是实现服务的类。在 GreeterService
类中,需要实现 GreeterBase
类中定义的所有方法。例如,以下代码实现了 SayHello
方法:
csharp
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
gRPC 客户端
在 .NET 6 中,可以使用以下代码来创建一个 gRPC 客户端:
csharp
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest { Name = "World" });
Console.WriteLine("Greeting: " + reply.Message);
其中 Greeter
是定义在 .proto 文件中的服务类型,SayHelloAsync
是服务中定义的一个方法。
HTTPS 调用
在 .NET 6 中,可以通过以下代码来进行 gRPC 服务的 HTTPS 调用:
csharp
using var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
HttpHandler = new HttpClientHandler
{
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
}
});
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest { Name = "World" });
Console.WriteLine("Greeting: " + reply.Message);
其中 HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
用于接受不受信任的证书。