Nodejs Nestjs微服务插件@nestjs/microservices的使用

Nodejs Nestjs微服务插件@nestjs/microservices的使用
在Node.js中使用NestJS框架的[@nestjs](/user/nestjs)/microservices插件来构建微服务应用是一个非常优雅且高效的方式。这个插件允许你轻松地创建、发布和订阅消息,支持多种传输机制(如RabbitMQ、Kafka等)。下面我会带你快速了解如何开始使用。

1. 安装必要的依赖

首先,你需要安装[@nestjs](/user/nestjs)/microservices以及选择一个消息代理客户端库(例如RabbitMQ的amqplib):

npm install [@nestjs](/user/nestjs)/microservices amqplib

2. 创建微服务应用

2.1 初始化项目

如果你还没有NestJS项目,可以使用以下命令初始化:

nest new microservice-app
cd microservice-app

2.2 创建微服务模块

在NestJS中,你可以为每个微服务创建独立的模块。使用nest g module products命令生成一个名为products的新模块。

nest g module products

2.3 配置微服务

接下来,在你的products模块中配置微服务。你可以使用[@nestjs](/user/nestjs)/microservices提供的ClientProxyFactory或直接通过配置文件进行配置。

import { Module } from '[@nestjs](/user/nestjs)/common';
import { ClientsModule, Transport } from '[@nestjs](/user/nestjs)/microservices';

@Module({
  imports: [
    ClientsModule.register([
      {
        name: 'PRODUCTS_SERVICE',
        transport: Transport.RMQ,
        options: {
          urls: ['amqp://localhost:5672'], // RabbitMQ地址
          queue: 'products_queue',
          queueOptions: {
            durable: false
          },
        },
      },
    ]),
  ],
  providers: [],
})
export class ProductsModule {}

3. 创建控制器和服务

3.1 创建服务

使用nest g service products命令创建一个服务,用于处理业务逻辑。

nest g service products

3.2 创建控制器

使用nest g controller products命令创建一个控制器,用于接收外部请求并调用服务。

nest g controller products

4. 发布事件或消息

在服务中,你可以使用@Inject注入的ClientProxy来发送消息。

import { Injectable, OnModuleInit } from '[@nestjs](/user/nestjs)/common';
import { ClientProxy } from '[@nestjs](/user/nestjs)/microservices';

@Injectable()
export class ProductsService implements OnModuleInit {
  constructor(private readonly client: ClientProxy) {}

  onModuleInit() {
    this.client.connect();
  }

  sendMessage(message: any) {
    return this.client.emit('create_product', message);
  }
}

5. 订阅消息

在其他微服务中,你可以订阅这些消息。

import { MessagePattern } from '[@nestjs](/user/nestjs)/microservices';

export class CreateProductDto {
  name: string;
}

export class ProductsController {
  @MessagePattern({ cmd: 'create_product' })
  createProduct(data: CreateProductDto) {
    // 处理产品创建逻辑
  }
}

以上就是使用[@nestjs](/user/nestjs)/microservices的基本步骤。你可以根据需要调整配置和代码以适应不同的场景和需求。


3 回复

当然!@nestjs/microservices 是 NestJS 提供的一个强大工具,用于构建微服务。想象一下,你正在搭建一个巨大的乐高城堡,每个小块都是一个微服务。@nestjs/microservices 就像是你的超级胶水,把它们粘在一起。

首先,你需要安装它:

npm install @nestjs/microservices

然后,在你的模块中,你可以创建一个微服务:

import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { Module } from '@nestjs/common';

@Module({
  // 其他配置...
})
export class ApplicationModule {
  @nestjs/microservices
  configureMicroservice(): MicroserviceOptions {
    return {
      transport: Transport.KAFKA,
      options: {
        client: {
          brokers: ['localhost:9092'],
        },
        consumer: {
          groupId: 'nest-group',
        },
      },
    };
  }
}

