You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS创建多微服务时如何避免重复依赖解析

NestJS 多微服务重复依赖解析问题解决方案

问题分析

你的代码先后调用了NestFactory.createApplicationContext()和NestFactory.createMicroservice(),这会生成两个完全独立的DI容器,导致所有模块(ConfigModule、MongooseModule等)和业务服务被重复实例化——从日志里能明显看到两次User service is being initialized以及完整的模块初始化流程重复执行。这种方式还额外带来了配置获取与微服务初始化的耦合问题。

解决方案

采用NestJS官方推荐的主应用+多微服务挂载模式,让所有微服务共享同一个主DI容器,既能保留原生@MessagePattern等特性,又彻底避免依赖重复解析,同时可以正常从ConfigModule获取配置。

修改后的代码示例

async function bootstrap() {
  // 创建主应用实例(无需额外创建ApplicationContext)
  const app = await NestFactory.create(AppModule, {
    // 可选:如果不需要HTTP服务,可禁用端口监听,仅作为微服务宿主
    logger: ['log', 'error', 'warn'],
  });

  // 直接从主应用DI容器获取ConfigService
  const configService = app.get(ConfigService);
  
  // 挂载微服务,复用主应用的DI容器
  app.connectMicroservice<MicroserviceOptions>({
    transport: Transport.RMQ,
    options: {
      urls: [configService.get<string>(ConfigPropertyNames.RABBITMQ_URI)],
      queue: QueueNames.AUTH_SERVICE_RPC,
      queueOptions: {
        durable: false
      },
    },
  });

  // 启动所有挂载的微服务
  await app.startAllMicroservices();
  // 若需要同时运行HTTP服务,保留下面的代码;不需要则注释
  // await app.listen(process.env.PORT || 3000);
  
  Logger.log(`🚀 微服务已启动`);
}

关键改动说明

  • 仅创建一次主应用实例,所有微服务通过app.connectMicroservice()挂载,共享同一个DI容器,依赖只会初始化一次。
  • 主应用初始化完成后,直接从容器中获取ConfigService,无需额外创建ApplicationContext。
  • 使用app.startAllMicroservices()统一启动所有微服务,若需HTTP服务可保留app.listen()。

验证效果

修改后运行日志只会出现一次模块初始化流程,User service is being initialized也仅打印一次,同时微服务能正常处理@MessagePattern定义的消息。

内容的提问来源于stack exchange,提问作者Illia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:27:39