如何在 NestJS 中热重载联邦网关
how to hot reload federation gateway in NestJS
问题
在联邦嵌套应用程序中,网关收集来自其他服务的所有模式并形成一个完整的图。问题是,如何在子模式更改后重新运行模式集合?
当前解决方法
重启网关解决问题,但似乎不是一个优雅的解决方案。
其他资源
- Apollo 服务器支持 managed federation,这实际上恢复了网关和服务之间的依赖关系。遗憾的是我找不到任何与 NestJS 相关的内容。
当使用NestJS配置网关应用,并且已经集成了Apollo studio时,则不需要在GraphQLGatewayModule中定义任何serviceList。你的模块初始化应该是这样的:
GraphQLGatewayModule.forRootAsync({
useFactory: async () => ({
gateway: {},
server: {
path: '/graphql',
},
}),
})
应在托管网关应用程序的计算机上声明以下环境变量:
APOLLO_KEY: "service:<graphid>:<hash>"
APOLLO_SCHEMA_CONFIG_DELIVERY_ENDPOINT: "https://uplink.api.apollographql.com/"
Post 部署 Federated GraphQL 服务,您可能需要 运行 apollo/rover CLI service:push 命令来更新写入模式注册表的模式,然后被推送到上行链路 URL 由网关定期轮询:
npx apollo service:push --graph=<graph id> --key=service:<graph id>:<hash> --variant=<environment name> --serviceName=<service name> --serviceURL=<URL of your service with /graphql path> --endpoint=<URL of your service with /graphql path>
您可以在 supergraphSdl
配置中添加 pollIntervalInMs
选项。
这将在每个时间间隔内再次自动轮询服务。
@Module({
imports: [
GraphQLModule.forRootAsync<ApolloGatewayDriverConfig>({
driver: ApolloGatewayDriver,
useFactory: async () => ({
server: {
path: '/graphql',
cors: true
},
gateway: {
supergraphSdl: new IntrospectAndCompose({
subgraphs: [
{ name: 'example-service', url: 'http://localhost:8081/graphql' },
],
pollIntervalInMs: 15000,
})
},
})
})
],
})
export class AppModule {}
问题
在联邦嵌套应用程序中,网关收集来自其他服务的所有模式并形成一个完整的图。问题是,如何在子模式更改后重新运行模式集合?
当前解决方法
重启网关解决问题,但似乎不是一个优雅的解决方案。
其他资源
- Apollo 服务器支持 managed federation,这实际上恢复了网关和服务之间的依赖关系。遗憾的是我找不到任何与 NestJS 相关的内容。
当使用NestJS配置网关应用,并且已经集成了Apollo studio时,则不需要在GraphQLGatewayModule中定义任何serviceList。你的模块初始化应该是这样的:
GraphQLGatewayModule.forRootAsync({
useFactory: async () => ({
gateway: {},
server: {
path: '/graphql',
},
}),
})
应在托管网关应用程序的计算机上声明以下环境变量:
APOLLO_KEY: "service:<graphid>:<hash>"
APOLLO_SCHEMA_CONFIG_DELIVERY_ENDPOINT: "https://uplink.api.apollographql.com/"
Post 部署 Federated GraphQL 服务,您可能需要 运行 apollo/rover CLI service:push 命令来更新写入模式注册表的模式,然后被推送到上行链路 URL 由网关定期轮询:
npx apollo service:push --graph=<graph id> --key=service:<graph id>:<hash> --variant=<environment name> --serviceName=<service name> --serviceURL=<URL of your service with /graphql path> --endpoint=<URL of your service with /graphql path>
您可以在 supergraphSdl
配置中添加 pollIntervalInMs
选项。
这将在每个时间间隔内再次自动轮询服务。
@Module({
imports: [
GraphQLModule.forRootAsync<ApolloGatewayDriverConfig>({
driver: ApolloGatewayDriver,
useFactory: async () => ({
server: {
path: '/graphql',
cors: true
},
gateway: {
supergraphSdl: new IntrospectAndCompose({
subgraphs: [
{ name: 'example-service', url: 'http://localhost:8081/graphql' },
],
pollIntervalInMs: 15000,
})
},
})
})
],
})
export class AppModule {}