自动重新加载网关以在联合服务apollo GraphQL中更改架构

时间:2019-09-27 18:04:40

标签: graphql apollo-server apollo-federation

在阿波罗联邦,我面临着这个问题: 每次我们更改服务列表中任何联合服务的架构时,都需要重新启动网关。 我了解到,每次网关启动时,它都会收集所有架构并聚合数据图。但是有没有一种方法可以自动处理此问题而无需重新启动网关,因为它还会关闭所有其他不受影响的GraphQL联合服务

Apollo GraphQL,@ apollo / gateway

3 个答案:

答案 0 :(得分:0)

您可以使用一个实验性的轮询间隔:

const gateway = new ApolloGateway({
  serviceList: [
    { name: "products", url: "http://localhost:4002" },
    { name: "inventory", url: "http://localhost:4001" },
    { name: "accounts", url: "http://localhost:4000" }
  ],
    debug: true,
    experimental_pollInterval:3000
})

上面的代码每3秒就会拉动

答案 1 :(得分:0)

除轮询外,我不知道其他自动重载网关的方法。 我做了一个可重用的docker image,如果出现了重新加载服务的新方法,我将继续对其进行更新。现在,您可以使用POLL_INTERVAL env var来定期检查更改。 这是使用docker-compose的示例:

version: '3'

services:
    a:
        build: ./a # one service implementing federation
    b:
        build: ./b
    gateway:
        image: xmorse/apollo-federation-gateway
        ports:
            - 8000:80
        environment: 
            CACHE_MAX_AGE: '5' # seconds
            POLL_INTERVAL: '30' # seconds
            URL_0: "http://a"
            URL_1: "http://b"

答案 2 :(得分:0)

您可以使用express刷新网关的架构。 ApolloGateway具有一个load()函数,该函数可以从实现服务中获取模式。如果需要自动进行,此HTTP调用可能会成为部署过程的一部分。我不会采用轮询或过于自动化的方式。部署实施服务后,在更新并重新部署架构之前,该架构将不会更改。

import { ApolloGateway } from '@apollo/gateway';
import { ApolloServer } from 'apollo-server-express';
import express from 'express';

const gateway = new ApolloGateway({ ...config });
const server = new ApolloServer({ gateway, subscriptions: false });
const app = express();

app.post('/refreshGateway', (request, response) => {
  gateway.load();
  response.sendStatus(200);
});

server.applyMiddleware({ app, path: '/' });

app.listen();