Spring Cloud Config Server에 문제가 생기면 어떻게 될까?
개요
이전글에서는 "Spring Cloud Config 튜토리얼"을 수행해보면서 Server와 Client 구성을 통해 설정을 동적으로 적용해 보았습니다.
이때 Spring Cloud Config Server가 가질 수 있는 2가지 상황에 대해서 알아보고자 합니다.
- Config Client를 실행하려고 할 때 Config Server에 문제가 있다면 어떻게 될까?
- Config Client가 실행중일 때 Config Server에 문제가 생기면 어떻게 될까?
Config Client를 실행하려고 할 때 Config Server에 문제가 있다면 어떻게 될까?
만약 Client를 실행하려고 할 때 Config Server가 down 되어 있는 경우에는 어떻게 될까요?
예상으로는 정상적으로 실행이 되지 않을 것 같습니다.
직접 실습을 통해 알아보겠습니다.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.localConfig': Injection of autowired dependencies failed
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'test.secret' in value "${test.secret}"
설정 정보를 가져오지 못하여 자연스럽게 Spring Bean 생성시 예외가 발생합니다.
Application시 문제가 생하는 부분은 WARN로그로 탐지할 수 있을 것 같습니다.
고가용성을 위해서 Config Server에서 설정을 불러오지 못하는 경우에도 Application이 실행되면 좋겠어요.. 어떻게 해야 할까요?
test:
secret: client-password
name: client-name
Client의 application.yml에 해당 정보를 지정해주면 됩니다.
이제 서버는 정상적으로 기동되며 endpoint로 호출 시 client-password와 client-name이 출력되는 것을 확인할 수 있습니다.
단, 주의해야 할 점이 2가지 있습니다.
spring.cloud.config.fail-fast=true
spring.config.import: optional:configserver:http://localhost:8088
optional 부분이 빠져있거나, fail-fase 옵션의 설정이 true 인 경우에는 Config Server가 동작하지 않을 때 Client에 application.yml으로 해당 정보를 지정해 주더라도 Application은 실행되지 않고 바로 예외가 발생합니다.
그러면 Client application.yml과 Config Server에서 가져오는 값이 충돌되면 어떻게 될까요?
이런 경우는 Config Server에서도 값을 가져오고 Client의 application.yml에도 정보가 있는 경우입니다.
직접 실습을 통해 알아보겠습니다.
충돌이 발생하면 우선순위에 따라 Config Server에서 값을 가져오게 됩니다.
Config Client를 실행하던 중 Config Server에 문제가 발생하면 어떻게 될까?
만약 Client가 실행되고 나서 중간에 Config Server가 down된 경우에는 어떻게 될까요?
예상으로는 Client는 잘 실행되지만 변경된 Config 정보를 읽어오지 못할 것 같습니다.
직접 실습을 통해 알아보겠습니다.
actuator의 /actautor/refresh endpoint를 통해 호출해본 결과 WARN 로그가 발생하면서 I/O error Connection refused와 같은 에러 메시지가 보입니다.
기존의 config를 확인하는 endpoint를 호출
기존의 설정은 유지한채로 정상적으로 동작됩니다.
즉, Config를 실시간으로 갱신하는 건 불가능하지만 Application이 동작하는 데는 문제가 없습니다.
참고자료
https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#config-client-fail-fast