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

xia*_*iao 2 graphql nestjs apollo-federation

问题

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

当前的解决方法

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

其他资源

  1. Apollo 服务器支持托管联合,这本质上恢复了网关和服务之间的依赖关系。遗憾的是我找不到任何与 NestJS 相关的内容。

pra*_*ena 5

当使用 NestJS 配置网关应用程序时,并且已经与 Apollo studio 集成时,则无需在 GraphQLGatewayModule 中定义任何 serviceList。您的模块初始化应如下所示:

GraphQLGatewayModule.forRootAsync({
  useFactory: async () => ({
    gateway: {},
    server: {
      path: '/graphql',
    },
  }),
})
Run Code Online (Sandbox Code Playgroud)

应在托管网关应用程序的计算机上声明以下环境变量:

APOLLO_KEY: "service:<graphid>:<hash>"
APOLLO_SCHEMA_CONFIG_DELIVERY_ENDPOINT: "https://uplink.api.apollographql.com/"
Run Code Online (Sandbox Code Playgroud)

部署 Federated GraphQL 服务后,您可能需要运行 apollo/rover CLI 服务:如下所示的 push 命令来更新写入 schema 注册表的 schema,然后推送到由网关定期轮询的上行链路 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>
Run Code Online (Sandbox Code Playgroud)