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

Posted

技术标签:

【中文标题】GraphQL 和 Zuul:Graphql 将作为一个休息端点工作,zuul 作为 api 网关【英文标题】:GraphQL and Zuul : WIll Graphql work as an rest endpoint with zuul as api gateaway 【发布时间】:2020-02-11 19:22:51 【问题描述】:

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

【问题讨论】:

【参考方案1】:

更新

如果你想使用 Spring Boot GraphQL 实现来减少下面的一些开销。对此也进行调查。

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

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

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

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

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

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

故障转移/高可用性

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

(1) GraphQL 的故障转移/HA

使用阿波罗联盟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) 底层微服务的故障转移/HA

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

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

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

(3) 断路器

三级断路器:

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

   Client -> Zuul -> GraphQL Gateway -> Zuul -> GraphQL Service A Load Balancer -> Microservice A Load Balancer -> Microservice A
(2) 添加单独的微服务级断路器 (3) Apollo 的断路器 -> 看看这个 GitHub 的想法 https://github.com/ardatan/graphql-tools/issues/608 https://github.com/apollographql/apollo-feature-requests/issues/140

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

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

希望这可行!我自己很快就会知道的。

【讨论】:

嘿,这对你有用吗?如果是,请您分享更多详细信息

以上是关于GraphQL 和 Zuul:Graphql 将作为一个休息端点工作,zuul 作为 api 网关的主要内容,如果未能解决你的问题,请参考以下文章

graphql-yoga - GraphQL 解析器参数在哪里定义和记录?

GraphQL 和 graphql-sequelize-schema-generator

如何使用 GraphQL.Net 和 c# 将集合传递给 GraphQL 突变?

NestJS 和 GraphQL - TypeError:graphql_1.parse 不是具有最少设置的函数

使用 REST 包装 GraphQL 从 NestJS 提供 GraphQL 和 REST API

GraphQL 和 Relay 的概念