https://fauna.com/blog/when-to-use-graphql-grpc-rest-webhooks
    何时使用GraphQL、gRPC、REST和Webhooks

    2022年3月24日

    在设计应用程序时,开发人员可以选择各种各样的客户机-服务器通信协议。使用GraphQL、gRPC、REST和Webhooks在现代应用程序中非常流行。根据应用程序的需要,每个协议都可以提供不同的好处。

    在本博客中,我们将更详细地研究这些协议,强调它们的优缺点,并解释使用每种协议的最佳用途。

    GraphQL

    GraphQL是一种用于与API交互的查询语言。它只允许用户从服务器上获取应用程序所需的数据,而不需要更多。因此,每次向服务器API端点发送GraphQL查询时,都可以确保获得可预测的数据响应。GraphQL作为API上的抽象层工作,只需要一个端点即可访问数据。

    使用GraphQL的优点:

    语言不可知:GraphQL使用自己的模式定义语言,可以整合到大多数服务器中,而不考虑它们使用的底层语言或框架。

    单端点:使用GraphQL查询单端点的请求。这些请求包含数据的形状和所需的字段,端点会准确地返回请求所需的内容。这使得GraphQL查询比传统的REST查询效率更高,后者可能需要多个请求才能获得足够的数据。

    强类型:GraphQL具有强类型模式。这些模式充当客户端和服务器之间的契约,允许API使用者知道数据应该具有的确切结构类型。

    使用GraphQL的缺点:

    缓存的复杂性:与默认情况下支持缓存请求的REST API不同,为GraphQL设置缓存是一个复杂且具有挑战性的过程。

    错误处理的困难:GraphQL请求总是返回HTTP 200(OK)状态代码,即使GraphQL层中存在错误。出现错误时,它们会被放置在响应的“errors”键中,同时仍返回200状态码。因此,开发人员发现很难区分成功的请求和失败的请求。

    何时使用GraphQL

    在以下情况下,使用GraphQL可能是有利的:

    对带宽敏感的应用程序:GraphQL更适合于智能手机或物联网设备等平台,在这些平台上,管理请求的数据量变得至关重要。使用GraphQL返回托管在这些设备上的应用程序所需的确切数据可以减少带宽消耗。

    使用来自多个数据存储的数据的应用程序:GraphQL可以从多个数据源生成响应。然后,所有数据都可以嵌套到一个响应中,这对报表仪表板等应用程序非常有用。

    gRPC

    gRPC或Google Remote Procedure Call是Google开发的远程过程调用的实现,用于在远程服务器上运行操作。与GraphQL不同,在GraphQL中,客户机请求依赖预定义的模式来接收特定格式的数据,gRPC通过客户机和服务器定义的契约来工作。

    使用gRPC的优点:

    轻量级客户端:gRPC允许客户端将计算卸载到远程服务器上,使它们更轻量级。

    高效:与使用JSON对象的传统REST API相比,gRPC使用协议缓冲区(Protobufs)在客户机和服务器之间进行更高效的通信。Protobufs是语言和平台无关的系统,用于将数据序列化为二进制,使消息的大小更小,传输速度更快。

    开源:gRPC是一种开源协议,被设计为HTTP的继承者。它的目的是让开发人员能够专注于应用程序和服务器之间的契约,将压缩和流优先级等功能转移到底层协议中。

    使用gRPC的缺点:

    浏览器支持有限:gRPC严重依赖HTTP/2协议,大多数流行浏览器仍然不广泛支持该协议。

    社区支持有限:gRPC仍然没有像其他协议那样得到更多的社区参与。GraphQL有略多于17000个关于堆栈溢出的讨论线程,而gRPC只有不到5000个。

    Protobuf不是人类可读的:与其他使用XML或JSON的协议不同,Protobuf将文件压缩为非人类可读的格式。

    何时使用gRPC

    gRPC在以下情况下很有用:

    实时流媒体通信服务:gRPC适用于需要轻量级高效消息通信的实时流媒体通信服务。

    微服务体系结构:gRPC框架中的Protobufs允许开发人员使用自己喜欢的编程语言创建能够高效、独立地相互通信的服务。

    休息

    REST(Representational State Transfer)是开发web服务的一种体系结构样式。要使服务是RESTful的,它们需要满足以下约束:

    统一界面

    客户端服务