개요
어플리케이션에 사용되는 설정을 중앙화하여 관리하는것은 여러가지 이점이 있으며
계층화되어 관리 되어야 합니다.
고전적인 문제점을 먼저 체크해보겠습니다.
고전적 설정의 문제점
- 설정이 배포파일에 포함되어, 설정 변경시 재 배포되어야한다.
- 설정파일이 로컬파일에 분리되었다고 해도, 각 로컬에 접근후 설정파일을 변경후 재 실행되어야한다.
- 설정이 파편화되어 설정의 차이점을 비교하기가 어렵습니다.
중앙화의 이점
- 설정파일을 수정후, 자동혹은 수동으로 변경전략으로 일괄 변경가능함으로 재 배포될 필요가 없습니다. -물론 자신의 포트 변경과같이 어플리케이션 리로드가 필요한 부분은 재시작이 필요합니다.
- 설정 내역이 중앙화되어 있어서 차이점 비교가 쉽습니다.
- 필요하면 콘피그 서버자체를 개인화가 가능하며, 의존 서버 포트변경이 가능하며 로컬에서 도커사용시 유용합니다.
설정요약
Config 중앙 서버
spring.application.name="config-service" server.port=8888 spring.cloud.config.server.git.uri=http://git.webnori.com/scm/sb2/cloudconfig.git
설정 서버가 띄워질 포트와 , 설정저장소를 지정합니다.
설정 서버의 셋팅 리소스로 깃을 지정합니다. Git Pull 명령을 주기적으로 날려서
설정의 추가/삭제등을 Config 서버가 감지 가능합니다.
어플리케이션
spring.application.name=front-web spring.cloud.config.uri=http://localhost:8888
Config 중앙서버의 접속정보와 자신의 어플리케이션이름 설정을 합니다.
여기서 어플리케이션 이름이 중요한 이유는, 중앙 서버에서 front-web.yml 와같이 자신의 어플리케이션 설정을 탐색하기 때문입니다.
Spring boot 은 기본적으로 application.peroperties 라는 기본설정을 사용하지만, application.yml 설정도 인식이됩니다.
yml의 장점은 구조화된 가동성을 제공하며, 여러 환경을 하나의 파일에 정리할수 있는 장점이 있습니다.
@RefreshScope @RestController public class GreetingController { // Config Server Test @Value("${message:Hello default}") private String message; @RequestMapping("/message") String getMessage() { return this.message; } }
스프링에서는 로컬에서 설정을 읽어온것과 같은 방식으로 사용하면 됩니다.
어플리케이션이 로드될시 중앙서버에서 이미 설정값을 읽어왔기때문입니다.
여기서 RefreshScope 어노테이션은 , 설정변경시 노드 재시작없이 적용가능하게 합니다.
API 자체 모니터링툴인 actuator를 내장하면 변경적용 명령이 가능합니다.
curl localhost:8080/actuator/refresh -d {} -H "Content-Type: application/json"
설정 저장소 분리
git:http://git.webnori.com/scm/sb2/cloudconfig.git
message: "hello, spring cloud -default" --- spring: profiles: local server: port: 8080 message: "hi, spring cloud -local" --- spring: profiles: dock-local server: port: 80 message: "hello, spring cloud -doc local" ---
설정 저장소는 , 코드 저장소가 아닌 설정저장소로 분리되어 관리가 되는것이 좋으며
yml은 한가지 파일에서 다양한 환경의 파일을 관리할수 있게하며 필요하면
파일 or 디렉토리로 환경 분리룰을 적용할수 있습니다.
실행 환경을 지정하여 실행하기
// 메이븐 실행 ( 로컬에서 주로 디버깅 수행시) mvn spring-boot:run -Dspring.profiles.active="local" // Stand Alone for Spring ( 배포후 자바 실핼시 ) java -jar application.jar --spring.profiles.active=staging --spring.config.location=C:\Config
spring.application.name=lobbyapi
spring.cloud.config.uri=http://localhost:8888설정은 원격지에 있으나,원격지 설정을 찾기위해 위 두가지는 로컬에서 파일혹은 전달인자로 필수로 지정해줘야하는 설정입니다.
설정서버 로그
2018-12-02 22:25:04.647 INFO 12212 --- [nio-8888-exec-3] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/psmon/AppData/Local/Temp/config-repo-3303566354724094937/application.yml (document #0)
2018-12-02 22:34:53.862 INFO 12212 --- [nio-8888-exec-5] .c.s.e.MultipleJGitEnvironmentRepository : Fetched for remote master and found 1 updates
2018-12-02 22:34:54.559 INFO 12212 --- [nio-8888-exec-5] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/psmon/AppData/Local/Temp/config-repo-3303566354724094937/gameapi.yml (document #1)
2018-12-02 22:34:54.560 INFO 12212 --- [nio-8888-exec-5] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/psmon/AppData/Local/Temp/config-repo-3303566354724094937/application.yml (document #1)
2018-12-02 22:34:54.561 INFO 12212 --- [nio-8888-exec-5] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/psmon/AppData/Local/Temp/config-repo-3303566354724094937/gameapi.yml (document #0)
2018-12-02 22:34:54.562 INFO 12212 --- [nio-8888-exec-5] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/psmon/AppData/Local/Temp/config-repo-3303566354724094937/application.yml (document #0)
2018-12-02 22:38:32.787 INFO 12212 --- [nio-8888-exec-7] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/psmon/AppData/Local/Temp/config-repo-3303566354724094937/accountapi.yml (document #0)
2018-12-02 22:38:32.788 INFO 12212 --- [nio-8888-exec-7] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/psmon/AppData/Local/Temp/config-repo-3303566354724094937/application.yml (document #0)
2018-12-02 22:41:03.311 INFO 12212 --- [nio-8888-exec-9] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/psmon/AppData/Local/Temp/config-repo-3303566354724094937/accountapi.yml (document #0)
2018-12-02 22:41:03.312 INFO 12212 --- [nio-8888-exec-9] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/psmon/AppData/Local/Temp/config-repo-3303566354724094937/application.yml (document #0)
설정서버가 Git Module이 내장되어 있어서, 중앙 설정파일의 변경처리를 유연하게 해줍니다. 똑똑한 녀석입니다.
올인원 로컬
설정의 중앙화를 통해서 local 에서 충돌없는 포트 구성이 가능합니다
그외
이것은 스테이징/운영에서도 이점이 있지만 로컬개발환경에서 다음과같은 이점이 있을수 있습니다.
일반적으로 마이크로한 서비스를 자신의 로컬컴퓨터에 구동시키고 디버깅환경을 구축하는것은 중요합니다.
하지만 설정의 복잡성으로 DB를 포함하여 안정적인 개발환경에 조인하는 방법이 마땅하지 않습니다.
이럴때 설정 서버를 사용하여 이미 설정이 구조화가 되어있다고 하면, 큰 노력없이 변칙적인 개발환경 셋팅이 가능할것입니다.
콘피그서버는 구성 노드의 스케일 인-아웃/ 장애노드의 제외등 서버의 가용성을 체크하는 기능으로 사용하기엔
그 성격이 다릅니다. 이 경우 유레카와 상호연동이 됩니다. 유레카는 다음장에서 다룹니다.
참고자료:
- https://cloud.spring.io/spring-cloud-config/multi/multi__spring_cloud_config_server.html
- https://spring.io/guides/gs/centralized-configuration/
- https://www.baeldung.com/spring-profiles
- https://www.tutorialspoint.com/spring_boot/spring_boot_application_properties.htm
- https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html