Back-end/Spring Cloud, MSA

Spring Cloud Config 을 이용한 빠른 YAML 리펙터링

philo0407 2023. 5. 29. 15:02

 

 

보통 yaml 파일을 리펙터링하면 서버를 재기동하면서 제대로 설정됐는지를 확인한다

내 노트북 같은 경우 보통 재기동하면 40초 ~ 2분 정도의 시간이 걸린다... 참으로 답답하지 않을 수 없다

 

Spring Cloud Config 을 이용하면 변경yaml 파일을 동적으로 반영해서, 빠르게 리펙터링을 해나갈 수 있다

 

우선 아래 정보를 참고해서 Spring Cloud Config을 설정한다 (설명이 친절하지 않아서 미안...)

 

- Section 7: Cloud Configuration (tistory.com)

- Section 8, 9: Cloud Bus, 암호화 (tistory.com)

 

아래와 같은 상황이 있다고 가정해보자 (내 상황이었음)

정~말 긴 yml 파일이 있는데... route 설정 정보로 인해 다른 정보를 확인하기가 어렵다 (108 line)

 

그래서 파일 2개로 분리하면서 리펙터링을 했다

 

결과적으로 잘됐으나, 문제는 제대로 됐는지를 확인하기 위해 대여섯번을 재기동을 했어야 한다는 것

시간으로는 10여분의 손실이지만... 중간중간의 오버헤드가 집중력을 잃기에 좋은 시간이다 (다른걸 하기엔 애매함)

 

저걸 Config Server에게 위임하면 실시간으로 작업내용을 bus-refresh를 통해서 확인하면서 할 수 있다 ... ^^

 

내가 한 방식을 간단히 설명하자면... (생략한 내용은 위 포스팅에 있다)

 

기존의 yaml을 config 이 바라보는 디렉터리에 넣고 원 서비스의 yaml을 제거한다

 

config server's directory

 

api gateway service's resources

그리고 bootstrap은 위에 처럼 작성한다

그럼 아래와 같이 이동한것이다

- (API Gateway) application.yml -> (Config Server's Directory) api-gateway.yml

 

이제, [config server] -> [대상 서비스] 순서로 기동해서 아래 알고리즘으로 리펙터링하면 된다

 

 

알고리즘

 

1. Config Server가 참조하는 서비스의 yaml 파일 변경

2. 재기동X, Bus-Refresh 호출

3. 변경 올바르게 되었는지 확인

 

위 1~3을 반복하면 된다... 정말 편하다... 진작할껄

 

Config Server Yaml, 포함관계로 리펙터링

 

 

api-gateway가 api-gateway-route-and-filters를 포함하게 하려면 아래와 같이 하면 된다

 

spring:
  profiles.include: api-gateway-route-and-filters

만일 프로필 이름이 'api-gateway-'를 생략한 'route-and-filter'로 하면 아래와 같은 오류가 발생한다 (한참 헤맴 ㅠ)

 

혹은 아래 설정도 가능하다 (.yml 생략가능)

spring:
  config.import: classpath:api-gateway-route-and-filtersconfig.yml

 

그리고 재귀적으로 포함을 할 수 있어서 grand-parent.yml -> parent.yml -> child.yml 등의 관계가 가능하다

 

최종적으로 나는 아래처럼 설정했다

 

api-gateway.yml

spring:
  profiles.include: api-gateway-route-and-filters

 

api-gateway-route-and-filters.yml

spring:
  profiles.include: 
    - route-user-service
    - route-etc
  cloud.gateway.default-filters:
        ...

(여기서 중요한건 이곳에선 'api-gateway-' 접두사를 안붙여도 동작한다)

 

api-gateway-route-user-service.yml

spring.cloud.gateway.routes:
  ## 회원 가입
  - id: user-service
    uri: lb://USER-SERVICE
    predicates:
      - Path=/user-service/users
      ...