REST vs. gRPC:为你的下一个项目选择哪个?[2023]

在处理api时,您经常会遇到rest和grpc。尽管rest在这个领域占据主导地位多年,但grpc正在证明自己是一个有价值的竞争对手。

rest和gprc是设计api的两种不同方式。api作为服务之间的通信桥梁,可以代表复杂系统,这些系统存在于不同的计算机上或使用不同的语言编写。

本文将介绍rest和grpc,分享它们的相似之处、差异以及各自的使用场景。

什么是rest?

rest(representational state transfer)是一种基于架构的软件方法,它规定了软件组件如何交换数据的规则。rest基于web的标准通信协议http。

所有基于rest架构风格的api都被称为restful api。另一方面,遵循rest架构设计的web服务被称为restful web服务。

rest架构风格遵循以下原则:

  • 统一接口:服务器应以标准格式传输数据。但是,传输的数据可以与服务器应用程序资源的内部表示形式的格式不同。
  • 无状态:服务器应独立完成每个客户端请求,而不考虑先前的请求。客户端对资源的请求可以以任何顺序进行,并且每个请求与其他请求隔离。
  • 分层系统:在服务器和客户端之间存在一层授权中介。客户端可以与这些授权中介连接,并仍然接收来自服务器的响应。
  • 可缓存性:一些响应被存储在中介或客户端上,以提高响应时间。
  • 代码按需:服务器通过将软件编程代码传输到客户端临时自定义或扩展客户端功能。

rest的优点

  • 可扩展:rest api以其优化客户端-服务器互动而闻名。缓存和无状态是减少服务器负载的主要特性。
  • 灵活:restful api提供完全的客户端-服务器分离。这样的服务将解耦并简化各种独立演变的服务器组件。
  • 独立性:您可以使用不同的编程语言编写服务器和客户端应用程序,而不会影响api设计。

rest的用例

  • web api
  • web服务
  • 微服务架构

什么是grpc?

grpc是一种远程过程调用(rpc)框架,可以在任何环境中运行。这个开源框架被设计为一种高性能协议,可以高效地连接数据中心内部和跨数据中心的服务。

客户端应用程序可以像调用本地对象一样在不同的机器上调用服务器应用程序上的方法。使用grpc,您可以定义一个服务,并指定可以远程调用的方法及其参数和返回类型。

grpc具有可插拔的健康检查、身份验证、负载均衡和跟踪支持。该框架使用http 2和protocol buffers进行数据传输。在交换数据时,调用一个过程而不是资源url。

grpc的优势

  • 可扩展:grpc允许您使用单个命令安装运行时环境并开始扩展数百万次rpc/秒。
  • 简单的服务定义:使用protocol buffers定义您的服务并使其运行。
  • 跨平台:该框架生成不同平台和语言的惯用客户端和服务器存根。
  • 双向流式传输和集成认证。

grpc的使用案例

  • web api
  • web服务
  • 流式应用程序
  • 微服务通信

rest和grpc的相似之处

  • 数据交换机制:这两种架构设计允许服务器和客户端交换数据。然而,此数据基于特定规则共享。
  • 适用于可扩展和分布式系统:rest和grpc的异步通信和无状态设计使得它们的api易于扩展。
  • 使用基于http的通信:它们都使用web上最常用的通信协议http。
  • 灵活:您可以使用不同的编程语言和技术来使用rest和grpc。

rest vs. grpc

rest和grpc服务在以下方面有所不同:

数据交换

rest api中,从一个软件组件传递给另一个组件的数据必须以json格式表示。json必须被序列化并转换为编程语言以进行数据交换。但是,rest api也可以交换html和xml等数据格式。

grpc默认使用protocol buffers格式。然而,它也原生支持json。protocol buffers不易读。服务器使用protocol buffer接口说明语言来定义数据结构。然后,grpc将数据结构序列化为二进制格式。然后,它将数据反序列化为任何指定的编程语言。

通信模型

rest中,客户端向服务器发送单个请求;服务器则发送响应作为回复。在继续操作之前,客户端必须等待服务器的响应。这是一种请求-响应模型。

grpc中,客户端可以发送单个或多个服务器请求,从而分别产生单个或多个响应。数据连接可以是多对多、多对一、一对多或一对一。grpc使用客户端-响应通信模型。

