快捷搜索:

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

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

  除了讨论 .NET 7 中 gRPC 的新特性,我们还将实现一个能够在一分钟内流式传输 500 万条记录的真实微服务。

  为了让 gRPC 支持多路复用,HTTP/2 是必需的。 但是,Kestrel 的 HTTP/2 实现存在一个已知问题,该问题会在连接繁忙时通过 HTTP/2 写入响应时出现瓶颈。 当您在同一个 TCP 连接上同时运行多个请求,但一次只有一个线程能够写入该连接时,就会发生这种情况。 这是通过 .NET 6 中的线程锁完成的,这会导致锁争用。

  NET 7 使用一种巧妙的方法来解决此瓶颈,即实现一个队列,该队列会在写入完成时通知所有其他线程,让它们等待写入完成。 因此,性能大大提升,CPU资源得到更好的利用——不再需要争锁。

  在此扩展中,HTTP 动词通过使用 protobuf 注释的概念映射到 gRPC 服务,扩展在 ASP.NET Core 应用程序中运行,然后将 JSON 反序列化为 protobuf 消息并直接调用gRPC 服务,而不必编写自己的 gRPC 客户端应用程序。

  最后但同样重要的是,Azure 应用服务现在完全支持 gRPC。 这是在 .NET 中使用 gRPC 构建和部署高性能服务的一大进步。

  契约可以被认为是接口,这些接口的实现将由服务定义,在我们的例子中是 GreeterService.cs——这个文件将描述契约的实现。

  GreeterService 类是一个标准的 C# 类,它向响应返回 hello。 protobuf 的实际实现是通过代码生成实现的,并使用 GreeterBase 抽象出来。 如果您想确切地知道引擎下发生了什么,您可以转到 GreeterBase,您会在那里找到所有底层细节。

  代码生成是7 的一项不错的功能,它允许您生成服务器端和客户端 gRPC 代码。 通过设置代码生成设置,可以更改 .CS 项目文件中代码生成过程的行为(例如从服务器到客户端)。

  我们无法通过网络访问我们的 gRPC 服务,因为它需要使用 gRPC 客户端。 但是常用asp代码大全下载安装苹果版本,我们不需要使用 gRPC 客户端asp学习,而是使用流行的测试工具 Postman 对其进行测试。 它最近在其功能中添加了对 gRPC 请求的支持。

  Postman目前不了解我们的服务如何运作,因此我们有几个选择。 一种是导入 .proto 文件或使用称为“服务器反射”的东西。 它可以被认为是 gRPC 调用的 OpenAPI 规范。

  2、在Program.cs文件中,需要注册如下服务,并将该服务映射到我们的http管道中,如下:

  基本上,我们向我们的 RPC 方法添加了一个路由,以便它可以作为 REST 方法被调用。 让我们再次运行应用程序并使用浏览器执行端点。

  本节的目的是解释我们如何使用 gRPC.Swagger 向我们的应用程序添加开放 API 规范。

  在本节之后,我们将演示如何使用 gRPC 服务器流将 5M 记录(大约 600MB 数据)使用流式传输到客户端。

  在服务器流中,gRPC 客户端发送请求并获取响应流。 客户端读取这些响应,直到所有消息都已传递。 gRPC 确保消息排序。

  此外,传统的基于 REST 的分页涉及多个客户端请求,并且需要在客户端和服务器之间来回通信。

  应用程序按预期运行。 要从服务器获取订单流,我们需要创建一个单独的 RPC 客户端,这将在下一节中介绍。

  7. 我们的代码只是调用服务器上的 ReadAllAsync 来检索流,然后在收到流后立即在控制台上打印输出。

  正如您在上面的示例中看到的,服务方法调用是在deadline的帮助下完成的。 您可以使用deadline指定通话的持续时间,这样您就可以指定通话应该持续多长时间。

  本文的目的是提供有关已添加到7 框架的性能增强的信息,包括 gRPC JSON 转码功能、OpenAPI 规范和服务器反射功能,以及新的性能改进。 本文还解释了如何使用 gRPC 服务器流式处理来创建能够立即处理和交付数百万条记录的高性能服务。

您可能还会对下面的文章感兴趣: