250x250
Notice
Recent Posts
Recent Comments
관리 메뉴

탁월함은 어떻게 나오는가?

[Rabbitmq] Nest.js로 rabbitmq 테스트 해보기 본문

[Snow-ball]server/devOps

[Rabbitmq] Nest.js로 rabbitmq 테스트 해보기

Snow-ball 2023. 5. 22. 16:52
반응형

오늘은 Nest.js로 rabbit-mq 테스트를 진행해보겠다.

이번에는 docker compose를 말고 docker로 사용해보았다.

 

 

 


 

 

 

Test Start!!!

 

1) docker 를 사용하기 위해 terminal에 다음과 같은 명령어 3가지를 순서대로 사용해준다.

1
2
3
4
5
docker pull rabbitmq
 
docker run --15672:15672 -5672:5672 --name rabbitmq rabbitmq
 
docker exec rabbitmq rabbitmq-plugins enable rabbitmq_management
cs

 

2) nest.js CLI install

1
npm i -g @nestjs/cli
cs

 

3) Producer API를 위한 nest.js 프로젝트 생성

- 개인적으로 npm을 선호하기 때문에 npm tkdyd yarn을 사용해도 무관하다.

1
nest new producer
cs

 

4) 생성된 프로젝트에 RabbitMQ와 microservies 설치해준다.

1
npm i --save amqplib amqp-connection-manager
cs
1
npm i --save @nestjs/microservices
cs

 

 

Producer 프로젝트

5) app.module.ts 파일에서 모듈을 설정해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ClientsModule, Transport } from '@nestjs/microservices';
 
@Module({
  imports: [
    ClientsModule.register([
      {
        name'GREETING_SERVICE',
        transport: Transport.RMQ,
        options: {
          urls: ['amqp://localhost:5672'],
          queue: 'books_queue',
          queueOptions: {
            durable: false,
          },
        },
      },
    ]),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
cs

 

6) Conteroller에서 @Get('rmq-test') 를 사용해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import { Controller, Get, Inject } from '@nestjs/common';
import { AppService } from './app.service';
import { ClientRMQ } from '@nestjs/microservices';
 
@Controller()
export class AppController {
  constructor(
    private readonly appService: AppService,
    @Inject('GREETING_SERVICE'private readonly client: ClientRMQ,
  ) {}
 
  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
 
  @Get('rmq-test')
  testRmq() {
    const data = {
      type: 'object',
      properties: {
        Header: {
          type: 'object',
          properties: {
            HttpStatusCode: {
              type: 'integer',
            },
          },
          required: ['HttpStatusCode'],
        },
        Body: {
          type: 'object',
          properties: {
            Message: {
              type: 'string',
            },
          },
          required: ['Message'],
        },
      },
      required: ['Header''Body'],
    };
    return this.client.emit('medium.rock', data);
  }
}
cs

 

 

 

Consumer 프로젝트

7) Producer 프로젝트를 만들었을 때와 마찬가지로 cli를 사용해준다.

1
nest new consumer
cs

 

8) 생성된 프로젝트에 rabbit-mq와 microservies를 설치해준다.

1
2
3
npm i --save amqplib amqp-connection-manager
 
npm i --save @nestjs/microservices
cs

 

9) main.ts 에 아래와 같이 코드를 입력해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
 
async function bootstrap() {
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(
    AppModule,
    {
      transport: Transport.RMQ,
      options: {
        urls: ['amqp://localhost:5672'],
        queue: 'books_queue',
        noAck: false,
        queueOptions: {
          durable: false,
        },
      },
    },
  );
  await app.listen();
}
bootstrap();
cs

 

10) app.controller.ts 에 아래와 같이 코드를 입력해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
import {
  Ctx,
  EventPattern,
  MessagePattern,
  Payload,
  RmqContext,
from '@nestjs/microservices';
 
@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}
 
  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
 
  @EventPattern('medium.rock')
  readMessage(@Payload() data: any, @Ctx() context: RmqContext) {
    const channel = context.getChannelRef();
    const originalMsg = context.getMessage();
 
    console.log('data: ', data);
    channel.ack(originalMsg);
  }
}
cs

 

11) 브라우저 주소창에 다음과 같이 입력하면 RabbitMQ Management 에 접속이 가능하다.

- 처음 셋팅은 ID: guest, Password: guest 이다. 추후에는 변경해야한다.

1
http://localhost:15672/
cs

 

12) 다음과 같은 화면을 보여준다.

 

13) Producer/Consumer 프로젝트를 npm run start:dev 를 해준다. 그리고 나서 curl을 사용해서 query를 날려준다. 

 

그러면 Consumer 프로젝트에서 다음을 확인할 수 있다.

 

RabbitMQ Management에서는 Connections: 2로 연결이 확인 된다.

 

 

 

 

 

reference

* Saurabh Dashora, How to create a NestJS RabbitMQ Microservice?

 

 

반응형
Comments