问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

gRPC:高性能的远程过程调用框架

创作时间:
作者:
@小白创作中心

gRPC:高性能的远程过程调用框架

引用
1
来源
1.
https://learn.microsoft.com/zh-cn/dotnet/architecture/cloud-native/grpc?source=recommendations

gRPC是一种高性能的远程过程调用框架,它使用HTTP/2作为传输协议,支持多种编程语言,并且具有轻量级、高性能的特点。在.NET中,gRPC集成到了.NET Core 3.0 SDK及更高版本中,可以通过Visual Studio 2022、Visual Studio Code和dotnet CLI等工具进行开发。

什么是gRPC?

gRPC是一种新式的高性能框架,它发展了由来已久的远程过程调用协议。从应用程序层面来看,gRPC简化了客户端和后端服务之间的消息传递。gRPC源自Google,是云原生产品服务的云原生计算基础(CNCF)生态系统的一部分,并且是开放源代码的。CNCF将gRPC视为培育中的项目。培育意味着最终用户会在生产应用程序中使用该技术,该项目有大量的贡献者。

典型的gRPC客户端应用将公开实现业务操作的本地进程内函数。在此之下,该本地函数会在远程计算机上调用另一个函数。看起来是本地调用,实际上变成了对远程服务的透明进程外调用。RPC管道对计算机之间点到点网络通信、序列化和执行进行抽象化。

在云原生应用程序中,开发人员在工作中通常会处理不同的编程语言、框架和技术。这种互操作性使消息协定和跨平台通信所需的管道变得复杂。gRPC提供“统一水平层”来对此类问题进行抽象化。开发人员在本机平台中编写专注于业务功能的代码,而gRPC会处理通信管道。

gRPC在最常用的开发堆栈(包括Java、JavaScript、C#、Go、Swift和NodeJS)中提供全面的支持。

gRPC的优势

gRPC使用HTTP/2作为传输协议。虽然与HTTP 1.1也能兼容,但HTTP/2具有许多高级功能:

  • 用于数据传输的二进制组帧协议 - 与HTTP 1.1不同,HTTP 1.1是基于文本的。
  • 对通过同一连接发送多个并行请求的多路复用支持 - HTTP 1.1将处理限制为一次处理一个请求/响应消息。
  • 双向全双工通信,用于同时发送客户端请求和服务器响应。
  • 内置流式处理,支持对大型数据集进行异步流式处理的请求和响应。
  • 减少网络使用率的标头压缩。

gRPC是轻量型且高性能的。其处理速度可以比JSON序列化快8倍,消息小60%到80%。在MicrosoftWindows Communication Foundation (WCF)中,gRPC的性能超过经过高度优化的NetTCP绑定的速度和效率。与偏向于Microsoft堆栈的NetTCP不同,gRPC是跨平台的。

协议缓冲区

gRPC采用名为协议缓冲区的开放源代码技术。它们提供极为高效且不受平台影响的序列化格式,用于序列化服务相互发送的结构化消息。开发人员使用跨平台接口定义语言(IDL)为每个微服务定义服务协定。该协定作为基于文本的.proto文件实现,描述了每个服务的方法、输入和输出。同一合同文件可用于基于不同开发平台构建的gRPC客户端和服务。

Protobuf编译器protoc使用proto文件为目标平台生成客户端和服务代码。该代码包括以下组成部分:

  • 由客户端和服务共享的强类型对象,表示消息的服务操作和数据元素。
  • 一个强类型基类,具有远程gRPC服务可以继承和扩展的所需网络管道。
  • 一个客户端存根,其中包含调用远程gRPC服务所需的管道。

运行时,每条消息都序列化为标准Protobuf表示形式,并在客户端和远程服务之间交换。与JSON或XML不同,Protobuf消息被序列化为经过编译的二进制字节。

.NET中的gRPC支持

gRPC集成到.NET Core 3.0 SDK及更高版本中。以下工具对其提供支持:

  • 已安装ASP.NET和Web开发工作负载的Visual Studio 2022
  • Visual Studio Code
  • dotnet CLI

SDK包括用于终结点路由、内置IoC和日志记录的工具。开源Kestrel Web服务器支持HTTP/2连接。图4-20展示了Visual Studio 2022模板,该模板为gRPC服务搭建主干项目。请注意.NET对Windows Linux和macOS提供的完全支持方式。

图4-20。Visual Studio 2022中的gRPC支持

图4-21展示了由Visual Studio 2022中包含的内置基架生成的gRPC服务框架。

图4-21。Visual Studio 2022中的gRPC项目

在上图中,请注意proto说明文件和服务代码。正如你很快就会看到的,Visual Studio会在Startup类和基础项目文件中生成其他配置。

gRPC的使用

建议在以下场景中使用gRPC:

  • 需要立即响应才能继续处理的同步后端微服务到微服务通信。
  • 需要支持混合编程平台的Polyglot环境。
  • 性能至关重要的低延迟和高吞吐量通信。
  • 点到点实时通信 - gRPC无需轮询即可实时推送消息,并且能对双向流式处理提供出色的支持。
  • 网络受约束环境 - 二进制gRPC消息始终小于等效的基于文本的JSON消息。

在撰写本文时,gRPC主要用于后端服务。新式浏览器无法提供支持前端gRPC客户端所需的HTTP/2控制级别。也就是说,支持使用.NET的gRPC-Web,能够从使用JavaScript或Blazor WebAssembly技术构建的基于浏览器的应用进行gRPC通信。gRPC-Web使ASP.NET Core gRPC应用能支持浏览器应用中的gRPC功能:

  • 强类型、代码生成的客户端
  • 压缩Protobuf消息
  • 服务器流式处理

gRPC实现

微软的微服务参考体系结构eShop on Containers介绍了如何在.NET应用程序中实现gRPC服务。图4-22展示了后端体系结构。

图4-22。eShop on Containers的后端体系结构

在上图中,请注意eShop如何通过公开多个API网关来采用前端模式的后端(BFF)。我们在本章中的前面部分讨论了BFF模式。请密切关注聚合器微服务(灰色部分),它位于Web-Shopping API网关和后端购物微服务之间。聚合器从客户端接收单个请求,将其调度到各种微服务、聚合结果并将其发送回请求的客户端。此类操作通常需要同步通信,以生成即时响应。在eShop中,聚合器中的后端调用使用gRPC执行,如图4-23所示。

图4-23。eShop on Containers中的gRPC

gRPC通信需要使用客户端和服务器组件。在上图中,请注意购物聚合器是如何实现gRPC客户端的。客户端对后端微服务进行同步gRPC调用(红色部分),每个调用都实现了一个gRPC服务器。客户端和服务器都利用.NET SDK中的内置gRPC管道。客户端存根提供用于发起远程gRPC调用的管道。服务器端组件提供自定义服务类可以继承和使用的gRPC管道。

同时公开RESTful API和gRPC通信的微服务需要使用多个终结点来管理流量。你将打开一个用于侦听RESTful调用的HTTP流量的终结点,并打开另一个侦听gRPC调用的终结点。必须为gRPC通信所需的HTTP/2协议配置gRPC终结点。

尽管我们正在努力地将微服务与异步通信模式分离,但某些操作依然需要进行直接调用。gRPC应该是微服务之间直接同步通信的主要选择。基于HTTP/2和协议缓冲区的高性能通信协议使其成为最佳选择。

展望未来

在将来,gRPC将获得云原生系统方面的关注。性能优势以及开发方面的轻松度都是它的闪光点。但是,REST可能会存在很长时间。它在公开API和后向兼容性方面具有很大优势。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号