Автоматическая перезагрузка шлюза для изменений схемы в федеративной службе apollo GraphQL

В Apollo Federation я столкнулся с этой проблемой: шлюз необходимо перезапускать каждый раз, когда мы вносим изменение в схему любой федеративной службы в списке служб. Я понимаю, что каждый раз, когда запускается шлюз, он собирает всю схему и агрегирует график данных. Но есть ли способ справиться с этим автоматически без перезапуска шлюза, поскольку он также отключит все остальные незатронутые службы GraphQL Federated

Apollo GraphQL, @apollo/ шлюз

2 ответа

Вы можете использовать экспериментальный интервал опроса:

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 секунды

Я не знаю других способов автоматической перезагрузки шлюза, кроме опроса. Я сделал многоразовый образ докера и буду обновлять его, если появятся новые способы перезагрузки службы. А пока вы можете использоватьPOLL_INTERVALenv 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"

Вы можете использовать экспресс для обновления схемы вашего шлюза. 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();
Другие вопросы по тегам