如何通过NATS服务器实现Nestjs网关调用Moleculer服务动作
实现方案
模式选择
直接使用请求-响应模式即可,你不需要手动实现NATS底层的主题收发逻辑:Moleculer框架的传输层已经基于NATS封装好了服务发现、动作调用的整套请求-响应逻辑,直接用封装好的能力即可。
配置步骤
1. 配置Moleculer服务的NATS传输器
打开你的Moleculer项目中的moleculer.config.js配置文件,修改传输器配置指向本地NATS服务:
module.exports = { // 其他原有配置保留 transporter: "nats://localhost:4222", };
配置完成后重启Moleculer服务,服务会自动连接本地NATS并注册动作。
2. 配置Nestjs网关的Moleculer模块
你已经安装了所需依赖,不需要额外安装包。在Nestjs项目的根模块(通常是app.module.ts)中注册Moleculer模块,配置NATS连接:
import { Module } from '@nestjs/common'; import { MoleculerModule } from 'nestjs-moleculer'; @Module({ imports: [ MoleculerModule.forRoot({ transporter: 'nats://localhost:4222', // 其他Moleculer配置和你Moleculer服务保持一致即可,无特殊需求用默认配置即可 }), // 其他你原有导入的模块保留 ], // 原有controller、provider配置保留 }) export class AppModule {}
3. 在Nestjs中调用Moleculer动作
在需要调用Moleculer服务的Controller/Service中注入Moleculer客户端,直接调用对应动作即可,示例代码如下:
import { Controller, Get, Post, Body } from '@nestjs/common'; import { MoleculerService } from 'nestjs-moleculer'; @Controller('items') export class ItemsController { constructor(private readonly moleculerService: MoleculerService) {} @Post() async createItem(@Body() data: any) { // 第一个参数格式为 你的Moleculer服务名.动作名,第二个参数为传递的参数 return this.moleculerService.call('my-project.create', data); } @Get() async getItems() { return this.moleculerService.call('my-project.list', {}); } }
注意把上面的服务名、动作名替换为你实际在Moleculer服务中定义的名称。
4. 前置验证
启动服务前先确认NATS服务正常运行,执行以下命令检查状态:
sudo snap services nats
如果状态不是active,执行启动命令:
sudo snap start nats
启动顺序建议先启动Moleculer服务,再启动Nestjs网关,即可通过网关的API接口调用Moleculer的动作。
内容的提问来源于stack exchange,提问作者MrMz
相关产品推荐
相关产品推荐

