3

GraphQL 有什么优缺点

 2 years ago
source link: https://www.v2ex.com/t/839880
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
GraphQL 有什么优缺点

V2EX  ›  程序员

GraphQL 有什么优缺点

  Ayanokouji · 1 天前 · 2498 次点击

如果后端主导使用 GraphQL ,请问使用,还需要避免踩那些坑

27 条回复    2022-03-13 12:45:49 +08:00

pupboss      1 天前   2

好处主要是可以省流量,省 http 请求次数,坏处其实挺多的,比如鉴权,限流,缓存,性能浪费如果你感兴趣的话可以看看这篇:GraphQL 后端架构的经验分享 https://www.pupboss.com/post/2021/experience-sharing-of-graphql-backend/

bojue      1 天前

@pupboss 现在采用的多不多,我们项目目前遇到的问题是都后端传递字段太臃肿了,每次后端修改字段要等待资源挺麻烦的

codehz      1 天前 via Android

缺点:自带自省功能(对于一些实现来说不是那么容易关闭),攻击者可以轻易获取所有 api (

hooopo      1 天前

pupboss      1 天前

@bojue 看你的描述好像是说向前兼容的问题,GraphQL 它本质上就是个 API 聚合器,后端该遇到的问题它一个也不会少(我好像还没遇到什么场景下 GraphQL 有碾压型的优势

auh      1 天前

前端如果没有复杂业务。后端用这个,就是浪费。

micean      1 天前

当需要一些关联的数据的时候,比较方便,相当于本来需要人工聚合的部分,框架帮你做了。缺点主要是鉴权麻烦,至于安全问题,觉得暂不用考虑。

XCFOX      21 小时 31 分钟前   3

正好最近在做的项目前后端深度使用 GraphQL 。

优点:
1. 强类型文档。GraphQL 本身首先是一门语言,而且是强类型语言,目前社区已有各种语言与 GraphQL 转换的工具。实践中,前端配合自动生成工具和 TypeScript 能确切知道每个 Query 每个变量每个属性的类型,省去了以往 RESTful API 项目中前端手动声明类型的麻烦。使用如果后端使用 TypeGraphQL 或者 NestJS 这类框架,能直接从 TypeSCript 的 Class 生成文档(schema)。

2. 自动聚合。以往 RESTful API 的每个接口的数据都是预先设计好的,前端展示的数据和后端返回的数据有时匹配不上,复杂的业务往往需要一层 BFF 层来做数据聚合。GraphQL 的返回数据是由前端决定的,能有效降低前后端的数据耦合程度,并且减少接口调用次数。

3. 更细致的鉴权。RESTful API 的鉴权颗粒度只停留在路由上,但是 GraphQL 能控制每个字段的访问权限。(讲道理 RESTful 也能,无非实现起来麻烦点)

缺点:
1. 迁移成本高。
2. 生态不完善。如果后端要用 GraphQL 的话目前几乎只能选 Node.js 了。其他语言生态都不完善,缺少 dataloader 、federation 等关键包库。
其他方面我觉得和 RESTful 相比,GraphQL 简直完胜啊

坑:
1. 著名的 N+1 问题。对于后端来说,需要对每一个列表查询进行优化避免 N + 1 。目前流行的解决方案是 dataloader 。
2. 每个前端项目只能有一张 GraphQL schema 。这使得后端必须部署一个网关来整个各个微服务,目前几乎只能用 Apollo Federation 来解决这个问题。
3. Subscriptions 。Apollo 实现了 Subscriptions 功能来帮助服务器主动发送消息。但是实践下来发现这个功能还是比较简陋的,不合适微服务架构和集群部署。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK