使用 gRPC 和 .NET7 构建高性能服务

发表于:2023-1-12 09:07

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:启辰8    来源:今日头条

  .NET 7 正式推出标准期限支持,支持期限为 18 个月。 其中包括许多令人兴奋的新功能,包括 Web API、gRPC、ASP.NET 和 C#11 的性能升级。
  除了讨论 .NET 7 中 gRPC 的新特性,我们还将实现一个能够在一分钟内流式传输 500 万条记录的真实微服务。
  这是一个快速回顾:
  gRPC 是由 CNCF 开发的流行的开源 RPC 框架。
  作为契约优先、独立于语言的框架,客户端和服务器必须就消息的内容和传递方式达成一致,契约在 .proto 文件中定义,然后使用 .NET7 的工具生成代码。
  在单个 tcp 连接上,HTTP/2 支持多路复用,您可以同时发送多个请求。
  此外,gRPC 支持数据流,其中服务器可以同时向客户端发送多个响应,反之亦然。
  .NET 7 中有哪些新功能?
  1、性能改进
  为了让 gRPC 支持多路复用,HTTP/2 是必需的。 但是,Kestrel 的 HTTP/2 实现存在一个已知问题,该问题会在连接繁忙时通过 HTTP/2 写入响应时出现瓶颈。 当您在同一个 TCP 连接上同时运行多个请求,但一次只有一个线程能够写入该连接时,就会发生这种情况。 这是通过 .NET 6 中的线程锁完成的,这会导致锁争用。
  NET 7 使用一种巧妙的方法来解决此瓶颈,即实现一个队列,该队列会在写入完成时通知所有其他线程,让它们等待写入完成。 因此,性能大大提升,CPU资源得到更好的利用——不再需要争锁。
  .NET gRPC 团队的基准测试表明服务器流式处理提高了 800%。
  .NET 6–0.5M RPS
  .NET 7–4.5M RPS
  HTTP/2 上传速度
  通过增加缓冲区大小可将延迟减少 600%。 与 .NET 6 相比,.NET 7 将上传 100MB 文件的时间从 26.9 秒减少到 4.3 秒。
  .NET 7 gRPC 的性能现在超过了 Rust、Go 和 C++ 等流行框架。
  2、gRPC JSON转码
  .NET7 为 ASP.NET Core gRPC 提供了扩展,以使 gRPC 服务能够作为 RESTful Web 服务公开。 您现在可以通过 HTTP 调用 gRPC 方法而无需任何重复。
  gRPC JSON 转码支持:
  ·HTTP 动词
  · URL参数绑定
  · JSON请求/响应
  在此扩展中,HTTP 动词通过使用 protobuf 注释的概念映射到 gRPC 服务,扩展在 ASP.NET Core 应用程序中运行,然后将 JSON 反序列化为 protobuf 消息并直接调用 gRPC 服务,而不必编写自己的 gRPC 客户端应用程序。
  我们将在下一节中研究如何实现它。
  3、开放API规范
  现在有一个 Open API 规范,用于 .NET 7 中的 gRPC JSON 转码,使用以下 Nuget 包:
  https://www.nuget.org/packages/Microsoft.AspNetCore.Grpc.Swagger?
  4、 Azure 应用服务支持
  最后但同样重要的是,Azure 应用服务现在完全支持 gRPC。 这是在 .NET 中使用 gRPC 构建和部署高性能服务的一大进步。
  现在我们已经完成了讨论,让我们实现 gRPC 并看看新功能是什么样的。
  先决条件:
  ·下载并安装 .NET 7 SDK
  · Visual Studio 2022 17.4+
  我们需要做的第一件事是启动 Visual Studio 并创建一个新项目。 选择“ASP.NET Core gRPC 服务”,这将创建一个示例 hello world gRPC 服务。
  确保选择了 .NET7。
  这将分别在 protos 和服务文件夹中的 GreeterService 中创建一个随时可用的 gRPC 应用程序。
  这是一个用作契约的 greeting.proto 文件,定义了客户端将接收的消息和服务。
  syntax = "proto3";
  option csharp_namespace = "gRPCUsingNET7Demo";
  package greet;
  // The greeting service definition.
  service Greeter {
    // Sends a greeting
    rpc SayHello (HelloRequest) returns (HelloReply);
  }
  // The request message containing the user's name.
  message HelloRequest {
    string name = 1;
  }
  // The response message containing the greetings.
  message HelloReply {
    string message = 1;
  }
  契约可以被认为是接口,这些接口的实现将由服务定义,在我们的例子中是 GreeterService.cs——这个文件将描述契约的实现。
  GreeterService 类是一个标准的 C# 类,它向响应返回 hello。 protobuf 的实际实现是通过代码生成实现的,并使用 GreeterBase 抽象出来。 如果您想确切地知道引擎下发生了什么,您可以转到 GreeterBase,您会在那里找到所有底层细节。
  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)
          {
              return Task.FromResult(new HelloReply
              {
                  Message = "Hello " + request.Name
              });
          }
      }
  代码生成是 .NET 7 的一项不错的功能,它允许您生成服务器端和客户端 gRPC 代码。 通过设置代码生成设置,可以更改 .CS 项目文件中代码生成过程的行为(例如从服务器到客户端)。
    <ItemGroup>
      <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
    </ItemGroup>
  让我们启动 Kestral 并在打开应用程序后在浏览器中浏览 gRPC 端点。
  我们无法通过网络访问我们的 gRPC 服务,因为它需要使用 gRPC 客户端。 但是,我们不需要使用 gRPC 客户端,而是使用流行的测试工具 Postman 对其进行测试。 它最近在其功能中添加了对 gRPC 请求的支持。
  第一步是打开 Postman 并创建一个新的 gRPC 请求。
  请在下面的框中输入服务器地址(您的应用程序运行的地址)。 例如,https://localhost:7211。
  Postman目前不了解我们的服务如何运作,因此我们有几个选择。 一种是导入 .proto 文件或使用称为“服务器反射”的东西。 它可以被认为是 gRPC 调用的 OpenAPI 规范。
  在 gRPC 服务中启用服务器反射。
  按照以下步骤启用服务器反射非常简单。
  下载并安装以下 nuget 包:
  Install-Package Grpc.AspNetCore.Server.Reflection -Version 2.49.0
  2、在Program.cs文件中,需要注册如下服务,并将该服务映射到我们的http管道中,如下:
  builder.Services.AddGrpcReflection();
  app.MapGrpcReflectionService();
  现在我们已经完成了所有这些前置需求,让我们回到 Postman,再次运行应用程序。
  我们可以看到我们的 greet.greeter 服务和它的 SayHello 方法。
  可以通过单击带有 JSON 正文(将由 Postman 转换为 protobuf)的 Invoke 按钮来调用此端点。
  在 49 毫秒内得到了服务器响应。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号