티스토리 뷰

Java/spring

Spring Cloud Config 1

LichKing 2018. 12. 7. 20:40

보통 스프링 부트 애플리케이션을 만들다보면 설정파일은 properties나 yml 파일로 추출해서 관리하게된다. profile 별로 파일을 분리까지하게되면 그 자체로 훌륭하게 설정을 분리해냈다고 할 수 있다. 하지만 여전히 존재하는 문제중 하나는 설정만 바뀌었음에도 빌드를 다시하고, 배포를 다시해야한다는 점이다. 나같은 경우는 AB 테스트를 진행하게됐고, AB의 비율을 자주 변경해야하는 이슈가 있었는데, 이를 기존대로 설정파일 분리만 해놓을 경우 비율을 바꿀때마다 릴리즈 배포를 해야했다.


Spring Cloud Config 는 별도 config 서버를 두고 애플리케이션이 해당 서버에서 설정을 받아오는 방식이다. 중간에 설정이 바뀌는 일이 발생하면 config 서버만 변경해주고 애플리케이션은 설정을 갱신하도록 해주면 애플리케이션은 별도의 재배포 없이 변경된 설정을 이용할 수 있는 편리함이 있다. 간단한 예제로 좀 더 알아보자.


Config Server

먼저 config 서버를 만들자. 이부분은 할일이 별로 없다. 스프링 부트 애플리케이션을 만들자. 필요한 의존성은 Spring Cloud Config Server 뿐이다.


implementation('org.springframework.cloud:spring-cloud-config-server')


애플리케이션 설정 파일에 @EnableConfigServer 애노테이션을 붙여주자


@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}


config 서버의 자바 코드는 이게 끝이다. 이제 설정 파일을 만들어야하는데 config 서버와는 전혀 상관없이 별도의 github repository로 만들어도되고, config 서버와 동일한 github repository에 만들어도된다. 일단 나는 별도의 repository 를 또 만들고싶지 않으니 동일한 프로젝트내에 관리하겠다.


동일한 프로젝트 내에서 관리하겠다는 위의 말이 처음에는 헷갈릴수도있다. 일단 지금부터는 저 표현을 쓰지않고 설명토록 하겠다. github repository를 하나 만들고 설정파일을 push 하자. 설정파일은 기존에 작성하던 properties, yml 파일대로 만들면 된다.


내가 만든 두 설정파일은 이렇다.


config-example-default.yml

example:
phase: "default"


config-example-release.yml

example:
phase: "release"


설정파일을 push한 repository 는 이곳이다. https://github.com/LichKing-lee/spring-cloud-config-example

혹시라도 헷갈려할 수 있어서 말하는데 두 yml 파일외에 소스코드는 신경쓰지않아도 된다. 지금은 그저 yml 2개만 있다고 생각하자.


설정파일을 만들어서 push 했으면 다시 config 서버 애플리케이션으로 오자. 이제 서버의 설정을 만들어줘야한다. config 서버 애플리케이션의 application.yml 설정파일에 방금 push 한 repository 를 설정해주자.


spring:
cloud:
config:
server:
git:
uri: git@github.com:LichKing-lee/spring-cloud-config-example.git


github 인증은 id/pw 를 이용한 https 도 가능하고, 공개키를 이용한 ssh 도 가능하다. 하지만 회사내에서 구축할때 본인 계정을 이용해서 인증할일은 거의 없으므로 ssh 기반으로 설명한다.


config 서버를 배포할 서버의 ssh 공개키를 github 에 등록한다. (아래 캡쳐 참고)



그리고 아래 부분에 private key 를 입력하면 된다.


spring:
cloud:
config:
server:
git:
uri: git@github.com:LichKing-lee/spring-cloud-config-example.git
ignoreLocalSshSettings: true
privateKey: |
-----BEGIN RSA PRIVATE KEY-----
4F/Y4TUuNkZXFbNGakeXF4J/b4lXcVgPXGmfSG7wTjnJ0+pUecFLv552av0fq+j6
EYskz1CBAoGBANwoW9dcX1FFP32l7DBm4JVydHjVw3RgC8GGx47mBJ2i1VFlj33h
YLKg+P5yV6HNp4NNgDDQWExP3cxnEHF7HH0SfwyQJ9D8JbLLIg7+PSrUvU+ZsQm4
0Flr+VOa/HheudnvqmcGz7sMYXFlmcO47Zd6CL26NkbTL3F+O/HJ0xl/AoGBANvX
DkjH2SrxSG2AbVf+qkrF9mU+XmDUWJ3oUFyUlLEZzZvMjp/KSny2a2fTPGSNDrVW
bwJcpDPvMNAoKcIERXTPKi0W/hqm2rhP7t+w4WbCJKOUWwWb3RTtbm0L13PzCqON
Erh9PE1Idys2oMD9+8lBQMWturt5yVlVppyeOvSpAoGASnxJHmL9SMTSB1PExld4
jXldjMWVAwrcQlKhskroLP6PEkhgcnaZ3zc9wsCUHLGH1alVkMfoLlOxACmszWBa
2j4KiQ5gYLQAwDhCVbq/9kcCgYB+lU38SlaZi2UQ6CoNyO11MJe3pDnjt2FvSx06
sbMMZrclRpu5FlndhYxCtDbKDw6xC5vP2FgUL14D/ZxNwvfbUo4OeHbIEdtO1XfO
vf+6V2zT540CBtv5Fv9H6mg+6s5+WS2m61IK7iZbS6lcv63oQ6C+/W/JHbxh732U
2WkRzRV/5ab+g+ZA3LeFzfJOZyumg4dOJrNNpsJvtA2on86Oq+ae
-----END RSA PRIVATE KEY-----


그럼 이제 config 서버 애플리케이션을 띄워보자. 정상적으로 8080 포트로 실행이 됐다면 아래처럼 요청을 날려보자.


curl localhost:8080/config-example/default/master 

이런 결과가 왔다면 성공이다.



아래 source 부분을 보면 example.phase 라는 설정이 제대로 온걸 볼 수 있다. url에 대해 잠깐 설명을 하면 /config-example 은 application 이름, default 는 profile, master는 label(branch) 이다. label은 선택적인 부분이라 없어도 된다.


/{application-name}/{profile}/{label} 

여기까지 왔다면 config 서버는 끝이다. 다음 포스팅에서 client 부분을 살펴보자.

댓글
댓글쓰기 폼