我使用 TCP 协议构建了一个 Http 应用程序和 2 个微服务。
这是我的应用图。
// Http App/app.service.ts
constructor() {
this.accountService = ClientProxyFactory.create({
transport: Transport.TCP,
options: {
host: 'localhost',
port: 8877,
},
});
this.friendService = ClientProxyFactory.create({
transport: Transport.TCP,
options: {
host: 'localhost',
port: 8080,
},
});
}
我尝试通过 @Messagepattern()
将消息从帐户服务发送到朋友服务。
ClientProxy 设置每个服务。但它不起作用。
我阅读了官方文档 @nestjs/microservices
,但我不知道哪个合适。
是否有正确的方法将消息从一个微服务发送到另一个微服务?
答案 0 :(得分:1)
您需要设置一个消息代理,例如 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);
}
现在,当客户端使用 myqueue
模式在 my_pattern
上发送消息时,客户端发送的数据将是来自 data
注释的 @playload()
。
要在任何队列上发送消息,您需要将 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();
为您的两个微服务设置上述所有配置,它就会工作。