MSA 구축 (4) - Spring Cloud Bus와 RabbitMQ를 활용한 Config 변경 자동 반영 설정

오형상·2024년 11월 23일
0

Ficket

목록 보기
4/27
post-thumbnail

지난 시간에는 Config 서버 생성 및 설정을 진행하였습니다.

하지만 실행 중인 MSA(Microservices Architecture) 애플리케이션들이 Config 서버와 연결되어 있는 상황에서, Git에 저장된 user-service-local.yml 파일의 내용이 변경되었다고 가정해봅시다.

이 경우 Config Server는 즉시 변경된 내용을 반영할 수 있습니다.
그러나 실행 중인 애플리케이션들은 이러한 변경 사항을 자동으로 반영하지 않기 때문에,
새로운 설정이 애플리케이션에 어떻게 적용될지를 고민해야 합니다.

이를 해결할 수 있는 방법으로는 다음과 같은 방안들이 있습니다

1. Spring Cloud Config Server와 Actuator를 이용한 Refresh

Spring Cloud Config Server를 사용하는 경우, @RefreshScope 어노테이션을 통해 특정 Bean이나 설정을 동적으로 업데이트할 수 있습니다.

동작 방식:
1. Config Server에서 설정 파일을 변경합니다.
2. 실행 중인 MSA에 HTTP POST 요청을 보내 /actuator/refresh 엔드포인트를 호출합니다.
3. 해당 MSA는 변경된 설정을 다시 로드하고 이를 반영합니다.

장점:

  • 즉시 변경 사항을 반영할 수 있습니다.
  • 특정 설정만 리프레시할 수 있어 효율적입니다.

단점:

  • 모든 마이크로서비스에 수동으로 호출해야 합니다.
  • 호출 프로세스를 자동화하지 않을 경우 번거로울 수 있습니다.

2. Spring Cloud Bus를 이용한 자동화

Spring Cloud Bus는 메시지 브로커(RabbitMQ, Kafka 등)를 통해 설정 변경 사항을 자동으로 전파합니다.

동작 방식:
1. Config Server에서 설정 파일을 변경합니다.
2. Config Server가 메시지 브로커에 변경 이벤트를 전파합니다.
3. 메시지를 수신한 각 마이크로서비스는 /actuator/refresh를 자동으로 호출하여 변경 사항을 반영합니다.

장점:

  • 메시지 기반으로 변경 사항이 자동 전파됩니다.
  • 대규모 마이크로서비스 환경에서도 효과적입니다.

단점:

  • 메시지 브로커(RabbitMQ, Kafka 등)를 추가로 설정해야 합니다.
  • 메시지 브로커의 복잡성이 증가할 수 있습니다.

3. 애플리케이션 재시작

가장 간단한 방법으로, 마이크로서비스를 재시작하여 변경된 설정을 로드합니다.

장점:

  • 별도의 추가 설정 변경 로직이 필요하지 않습니다.

단점:

  • 서비스 중단이 발생할 수 있습니다.
  • 재시작 시간에 따라 지연이 발생할 수 있습니다.

위 방법들 중에서 Spring Cloud Bus를 활용하여 변경 사항을 자동으로 반영하도록 설정하려 합니다.
Spring Cloud Bus는 메시지 브로커를 통해 변경 사항을 효율적으로 전달하며, 대규모 환경에서도 관리가 용이합니다.


적용 과정

1. RabbitMQ 설치

RabbitMQ를 실행하려면 Docker를 사용할 수 있습니다.

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management

RabbitMQ 관리 UI는 http://localhost:15672에서 접근 가능하며, 기본 사용자/비밀번호는 아래와 같습니다:

  • 사용자: guest
  • 비밀번호: guest

2. Config 서버 수정

2-1. 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'

2-2. application.yml 수정

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

management:
  endpoints:
    web:
      exposure:
        include: refresh, health, beans, busrefresh

3. 각 마이크로서비스 수정

3-1. 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'

3-2. 설정 파일 수정

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

management:
  endpoints:
    web:
      exposure:
        include: refresh, health, beans, busrefresh

4. Spring Cloud Config Monitor와 GitHub Webhooks 설정

Webhook 설정

Ngrok 사용

Webhook에 ngrok URL을 등록합니다:


5. 테스트

user-service에 테스트 로직 추가

@GetMapping("/health_check")
public String status(Authentication authentication) {
    log.info("email : {}", authentication.getName());
    return String.format("It's Working in User Service"
        + ", port(local.server.port) = " + env.getProperty("local.server.port")
        + ", token refresh time = " + env.getProperty("jwt.refresh.expiration"));
}

서버 실행 후 현재 값 확인

수정된 yml 적용 후 확인

  1. token refresh 값을 0으로 변경 후 Git에 푸쉬.

  2. Webhook을 통해 POST /monitor 요청이 온것을 확인:

  3. Postman으로 테스트하여 변경된 값이 반영된 것을 확인:

이제 Git Repository에서 설정을 변경하면 서버 재시작, 수동 API 요청 없이 변경 사항을 자동으로 반영할 수 있습니다.
다만, Git Repository에 민감한 정보(jwt.token, db 정보 등)가 노출되는 문제가 있습니다.

다음 시간에는 비대칭 키를 활용한 암호화와 복호화 설정에 대해 다루겠습니다.


Reference

0개의 댓글