🔥 공부했던 이론을 바탕으로 프로젝트 실습을 진행해 보자!
- RabbitMQ 이론 정리
😺 Blog: https://happy-coding.tistory.com/24
[ RabbitMQ 실행 확인 ]
- 도커에서 RabbitMQ 설치
docker run -d --name rabbitmq -p5672:5672 -p 15672:15672 --restart=unless-stopped rabbitmq:management
- 도커에서 RabbitMQ 실행 확인
- localhost:15672에 접속
- RabbitMQ 로그인 페이지
- Username및 Password에 guest/guest를 입력하여 접속하면 대시보드를 볼 수 있습니다.
[ RabbitMQ 실습 ]
[ OrderApplication ]
- order Producer 설정
Dependencies
application.properties
spring.application.name=order
# exchange, queue 이름 지정
message.exchange=market
message.queue.product=market.product
message.queue.payment=market.payment
# RabbitMQ 관련 설정
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
QueueConfig
@Configuration
public class OrderApplicationQueueConfig {
@Value("${message.exchange}")
private String exchange;
@Value("${message.queue.product}")
private String queueProduct;
@Value("${message.queue.payment}")
private String queuePayment;
// exchange 생성
@Bean public TopicExchange exchange() { return new TopicExchange(exchange); }
// queue.product 생성
@Bean public Queue queueProduct() { return new Queue(queueProduct); }
// queue.payment 생성
@Bean public Queue queuePayment() { return new Queue(queuePayment); }
// binding: exchange 에서 queue 로 이동하는 통로 / 큐와 바인딩의 이름(라우팅 키)을 일치시켜서 헷갈리지 않게 하자!
@Bean public Binding bindingProduct() { return BindingBuilder.bind(queueProduct()).to(exchange()).with(queueProduct); }
@Bean public Binding bindingPayment() { return BindingBuilder.bind(queuePayment()).to(exchange()).with(queuePayment); }
}
- exchange 생성
- market.product 큐 생성
- market.payment 큐 생성
- exchange, Queue 바인딩 설정
OrderService
// RabbitTemplate: RabbitMQ로 요청을 보낼 때 사용
private final RabbitTemplate rabbitTemplate;
public void createOrder(String orderId) {
// marker.product 큐로 orderId 전송
rabbitTemplate.convertAndSend(productQueue, orderId);
// marker.payment 큐로 orderId 전송
rabbitTemplate.convertAndSend(paymentQueue, orderId);
[ 실행 결과 ]
- order/1로 요청 보내기 (2번)
- http://localhost:15672로 접속하여 RabbitMQ의 생성된 Exchange와 Queue 를 확인
- market.payment 를 클릭해서 세부정부 보기
exchange 생성
Queue 생성
- Total, Ready에 메시지가 2개가 있는 모습을 볼 수 있다.
- 아직 Consumer를 생성 및 연결하지 않아 Queue에 데이터가 쌓여있는 모습을 볼 수 있다.
세부 정보
- market.payment 를 클릭해서 세부정부 보기
[ PaymentApplication ]
- payment Consumer 설정
Dependencies
application.properties
- payment Consumer에서는 본인에게 해당하는 Queue의 이름만 알고 있으면 됩니다.
spring.application.name=payment
# payment Consumer 에서는 본인에게 해당하는 Queue의 이름만 알고 있으면 된다
message.queue.payment=market.payment
# RabbitMQ 관련 설정
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
PaymentEndpoint
@Value("${spring.application.name}")
public String appName;
// RabbitMQ에서 메시지를 수신하기 위해 사용하는 기능 / 지정된 큐로부터 메시지를 받아 처리
@RabbitListener(queues = "${message.queue.payment}")
public void receiveMessage(String orderId){ // 큐로부터 orderId 값을 받는다
log.info("receive OrderId: {}, appName: {}", orderId, appName);
}
[ 실행 결과 ]
- PaymentApplication Run
- 터미널 로그 확인
- http://localhost:15672 접속 후 Queue 확인
터미널 로그 확인
http://localhost:15672 접속 후 Queue 확인
[ ProductApplication ]
- OrderApplication과 같은 방식으로 코드를 생성
- ProductApplication을 복사하여 라운드로빈 방식을 이용
- /order/1 ~ /order/6까지 요청하여 라운드로빈 방식으로 큐의 메시지를 받아오는지 확인
ProductApplication을 복사
/order/1 ~ /order/6까지 요청하여 라운드로빈 방식으로 큐의 메시지를 받아오는지 확인
[ 정리 ]
order(Producer)에서 exchange, binding, queue를 설정해 주고, Consumer에서 본인에게 해당하는 큐를 연결하여 Queue에 들어있는 메시지 데이터를 받아와 Log를 통하여 확인해 보았다.
추가로 Product(Consumer)는 큐에 들어있는 메시지를 라운드로빈 방식을 통하여 가져오는 것을 로그을 통하여 확인해 보았다.
역시 이론만 공부하기보다는 실습을 통하여 직접 사용해 봐야지, 해당 기술에 대해 감이 더 잘 잡히는 것 같다.
개인적으로 RabbitMQ는 다른 기술에 비해서 상당히 재미있게 실습한 것 같다.
읽어주셔서 감사합니다 😊
'해피 코딩 > Spring' 카테고리의 다른 글
[MSA] Spring Cloud Config (0) | 2024.09.28 |
---|---|
Layered Architecture Pattern? 그게 뭔데! (0) | 2024.08.15 |
[Redis] Spring Boot 프로젝트에 캐싱 적용하기 (0) | 2024.08.13 |
[MSA] API 게이트웨이 Spring Cloud Gateway (0) | 2024.08.05 |
[MSA] 로드 밸런싱 Ribbon (0) | 2024.08.04 |