您需要设置一个消息代理,例如 RabbitMQ 或 Kafka,即对于 RabbitMQ,输入以下命令并创建一个 RabbitMQ 容器。
docker run -it --rm --name rabbitmq -p 0.0.0.0:5672:5672 -p 0.0.0.0:15672:15672 -d rabbitmq:3-management
然后将 RabbitMQ 选项传递给您的 main.ts 引导函数:
async function bootstrap() {
const rabbitmqPort = 5672
const rabbitmqHost = 127.0.0.1
const app = await NestFactory.create(AppModule);
app.connectMicroservice<MicroserviceOptions>({
transport: Transport.RMQ,
options: {
urls: [
`amqp://${rabbitmqHost}:${rabbitmqPort}`,
],
queue: 'myqueue',
queueOptions: {
durable: false,
},
},
});
app
.startAllMicroservices(() => {
logger.log('Microservice is listening!');
})
.listen(3000, () => {
logger.log('Api Server is listening on 3000');
});
}
bootstrap();
用于接收消息:
@MessagePattern('my_pattern')
async myController(
@Payload() data: MYDTO,
): Promise<MY TYPE> {
return await this.accountService.myFunction(data);
}
现在,当客户端使用my_pattern 模式在myqueue 上发送消息时,客户端发送的数据将是来自@playload() 注释的data。
要在任何队列上发送消息,您需要将 RabbitMQ 配置添加到您的应用程序模块,即 account.module.ts,假设您要在 FriendService 上发送消息
const rabbitmqPort = 5672
const rabbitmqHost = 127.0.0.1
@Module({
imports: [
ClientsModule.registerAsync([
{
name: 'Friend',
useFactory: {
transport: Transport.RMQ,
options: {
urls: [
`amqp://${rabbitmqHost}:${rabbitmqPort}`,
],
queue: 'friend_queue',
queueOptions: {
durable: false,
},
},
}
},
]),
],
controllers: [AccountController],
providers: [AccountService],
})
export class AccountModule {}
然后像这样将Friend 客户端注入到您的服务构造函数中:
@Inject('Friend')
private friendClient: ClientProxy,
这样发送消息:
const myVar = await this.friendClient.send('Some_pattern', {SOME DATA}).toPromise();
为您的两个微服务设置上述所有配置,它应该可以工作。