Nest.js는 Microservices 아키텍처를 지원하며, TCP, Redis, MQTT, NATS, RabbitMQ, gRPC와 같은 다양한 메시지 전송 전략을 사용할 수 있습니다.
@nestjs/microservices
설치하려는 @nestjs/microservices버전이 @nestjs/common 또는 @nestjs/core와 일치하지 않다면 설치되지 않습니다. 버전 충돌로 인한 오류가 발생한다면 모든 NestJS 관련 패키지를 최신 버전으로 일괄 업데이트하면 해결될 수 있습니다. chaining commands로 한번에 설치합니다.
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { AppController } from './app.controller';
@Module({
imports: [
ClientsModule.register([
{
name: 'MATH_SERVICE',
transport: Transport.TCP,
options: {
host: 'localhost',
port: 3001,
},
},
]),
],
controllers: [AppController],
})
export class AppModule {}
MATH_SERVICE라는 이름의 마이크로서비스를 등록하고, TCP 전송을 사용하여 localhost의 3001 포트로 메시지를 전송합니다. 이 설정은 애플리케이션에서 이 마이크로서비스를 호출할 때 사용됩니다.
import { Controller, Get } from '@nestjs/common';
import { Client, ClientProxy, Transport } from '@nestjs/microservices';
import { Observable } from 'rxjs';
@Controller()
export class AppController {
@Client({ transport: Transport.TCP, options: { host: 'localhost', port: 3001 } })
client: ClientProxy;
@Get()
call(): Observable<number> {
const pattern = { cmd: 'sum' };
const payload = [1, 2, 3, 4, 5];
return this.client.send<number>(pattern, payload);
}
}
Client
데코레이터를 사용하여 TCP를 통해 메시지를 전송하는 ClientProxy를 주입합니다. 그리고 나서, GET 요청이 들어올 때마다, { cmd: 'sum' } 패턴과 함께 payload를 전송하는 call 메서드를 실행합니다.
이렇게 하면, TCP를 통해 MATH_SERVICE 마이크로서비스로 메시지를 전송할 수 있게 됩니다. 이 메시지는 { cmd: 'sum' } 패턴을 처리하는 핸들러에 의해 받아들여지고 처리됩니다.
@Module에서는 마이크로서비스 클라이언트를 설정하고 등록합니다. 이 설정은 애플리케이션 전반에 걸쳐 사용될 수 있습니다.
@Controller에서는 특정 컨트롤러 내에서 이러한 마이크로서비스를 호출하기 위해 ClientProxy 인스턴스를 생성하고 설정합니다.