.net6的gRPC

2023 年 4 月 13 日 星期四
5

.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 用于接受不受信任的证书。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...