GraphQL 和 Zuul:将 Graphql 用作休息端点,zuul 作为 api 网关

GraphQL and Zuul : WIll Graphql work as an rest endpoint with zuul as api gateaway

我已经有一个基于微服务的应用程序 运行 Spring 云,并且将 zuul 作为 API 网关,但我们正在考虑更改为 Graphql 而不是传统的 Rest,因为公司用例,因此我正在考虑为每个微服务创建 graphql Api,这是否有效,zuul 是否能够处理重新路由,Hysterix 是否能够在维护 Hysterix 仪表板的同时执行容错? .. 以前有人做过吗?

更新

如果您想使用 Spring 引导 GraphQL 实现,这将减少下面的一些开销。也在研究这个问题。

我现在正在努力解决这个问题,但这是我想要的想法——我可能需要一段时间才能确认它是否有效,但这是我的初步计划。

示意图 https://imgur.com/a/af9qX2V

Zuul ---> GraphQL (Apollo) ---> Various API Endpoints

GraphQL (Apollo) 允许您指定 API 端点。您可以让 Apollo 指向那些 API 端点的 Zuul 定义路由,或者让 Apollo 直接指向微服务。

将 Apollo 连接到您的 API/REST 端点

https://www.apollographql.com/docs/tutorial/data-source/

Fail-Over/High 可用性

另一个考虑因素是如何处理 fail-over/high 可用性。这部分有点棘手。需要管理三个部分:(1) fail-over/HA 用于 GraphQL,(2) fail-over/HA 用于底层微服务,(3) 断路器工作 (ZuulFallbackProvider/Hystrix) [请原谅我是错误的 - 仍在学习 Zuul] - 以及是否应该在网关 (Zuul) 或 API 端点或两者上实施。

(1) Failover/HA 对于 GraphQL

使用阿波罗联邦https://www.apollographql.com/docs/apollo-server/federation/introduction/

对于每个 GraphQL 架构,或者您决定拆分它 - 每个架构至少设置两个 GraphQL 服务,并将它们放在负载均衡器后面。将您的 Apollo 网关设置为指向负载均衡器。

https://www.apollographql.com/docs/apollo-server/federation/introduction/#managed-federation

const gateway = new ApolloGateway({
  serviceList: [
    { name: 'accounts', url: 'http://localhost:4001' },
    { name: 'products', url: 'http://localhost:4002' },
    { name: 'reviews', url: 'http://localhost:4003' }
  ]
});  

(2) Failover/HA 用于您的底层微服务

这篇文章我已经假设您已经设置了负载均衡器(Ribbon 或其他任何东西)并且服务在 Eureka 中注册了多个实例。

对于给定的 REST 请求(例如读取),您可能还有一个备用方法 - 如果您仍然可以通过 GraphQL 服务访问此微服务,则此备用方法有效。

如果你做不到怎么办?! (1) 好吧,如果您的其他实例已启动并正常工作 - 没问题 (2) 让我们假设所有服务都已退出,并且 GraphQL 服务 returns 出错,因为它无法联系任何东西。那么现在转到问题的第三部分 - 我们将断路器放在哪里?

(3) 断路器

三级断路器:

(1) 如果由于某种原因请求链的任何部分一直失败到微服务,请保留你的 Zuul 断路器 一种。在 Zuul 中,您将编写动作以在触发断路器时发生 b.让 GraphQL 网关指向需要通过您的 API 网关进行路由的路径 [这是关键!]。什么是您的微服务已启动并且 运行,但网关尝试路由到的 GraphQL 服务已关闭?

   Client -> Zuul -> GraphQL Gateway -> Zuul -> GraphQL Service A Load Balancer -> Microservice A Load Balancer -> Microservice A

看起来这可能是他们解决问题的方法(如果您阅读前两个链接会更有意义):

https://github.com/apollographql/apollo-server/pull/1807

希望这能奏效!我自己很快就会知道。