代码生成

grpc具有内置的本地服务器端和客户端端代码生成功能。通过protocol buffers编译器,您可以在不同的语言中找到这些功能。在proto文件中定义完结构后,grpc会生成服务器端和客户端的代码。

rest缺乏内置的代码生成功能。如果您需要此功能,可以使用第三方工具。

http协议

rest api使用http 1.1。要在rest服务上发送请求,您需要一个资源url。http 1在计算机和web服务器之间发送信息。 rest服务中的资源url对客户端可见。 api设计者控制资源url的结构。

grpc使用http 2。这个http版本是在2015年引入的,并且在internet explorer,safari和chrome等浏览器中使用。与将所有内容保留在纯文本中的http 1不同,这种较新的格式利用二进制格式封装,从而提供更多的数据传递选项并加快整个过程。

有效载荷数据结构

rest使用xml或json发送和接收数据。 json是在rest中发送动态数据的最常用格式,因为它灵活且不需要任何结构。 json数据也是可读的。 json的唯一问题是不够快,因为在数据传输期间必须将其序列化和转换。

grpc使用protocol buffers来序列化有效载荷数据。这是一种高度压缩的格式,可以减少消息的数据量。此框架使用protobuf将强类型消息自动转换为客户端和服务器的编程语言。

浏览器支持

rest在所有浏览器上都受支持,因为它使用http 1.1。这使其成为web服务和api的理想选择。

grpc对浏览器的支持有限,因为它基于http 2。要支持所有浏览器,您必须将grpc-web添加为代理层。因此,grpc主要用于内部系统。

客户端-服务器耦合

rest是一种松散耦合的架构设计。这意味着客户端和服务器不需要了解彼此的实现。此功能使得随着时间的推移演变restful api更容易,因为当您更改服务器定义时,不需要更改客户端代码。

grpc是一个紧密耦合的框架,服务器和客户端必须具有相同的proto文件。如果需要对文件进行任何更改,还必须更新服务器和客户端。

rest vs. grpc:快速比较

特点 rest grpc
http协议 http 1.1 http 2
浏览器支持 由于使用http 1.1,支持所有浏览器 由于使用http 2,支持的浏览器较少
代码生成 使用第三方工具 内置的代码生成功能
设计方法 面向实体的设计 面向服务的方法
数据访问 资源url 服务调用
双向数据流 不可用 可用
实现 在客户端或服务器端实现rest不需要使用通用软件 在客户端和服务器端都需要使用grpc软件
通信模型 单个客户端与单个服务器通信 多个通信模型,例如一个客户端向多个服务器发送请求,一个服务器与多个客户端通信,或一个服务器与一个客户端通信

何时使用rest

restful api和web服务非常流行。restful服务易于实现,数据结构灵活可读。您可以在以下情况下使用rest:

  • 基于web的架构:您可以使用rest架构设计创建web、移动和多平台api。
  • 简单的数据通信:rest使用易于读取的json数据格式。
  • 面向公众的api:如果您打算公众使用您的数据和api,由于其可读性特点,rest将是一个很好的选择。

何时使用grpc

尽管grpc不如restful服务流行,但它也具有一些独特的特点,适用于以下应用程序:

  • 多语言系统:grpc适用于使用不同编程语言编写的微服务架构,且api不太可能改变。
  • 微服务连接:双向流式传输和较低的浏览器支持等功能使grpc成为内部api的良好选择。
  • 实时流媒体网络:您可以将grpc与处理大数据负载并需要实时流媒体的内部服务一起使用。

作者观点

尽管grpc在物联网等应用中具有一些特定的功能,但由于其可读性、灵活性和广泛应用,rest仍然是更好的选择。grpc的低浏览器支持使其不适合希望构建web服务的开发人员。

对restful服务的普遍支持使其成为web和微服务集成的理想api架构风格。

结论

在构建下一个api时,rest和grpc是众多api架构风格中的两种选择。最终的选择将取决于您要构建的产品。当构建面向公众的api时,restful服务是一个完美的选择,而不需要浏览器支持的移动应用程序等服务,grpc是一个不错的选择。

接下来,查看我们的文章,了解如何使用java从头开始创建。

类似文章