欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

进行API开发选gRPC还是HTTP APIs?

程序员文章站 2022-04-08 19:10:08
上一篇文章我带着大家体验了一把《 "ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)" 》,如果有兴趣的可以点击链接进行查看,相信跟着做的你,也是可以跑起来的。这篇文章我们将一起来探讨下gRPC服务如何与HTTP APIs进行比较。用于为应用程序提供API的技术是一个重要的选择, ......

上一篇文章我带着大家体验了一把《asp.net core 3.0 上的grpc服务模板初体验(多图)》,如果有兴趣的可以点击链接进行查看,相信跟着做的你,也是可以跑起来的。这篇文章我们将一起来探讨下grpc服务如何与http apis进行比较。用于为应用程序提供api的技术是一个重要的选择,与http api相比,grpc提供了独特的优势。本文从grpc的优缺点出发,并推荐了一些建议使用grpc服务以及不建议使用grpc服务的场景。

作者:依乐祝
原文链接:

开始之前先看一下grpc与带有j'son的http apis对比表格

进行API开发选gRPC还是HTTP APIs?

grpc的优势

性能

grpc消息使用一种有效的二进制消息格式protobuf进行序列化。protobuf在服务器和客户机上的序列化非常快。protobuf序列化后的消息体积很小,能够有效负载,在移动应用程序等有限带宽场景中显得很重要。

grpc是为http/2而设计的,它是http的一个主要版本,与http 1.x相比具有显著的性能优势::

  • 二进制框架和压缩。http/2协议在发送和接收方面都很紧凑和高效。
  • 通过单个tcp连接复用多个http/2调用。多路复用消除了线头阻塞

代码生成

所有grpc框架都为代码生成提供了一流的支持。grpc开发的核心文件是*.proto文件 ,它定义了grpc服务和消息的约定。根据这个文件,grpc框架将生成服务基类,消息和完整的客户端代码。

通过在服务器和客户端之间共享*.proto文件,可以从端到端生成消息和客户端代码。客户端的代码生成消除了客户端和服务器上的重复消息,并为您创建了一个强类型的客户端。无需编写客户端代码,可在具有许多服务的应用程序中节省大量开发时间。

严格的规范

不存在具有json的http api的正式规范。开发人员不需要讨论url,http动词和响应代码的最佳格式。(想想,是用post还是get好?使用get还是用put好?一想到有选择恐惧症的你是不是又开了纠结,然后浪费了大量的时间)

grpc规范是规定有关grpc服务必须遵循的格式。grpc消除了争论并节省了开发人员的时间,因为gprc在各个平台和实现之间是一致的。

http/2为长期的实时通信流提供了基础。grpc通过http/2为流媒体提供一流的支持。

grpc服务支持所有流组合:

  • 一元(没有流媒体)
  • 服务器到客户端流
  • 客户端到服务器流
  • 双向流媒体

截至时间/超时和取消

grpc允许客户端指定他们愿意等待rpc完成的时间。该期限被发送到服务端,服务端可以决定在超出了限期时采取什么行动。例如,服务器可能会在超时时取消正在进行的grpc / http /数据库请求。

通过子grpc调用截至时间和取消操作有助于实施资源使用限制。

推荐使用grpc的场景

grpc非常适合以下场景:

  • 微服务 - grpc设计为低延迟和高吞吐量通信。grpc非常适用于效率至关重要的轻型微服务。
  • 点对点实时通信 - grpc对双向流媒体提供出色的支持。grpc服务可以实时推送消息而无需轮询。
  • 多语言混合开发环境 - grpc工具支持所有流行的开发语言,使grpc成为多语言开发环境的理想选择。
  • 网络受限环境 - 使用protobuf(一种轻量级消息格式)序列化grpc消息。grpc消息始终小于等效的json消息。

grpc的弱点

浏览器支持有限

当下,不可能直接从浏览器调用grpc服务。grpc大量使用http/2功能,没有浏览器提供支持grpc客户机的web请求所需的控制级别。例如,浏览器不允许调用者要求使用的http/2,或者提供对底层http/2框架的访问。

grpc web是grpc团队的一项附加技术,它在浏览器中提供有限的grpc支持。grpc web由两部分组成:支持所有现代浏览器的javascript客户端和服务器上的grpc web代理。grpc web客户端调用代理,代理将在grpc请求上转发到grpc服务器。

grpc web并非支持所有grpc功能。不支持客户端和双向流,并且对服务器流的支持有限。

不是人类可读的

http api请求以文本形式发送,可以由人读取和创建。

默认情况下,grpc消息使用protobuf编码。虽然protobuf的发送和接收效率很高,但它的二进制格式是不可读的。protobuf需要在*.proto文件中指定的消息接口描述才能正确反序列化。需要额外的工具来分析线路上的protobuf有效负载,并手工编写请求。

存在诸如服务器反射和grpc命令行工具等功能,以帮助处理二进制protobuf消息。另外,protobuf消息支持与json之间的转换。内置的json转换提供了一种有效的方法,可以在调试时将protobuf消息转换为可读的形式。

不建议使用grpc的场景

在以下场景中,建议使用其他框架而不是grpc:

  • 浏览器可访问的api - 浏览器不完全支持grpc。grpc-web可以提供浏览器支持,但它有局限性并引入了服务器代理。
  • 广播实时通信 - grpc支持通过流媒体进行实时通信,但不存在向已注册连接广播消息的概念。例如,在应该将新聊天消息发送到聊天室中的所有客户端的聊天室场景中,需要每个grpc呼叫以单独地将新的聊天消息流传输到客户端。对于这种场景,signalr是这种情况的有用框架。signalr具有持久连接的概念和对广播消息的内置支持。
  • 进程间通信 - 进程必须承载http/2服务才能接受传入的grpc调用。对于windows,进程间通信是一种快速,轻量级的通信方法。

总结

继上一篇介绍了《asp.net core 3.0 上的grpc服务模板初体验(多图)》后,我们又一起来探讨了一下grpc服务的优缺点并给出了grpc的一些使用场景以及非适用场景,希望对大家的使用有所帮助。最后感谢大家的阅读。另外,文中大多内容来自于https://docs.microsoft.com/en-us/aspnet/core/grpc/comparison?view=aspnetcore-3.0 有兴趣的小伙伴可以阅读原文进行查看。