본문 바로가기
Spring

[Spring cloud] Spring cloud에서 설정 정보 관리하기

by 권성호 2021. 12. 6.

참고 링크

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4/lecture/69265?tab=curriculum 

 

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

https://happycloud-lee.tistory.com/211

 

[SC05] Spring Cloud Bus 란 ?

https://happycloud-lee.tistory.com/212?category=902419 Spring Cloud bus 이해 WHY ? config가 변경되면 각 마이크로서비스는 최신 값을 갖고 오기 위해 POST로 http[s]://{microservice host}/actuator/refres..

happycloud-lee.tistory.com

1.  단일 spring boot project에서 일반적인 설정 관리

일반적으로 application.yml 파일을 통해 설정을 관리한다.

이렇게 관리하게 되면 설정만 조금 수정하더라도 다시 빌드하고 배포해야 한다.

또한, MSA구조로 가게 되면 backend에 수많은 서버가 존재하고 이는 수많은 설정이 분산되어 있음을 의미한다.

 

이는 운영 시에 많은 부담으로 작용할 수밖에 없다. 

2.  spring cloud config server 도입

모든 서비스의 설정을 관리해 주는 하나의 설정 서버를 도입한다.

해당 설정 서버를 통해 모든 서비스의 설정을 중앙으로 집중 관리할 수 있고, 설정 수정 시 런타임에 반영이 가능하다.

반영하는 방식은 spring actuator의 refresh api를 호출하는 것으로 간단하게 반영된다.

 

그런데, 이또한 몇 가지 문제가 있다.

 

100개의 서비스가 있다고 가정하면, 그중 어떤 서비스의 설정이 변화되었는지 찾아서 그 서비스에 api를 호출해 줘야 하는데, 운영 중에 하나하나 확인하는 것은 꽤나 번거로울 것이다.

즉, 설정은 별도의 설정 서버에서 관리하는데 설정의 변화를 타겟 서비스에 알려줄 수 있는 방법이 없기 때문에  타깃 서비스는 변경된 설정을 알아서 갱신하지 못한다.

 

설정 서버에서 특정 설정이 변경된 것을 자동으로 인식하고 해당 서비스의 설정을 자동 갱신해 줄 수 있다면 매우매우 편할 것이다.

3.  spring cloud config + spring cloud bus + Message queue

설정 서버에서 특정 설정이 변경되면 타겟 서버에 이를 알려준다.


여기서, 무작적 알려주는 것이 아니라 중간에 Message queue를 배치해 둔다.

이로써, 설정 서버와 타겟 서비스의 결합도를 줄인다. 

타깃 서버 입장에서 본인의 비즈니스 로직에 영향을 받지 않고 안정적으로 설정에 대한 변경 내역을 푸시받을 수 있다.

 

 

spring cloud bus 까지 도입하게 되면

  1. MSA환경에서 각 서비스의 설정 정보를 중앙 집중 관리하고 
  2. 설정 정보의 수정 사항을 런타임에 즉시 반영 가능하며
  3. 단지 설정 파일을 수정하는 것 만으로도 모든 서비스에 자동 반영 가능하다.

 

궁금한점

  1. 설정 서버 재기동 시점에도 다른 서비스에게 설정 변경 통지가 가능한가?
    1. 설정 서버가 기동시 자기 자신의 /busrefresh를 호출하도록 구현하면 된다.
    2. 자기자신을 호출하는 예시
      1.     @GetMapping("/test")
            @ResponseBody
            public String test() throws UnknownHostException {
                RestTemplate restTemplate = new RestTemplate();
                String endPoint = "http://" + InetAddress.getLocalHost().getHostAddress() + ":" + env.getProperty("local.server.port") + "/health_check";
                Object str = restTemplate.getForEntity(endPoint,String.class);
        
                return str.toString();
            }
        
            @GetMapping("/health_check")
            @ResponseBody
            public String status(HttpServletRequest request){
                return String.format("It's Working in Order Service on Port %s", request.getServerPort());
            }

 

댓글