참고 링크
https://happycloud-lee.tistory.com/211
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 까지 도입하게 되면
- MSA환경에서 각 서비스의 설정 정보를 중앙 집중 관리하고
- 설정 정보의 수정 사항을 런타임에 즉시 반영 가능하며
- 단지 설정 파일을 수정하는 것 만으로도 모든 서비스에 자동 반영 가능하다.
궁금한점
- 설정 서버 재기동 시점에도 다른 서비스에게 설정 변경 통지가 가능한가?
- 설정 서버가 기동시 자기 자신의 /busrefresh를 호출하도록 구현하면 된다.
- 자기자신을 호출하는 예시
-
@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()); }
-
'Spring' 카테고리의 다른 글
feign client 파헤쳐보기 (0) | 2023.06.10 |
---|---|
Spring logging 동시성 (0) | 2022.04.16 |
Data Transfer Object 의 필요성 (0) | 2022.04.12 |
[파일 수신 API] MultipartFile VS Octet-stream (0) | 2022.02.09 |
[책]자바 웹 프로그래밍 Next Step 스터디 (0) | 2021.12.18 |
댓글