GraphQL和Zuul:WIll Graphql可作为zuul作为api Gateaway的其余端点

时间:2019-10-15 07:13:40

标签: java spring graphql microservices netflix-zuul

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

1 个答案:

答案 0 :(得分: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 EndPoint或同时在两者上实现。

(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

我已经假定您已经使用负载均衡器(Ribbon或其他任何产品)进行了设置,并且已在多个实例中在Eureka中注册了服务。

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

如果不能,怎么办? (1)好吧,如果您的其他实例正常运行-没问题 (2)假设所有服务都已退出,并且GraphQL服务返回错误,因为它无法联系任何对象。因此,现在转到问题的第三部分-我们将断路器放在哪里?

(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

希望这行得通!我很快就会发现自己的。