如何在 NestJS 中热重载联邦网关

how to hot reload federation gateway in NestJS

问题

在联邦嵌套应用程序中,网关收集来自其他服务的所有模式并形成一个完整的图。问题是,如何在子模式更改后重新运行模式集合?

当前解决方法

重启网关解决问题,但似乎不是一个优雅的解决方案。

其他资源

  1. 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 {}