在 Apollo Federation,我面临这个问题:每次我们对服务列表中任何联合服务的架构进行更改时,都需要重新启动网关。我知道每次网关启动时,它都会收集所有模式并聚合数据图。但是有没有一种方法可以在不重新启动网关的情况下自动处理,因为它也会关闭所有其他未受影响的 GraphQL 联合服务
阿波罗 GraphQL , @apollo/gateway
在 Apollo Federation,我面临这个问题:每次我们对服务列表中任何联合服务的架构进行更改时,都需要重新启动网关。我知道每次网关启动时,它都会收集所有模式并聚合数据图。但是有没有一种方法可以在不重新启动网关的情况下自动处理,因为它也会关闭所有其他未受影响的 GraphQL 联合服务
阿波罗 GraphQL , @apollo/gateway
您可以使用一个实验性的轮询间隔:
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 秒拉一次
您可以使用 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();
更新:该函数现在在重新加载架构之前load()
检查。phase === 'initialized'
解决方法可能是使用gateway.loadDynamic(false)
或可能更改gateway.state.phase = 'initialized';
. 我会推荐loadDyamic()
,因为更改状态可能会导致问题。由于在此更新时我没有与 Apollo Federation 合作,因此我没有测试过这两种解决方案。
除了轮询之外,我不知道自动重新加载网关的其他方法。我制作了一个可重用的docker 映像,如果出现重新加载服务的新方法,我将继续更新它。现在,您可以使用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"