Restful和GraphQL,该怎么选择?

我在写dragonfly的web组件时,遇到一个技术决策:要不要支持GraphQL?

Restful肯定是必须支持的,哪怕开发人员所设计的Restful API,形式上几乎都不合格,都是Roy Fielding博士批判的伪Rest,但我还是提供了Get, Post, Put, Delete, Head, Patch六种方法的完整支持。

而GraphQL就很难办了,虽然Meta(Facebook)把它弄出来,愿景很大,有取代Restful之势。但从我的角度看,很鸡肋。

首先,GraphQL是一种Data-Driven或者Data Oriented Development,从前端到后端,眼里都是透明的数据。然而大多数应用,都是Business-Driven,要处理复杂的业务,而不是简单对数据的CRUD,所以应用场景非常有限。

其次,所谓的Overloading问题,就是前端想要那几个字段,后端只需要返回那几个字段即可,避免“过度加载”。其实这根本不是个问题,后端完全可以通过Filter过滤掉不需要的字段。

最后,所谓的嵌套问题,避免多次请求。这也是个伪问题,后端可以根据前端业务需要设计对应的API和数据结构。

GraphQL带来的便利,与它的复杂度(学习成本),性能开销相比,是否划算?我认为不划算。大家如果懂点编译的话,不妨试着去写个GraphQL解析器,就知道多麻烦了。

所以最终,我在RESTFUL API上提供了一点有限的GraphQL Query支持,前端通过GraphQL Query语法指定需要哪些字段,Web组件通过预编译和过滤,尽量不损失性能为前提,达到“前端说要什么就给什么”的效果。

所以,所谓设计,其实本质就是Tradeoff,权衡、妥协、折中。

whale: A JSR330 Based Java DI Framework

Restful: Restful是一种软件架构风格,用于构建可伸缩的网络应用程序。它基于HTTP协议,通过使用统一的接口和资源标识符(URI)来进行通信。Restful架构的核心原则是无状态、可缓存、客户端-服务器分离和统一接口。它使用HTTP方法(GET、POST、PUT、DELETE等)来操作资源,并使用JSON或XML等格式来传输数据。 GraphQL: GraphQL是一种用于API开发的查询语言和运行时环境。它提供了一种灵活的方式来定义和查询数据模型,使客户端能够精确地获取所需的数据,避免了过度获取或不足获取的问题。GraphQL使用类型系统来描述数据模型,并通过查询语言来定义客户端请求的数据结构。与传统的RESTful API相比,GraphQL具有更高的灵活性和效率。 Soap: SOAP(Simple Object Access Protocol)是一种基于XML的通信协议,用于在网络上交换结构化信息。它定义了一种标准的消息格式和通信规范,使得不同平台和编程语言之间可以进行远程调用和消息传递。SOAP通常使用HTTP作为传输协议,但也可以使用其他协议如SMTP、FTP等。 Dubbo: Dubbo是一个高性能的分布式服务框架,用于构建大规模分布式系统。它提供了服务注册、发现、调用和负载均衡等功能,使得分布式系统的开发和管理更加简单。Dubbo支持多种通信协议和序列化方式,并提供了可扩展的插件机制,可以与其他框架和中间件进行集成。 RPC(Remote Procedure Call): RPC是一种远程过程调用协议,用于实现分布式系统中的进程间通信。它允许一个进程调用另一个进程的函数或方法,就像调用本地函数一样。RPC隐藏了底层通信细节,使得分布式系统的开发更加简单。常见的RPC框架有gRPC、Thrift、Apache Avro等。 WebSocket: WebSocket是一种在单个TCP连接上进行全双工通信的协议。它提供了实时的、双向的数据传输能力,使得服务器可以主动向客户端推送数据,而不需要客户端发起请求。WebSocket通常用于实时聊天、实时数据更新等场景,与传统的HTTP请求-响应模式相比,具有更低的延迟和更高的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值