HATEOAS 与 GraphQL 为微服务设置的决策标准?

HATEOAS vs GraphQL decision criteria set for microservices?

我最近与某人交谈,他说他们正在完全跳过 HATEOAS REST 端点的开发,转而支持 GraphQL。所以我很好奇决定何时使用 GraphQL 与 HATEOAS 的标准集是什么,或者 GraphQL 只是 API 网关/边缘服务器架构的更好选择?

各自的优缺点是:

GraphQL

亲:

  • 提供对返回数据的精细控制以避免不必要的流量
  • 消除了为了附加/"follow-on"数据而一遍又一遍地回到井中的需要
  • 根据上述内容,它允许软件设计人员通过减少延迟来提供出色的性能 - 每个查询指定它需要的所有东西,并且 GraphQL 实现可以 assemble 并且只用一个客户端交付它< ->服务器事务
  • 可能会缓慢弃用而不是版本化 APIs
  • 这是一种查询语言
  • 内省是内置的

缺点:

  • 不处理缓存(尽管现在有库会处理这个问题)

HATEOAS/休息

亲:

  • 缓存是一个很好理解的事情
  • 相对成熟且易于理解
  • 很多基础设施,例如 CDN 来分散负载
  • 非常适合微服务
  • 可以上传文件

缺点:

  • "back to the well" 问题
  • 没有严格规定
  • 服务器和客户端的每个实现都必须做出自己的决定
  • 查询不规范

结论

一个有趣的比较是,人们使用 GraphQL 作为 REST API 的前端,但头脑正常的人不会考虑做相反的事情。如果你选择联合/微服务设计,那么一个 GraphQL 服务器为其他人提供前端,他们可以在前端和微服务之间使用 API 的通用规范;如果微服务是 REST,这就不太可能了。

我认为只要您想到要问的正确问题,GraphQL 就会成为设计良好的系统的重要组成部分。是否完全跳过 HATEOAS 很遗憾,"it depends".

来源

我自己的经历,加上 Phil Sturgeon 的经历 GraphQL vs REST: Overview

我喜欢 Ed 在我的概述中发表了 link,但我认为还有另一篇文章比那篇文章更相关。

两者对状态的表示完全不同

https://blog.apisyouwonthate.com/representing-state-in-rest-and-graphql-9194b291d127

GraphQL 完全无法以有意义和标准化的方式提供一系列 "next steps",除了可能会推送包含您应该尝试命中的潜在相关突变的字符串数组。

即使你这样做了,它也肯定不能帮助你与其他 HTTP API 进行通信,这真是一种耻辱。

反正就是那篇文章! :)