Cloud Config Server 활용의 이유
보통 스프링 내에 application 설정파일을 변경하고 재빌드를 통해 설정을 적용합니다.
하지만 도메인별로 흩어진 마이크로 서비스 구조에서는 이런 관리를 할 수 있는 Cloud Config Server로 관리합니다.
Local Git Repository의 정보에 접근하는 Config Server를 만듭니다.
그림으로 먼저 설명하자면 이런 느낌입니다.
외부에서 적용할 yml 파일 생성
ecommerce.yml 생성
token:
expiration_time: 1
secret: cD08xCg+eiWnntQyYKCF/ZE7h9FbF5lN8D
gateway:
ip: 192.168.0.71
git 등록
local git에 commit 된 파일에 Cloud Server가 접근할 수 있습니다.
git init
git add ecommerce.yml
git commit -m "add local yml"
Cloud Config Server 생성
@EnableConfigServer 추가
@SpringBootApplication
@EnableConfigServer
public class ConfigServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServiceApplication.class, args);
}
}
application.yml 설정 추가
server:
port: 8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: file://E:\work # ecommerce.yml 파일 있는 디렉토리 위치
http://localhost:8888/ecommerce/default
Cloud Config Server - Client 연결
Client는 MSA 구조 내에 Config Server에서 설정 정보를 제공받을 서비스입니다.
bootstrap.yml은 Spring Cloud Config 파일입니다. Spring Cloud 에서 지원하는 discovery, gateway 등의 설정값은 해당 파일에서 설정해야합니다. bootstrap은 application 설정 적용보다 우선순위가 높아 먼저 적용됩니다. 레거시한 방법이라 지원을 안한다고 하는데 다시 바뀌었는지 지금 되기도 하고 버젼 업데이트도 꾸준합니다...?
Spring Boot 2.4 이상부터는 application.yml에서 bootstrap 관련 설정도 할 수 있습니다.
bootstrap 활용 방법
cloud client service 의존성 추가
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-config'
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-bootstrap'
resources 폴더 내에 bootstrap.yml 생성
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce
application.yml 활용방법
cloud client service 의존성 추가
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-config'
application.yml 내에 설정 추가
spring:
cloud:
config:
name: ecommerce # 외부에서 적용할 yml 파일
config:
import: optional:configserver:http://localhost:8888 # cloud config server 주소
위의 방법 둘 중 하나를 골라 설정을 적용하면, 해당 서비스의 application.yml에는 없지만 ecommerce.yml에 있는 정보도 Environment를 통해 접근이 가능합니다.
Spring Boot Actuator
하지만 변경된 ecommerce.yml이 커밋되면 Cloud Server는 변경된 정보를 제공하지만, Cloud Client는 서비스를 다시 기동해서 빌드를 통해 변경해야합니다. 혼자 개발하는 환경에서는 문제가 없을 수 있으나 팀으로 진행하는 상황에서 팀원이 특정 서비스를 활용하거나, 운영 환경에서는 함부로 서버를 내리지 못합니다. 서비스를 재가동 시키지 않고 유연하게 적용하기 위해서 Spring Boot Actuator를 통해 외부에서 API 호출을 통해 애플리케이션 컨텍스트 내에서 변경된 설정을 다시 로드하고 적용합니다.
의존성 추가
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: '3.3.1'
application.yml 노출할 actuator 설정
management:
endpoints:
web:
exposure:
include: refresh, health, beans # 컨텍스트 로드, 헬스체크, 컨텍스트 등록된 빈 조회
Security 필터 actuator/** 하위 인가 해제
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class WebSecurity {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf(AbstractHttpConfigurer::disable);
http.authorizeHttpRequests((request) -> request
.requestMatchers(antMatcher("/actuator/**")).permitAll()
.requestMatchers(antMatcher("/h2-console/**")).permitAll()
).sessionManagement((session) -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
http.headers(header -> header.frameOptions(
frameOptionsConfig -> frameOptionsConfig.disable()));
return http.build();
}
}
Actuator 이용한 설정 변경 적용
1. ecommerce.yml 변경
2. git add , commit 진행
3. cloud client service 주소에 POST actuator/refresh API 호출
4. cloud client 변경 설정 적용