这里我们用 Kafka 作为传输层,但你也可以选择 RabbitMQ 或其他你喜欢的。现在,你可以开始发送和接收消息了,就像是在微服务的世界里玩传递纸条游戏!

希望这能帮到你,如果有更多问题,欢迎继续提问!


当然可以。@nestjs/microservices 是 NestJS 提供的一个模块,用于创建和消费微服务。它支持多种传输层技术,比如 RabbitMQ、Kafka、Redis、NATS 等。

下面是一个简单的示例,展示如何使用 NestJS 创建一个基于 RabbitMQ 的微服务应用。

1. 安装必要的依赖

首先,你需要安装 @nestjs/microservices 和 RabbitMQ 客户端库(例如 amqplib):

npm install @nestjs/microservices amqplib

2. 创建一个微服务应用

接下来,我们将创建一个基本的 NestJS 应用,并配置它以使用 RabbitMQ 作为传输层。

2.1 创建微服务模块

import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';

@Module({
  imports: [
    ClientsModule.register([
      {
        name: 'PRODUCT_SERVICE',
        transport: Transport.RMQ,
        options: {
          urls: ['amqp://localhost:5672'],
          queue: 'product_queue',
          queueOptions: {
            durable: false
          },
        },
      },
    ]),
  ],
  providers: [],
})
export class AppModule {}

在这个例子中,我们创建了一个客户端模块 ClientsModule,并注册了一个客户端,该客户端使用 RabbitMQ 作为传输层,并连接到本地的 RabbitMQ 服务器。queue 是消息队列的名称,queueOptions.durable 设置为 false 表示消息队列不是持久化的。

2.2 创建一个服务来处理消息

接下来,我们需要创建一个服务来处理从 RabbitMQ 队列接收到的消息。

import { Injectable } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';

@Injectable()
export class ProductsService {

  constructor(private readonly client: ClientProxy) {}

  handleCreateProduct(product: any) {
    console.log('Received product:', product);
    // 处理逻辑...
  }

  onModuleInit() {
    this.client.listen('product_queue').subscribe((product) => this.handleCreateProduct(product));
  }
}

在这个服务中,我们定义了一个方法 handleCreateProduct 来处理接收到的产品数据。onModuleInit 方法会在模块初始化时被调用,这里我们订阅了 product_queue 队列的消息,并将每个消息传递给 handleCreateProduct 方法进行处理。

3. 运行微服务

确保你的 RabbitMQ 服务正在运行。然后,你可以通过运行以下命令启动微服务:

npm run start:dev

这将启动你的 NestJS 微服务,监听 RabbitMQ 队列中的消息,并在接收到新消息时调用相应的处理函数。

以上就是一个简单的 NestJS 微服务应用的基本结构。你可以根据需要调整队列名称、RabbitMQ 服务器地址等参数。希望这个示例对你有所帮助!

@nestjs/microservices 是 NestJS 提供用于构建微服务的应用模块。首先安装此包:

npm install @nestjs/microservices --save

然后,在你的模块文件中导入 MicroserviceModule,并配置服务。例如,使用RabbitMQ:

import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';

@Module({
  imports: [
    ClientsModule.register([
      {
        name: 'PRODUCT_SERVICE',
        transport: Transport.RMQ,
        options: {
          urls: ['amqp://localhost:5672'],
          queue: 'product_queue',
          queueOptions: {
            durable: false
          },
        },
      },
    ]),
  ],
})
export class ApplicationModule {}

创建一个控制器来处理传入消息:

import { Controller, Payload, MessagePattern } from '@nestjs/microservices';

@Controller()
export class AppController {
  @MessagePattern({ cmd: 'hello' })
  getHello(@Payload() data: any): string {
    return `Hello ${data.name}`;
  }
}

最后,你可以通过调用客户端来发送消息给该微服务:

const client = ClientProxyFactory.create({
  transport: Transport.RMQ,
  options: {
    urls: ['amqp://localhost:5672'],
    queue: 'product_queue',
  },
});
client.connect();
client.emit({ cmd: 'hello' }, { name: 'world' });
回到顶部