gRPC

gRPC[13](gRPC远程过程调用)是Google开发的开源远程过程调用系统。它有点像REST,它提供了一种将请求从客户端发送到服务器的方式。但这在许多方面都不同,这是相同点和不同点:

  • 像REST一样,gRPC与语言无关。有适用于所有流行语言的工具,包括C#。
  • gRPC是契约的基础,并使用.proto文件来定义契约。这有点类似于Swaggerswagger.json和ReFit的共享界面。可以从那些文件中生成任何编程语言的客户端。
  • gRPC使用协议缓冲区(Protobuf)[14]二进制序列化。这与REST(通常序列化为JSON或XML)不同。二进制序列化较小,因此更快。
  • gRPC用于使用HTTP / 2协议创建持久连接。该协议更简单,更紧凑。REST使用HTTP 1.x协议(通常为HTTP 1.1)。
  • HTTP 1.1要求每个请求都进行TCP握手,而HTTP / 2则保持连接打开。
  • HTTP / 2连接使用多路复用流。这意味着单个TCP连接可以支持许多流。这些流可以并行执行,而不必像HTTP 1.1中那样互相等待。
  • gRPC允许双向流。

有两种使用gRPC的方法。对于.NET Core 3.0,有一个完全托管的库,称为.NET的gRPC[15]。对于其中的任何内容,您都可以使用gRPC C#[16],它是使用本机代码构建的。这并不意味着适用于.NET的gRPC可以替代gRPC C#。让我们来看一个用于.NET的更新gRPC的示例。

.NET的gRPC的服务器端

  • 这不是教程,而是更多有关预期内容的一般性想法。这是示例控制器在gRPC中的外观:
  1. public class GreeterService : Greeter.GreeterBase
  2. {
  3. public override Task<HelloReply> SayHello(HelloRequest request,
  4. ServerCallContext context)
  5. {
  6. _logger.LogInformation("Saying hello to {Name}", request.Name);
  7. return Task.FromResult(new HelloReply
  8. {
  9. Message = "Hello " + request.Name
  10. });
  11. }
  12. }
  • 您需要添加以下的Configure在Startup.cs:
  1. app.UseEndpoints(endpoints =>
  2. {
  3. endpoints.MapGrpcService<GreeterService>();
  4. });
  • API在.proto文件中描述,该文件是项目的一部分:
  1. syntax = "proto3";
  2. service Greeter {
  3. rpc SayHello (HelloRequest) returns (HelloReply);
  4. }
  5. message HelloRequest {
  6. string name = 1;
  7. }
  8. message HelloReply {
  9. string message = 1;
  10. }
  • 此.proto文件添加到.csproj:
  1. <ItemGroup>
  2. <Protobuf Include="Protos\greet.proto" />
  3. </ItemGroup>

.NET的gRPC客户端

  • 客户端是从.proto文件生成的。代码本身非常简单:
  1. var channel = GrpcChannel.ForAddress("https://localhost:5001");
  2. var client = new Greeter.GreeterClient(channel);
  3. var response = await client.SayHello(
  4. new HelloRequest { Name = "World" });
  5. Console.WriteLine(response.Message);