이번 챕터에서는 Spring Boot Actuator와 Spring Cloud Config를 사용하여 런타임에 마이크로서비스의 구성 속성을 동적으로 새로고침하는 방법을 배웁니다.
이 방법은 마이크로서비스를 다시 시작하지 않고도 구성 속성을 업데이트할 수 있도록 해줍니다. 이제 그 과정을 단계별로 설명하겠습니다.
먼저, 각 마이크로서비스의 pom.xml 파일에 Spring Boot Actuator 의존성이 포함되어 있는지 확인합니다. spring-boot-starter-actuator 의존성은 이미 accounts, cards, loans 마이크로서비스에 추가되어 있어야 합니다.
Spring Cloud Config에서 속성 값을 가져오고 런타임에 속성 값을 업데이트하기 위해, Record 클래스 대신 일반 클래스 사용이 필요합니다. Record 클래스는 필드가 final이므로 객체 생성 후 값을 변경할 수 없기 때문에 일반 클래스로 전환합니다.
AccountsContactInfoDto 클래스
@Getter
@Setter
public class AccountsContactInfoDto {
private String message;
private Map<String, String> contactDetails;
private List<String> onCallSupport;
}
@Getter, @Setter 어노테이션을 추가하여 필드의 Getter와 Setter 메서드를 생성합니다. 이 작업을 LoansContactInfoDto와 CardsContactInfoDto에서도 동일하게 수행합니다.
application.yml 파일에서 Actuator 엔드포인트를 활성화합니다. 기본적으로 Actuator는 모든 엔드포인트를 노출하지 않으므로, 다음과 같은 설정을 추가하여 refresh 엔드포인트를 포함한 모든 관리 엔드포인트를 노출시킵니다.
application.yml
management:
endpoints:
web:
exposure:
include: "*"
이 설정을 모든 마이크로서비스 (accounts, loans, cards)의 application.yml 파일에 추가합니다.
모든 마이크로서비스와 Config 서버를 다시 시작합니다. 이때 변경된 속성이 반영되도록 GitHub 리포지토리에서 속성을 수정하고, 각 마이크로서비스에서 변경된 속성을 반영하도록 Actuator refresh 엔드포인트를 호출합니다.
GitHub 리포지토리의 구성 파일을 수정한 후, 변경된 속성이 반영되었는지 확인합니다.
예시: GitHub 속성 수정
accounts-prod.yml에서 prod 문자열을 production으로 변경합니다.
같은 방식으로 cards-prod.yml과 loans-prod.yml 파일에서도 변경을 적용합니다.
예시: Actuator refresh 엔드포인트 호출 Postman을 사용해 각 마이크로서비스 (accounts, loans, cards)의 actuator/refresh 엔드포인트를 호출합니다.
POST http://localhost:8080/actuator/refresh
이 호출 후, 각 마이크로서비스에서 contact-info API를 다시 호출하면 변경된 속성 값이 반영된 것을 확인할 수 있습니다.
이 방법은 수십 개 이상의 마이크로서비스 인스턴스에서 각각의 refresh 엔드포인트를 수동으로 호출해야 하는 문제가 있습니다.
즉, 모든 마이크로서비스 인스턴스에서 /refresh 를 호출해야함..
이를 해결하기 위해 Jenkins나 CI/CD 파이프라인에서 자동화 스크립트를 작성할 수 있지만, 더 나은 방법을 모색할 필요가 있습니다.
다음 챕터에서는 이러한 한계점을 해결할 수 있는 더 나은 방법을 탐구합니다.