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
相关产品推荐
相关产品推荐

