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