티스토리 뷰

Java/spring

Spring Cloud Config 2

LichKing 2018. 12. 8. 16:40

Spring Cloud Config Client

지난 포스팅에서 config server를 띄우는것 까지 진행했다. 이제 config server가 구동되고있는 상태에서 그 정보들을 받아올 client 를 구현해보자.


config 를 제대로 받아오는지 확인하는 용도의 스프링 부트 웹 애플리케이션을 만들면된다. 아래 의존성을 넣어주면 된다.


implementation('org.springframework.boot:spring-boot-starter-web')
implementation('org.springframework.cloud:spring-cloud-starter-config')


그리고 아무것도 하지않고 서버를 띄워보자. 8080으로는 이미 config server가 사용되고있으니 아래설정을 넣어주고 띄우면 된다.


server:
port: 8081


그리고 로그를 잘 보면 이런 로그가 출력된다.


Fetching config from server at : http://localhost:8888 


지금 우린 아무런 설정을 해준게 없기때문에 기본설정으로 저쪽에 config 를 요청하게된다. 아마도 애플리케이션 의존성에 spring config client가 있으면 자동으로 요청을 하는듯싶다.

하지만 우리는 config server 가 8080으로 떠있기때문에 그 바로 아래로그에 connect timeout이 발생했다는 로그를 보게된다. 기본설정으로 쓰겠다면 config server 를 8888 포트로 띄우면 되겠지만 8080을 보도록 config client 를 설정해주자.


우리가 설정해줘야할건 2개다.


1. application-name, 우리는 config server에 config-example 이라는 애플리케이션 명칭으로 config 를 저장했다.

2. config server 


먼저 config client 의 application.yml 을 수정해주자.


spring:
application:
name: config-example


부트 웹 애플리케이션의 명칭을 지정해줬다. 그리고 config server 를 설정해줘야하는데 이 설정은 application.yml 에서 하지않는다. application.yml 이 위치한 resources 디렉토리에 bootstrap.yml 을 만들어 아래 설정을 넣어주자.


spring:
cloud:
config:
uri: http://localhost:8080


bootstrap.yml 은 라이프사이클상 application.yml 보다 먼저 읽어들인다. bootstrap.yml 도 application.yml 과 마찬가지로 profile 별로 bootstrap-{profile}.yml 형태로 관리할 수 있다. 여튼 bootstrap.yml 에 이런설정을 하고 서버를 다시 config server 를 띄워보자.


이번엔 connect timeout 로그없이 뜬걸 볼 수 있을것이다. 아마도 제대로 잘 읽어온듯하다. 제대로 읽어온걸 확인하고싶으면 어떻게해야할까? 몇가지 방법이 있겠지만 가장 단순하고 쉬운방법은 http 요청을 받을 controller 를 하나 만들어서 확인 할 수 있을것이다.


@RestController
public static class Controller {
@Value("${example.phase}")
private String config;

@GetMapping
public String test() {
return config;
}
}


그런데 이 방식말고 다른걸로 확인해보자. spring actuator를 이용하는 방법이다. 먼저 아래 의존성을 추가해주자. (뒤에서 더 확인해볼내용이 있으니 위에 controller 도 일단 만들어놓자.)


implementation('org.springframework.boot:spring-boot-starter-actuator')


actuator 는 부트 애플리케이션의 상태, 설정 등 다양한것들을 확인 할 수 있다. 의존성을 추가했으면 application.yml 에 설정을 추가해줘야한다.


management:
endpoints:
web:
exposure:
include: "env"


그리고 client server 를 띄워서 아래처럼 htp 요청을 날려보자.


curl localhost:8081/actuator/env 


그럼 json 이 리턴될텐데 propertySources 를 보면 아래 설정이 있음을 확인 할 수 있다.



지금은 그냥 실행시켜서 default 가 표현되는거고, profile 을 release 로 해서 실행해보면 release 가 담기는걸 볼 수 있다.


-Dspring.profiles.active=release 


위 옵션을 넣어 실행시키면



이렇게 release 를 읽는다.


Refresh

이제 기본적인 client server 는 다 확인해봤다. 이번엔 설정이 변경됐을때 refresh 하는법을 알아보자. 먼저 설정을 수정해서 github 에 push 해보자.


config-example-default.yml

example:
phase: "default-refresh"


config-example-release.yml

example:
phase: "release-refresh"


이렇게 수정해서 push 했다. 이 과정에서 유의할점은 config server 는 건드리지않아야한다. 간단히 로컬에서 구동중이라고 아무생각없이 서버를 리스타트하거나 그러지말자. 서버는 그대로 있는 상태에서 설정만 바꿔서 push 하고, config server 를 확인해본다.


config server 는 아무것도 해주지않았는데 config가 변경된걸 볼 수 있다.



그럼 config client 도 바로 바뀌었을까? 확인해보면 알겠지만 config client 는 변경되지않았다. config client 는 수동으로 refresh 를 해줘야한다. refresh 를 하려면 actuator 설정을 좀 변경해줘야한다.


management:
endpoints:
web:
exposure:
include: ["env", "refresh"]


refresh 를 추가해준다. 그런데 이 설정을 적용하려면 어찌됐든 config client 를 재시작해줘야하고, 그러면 위 설정과 관계없이 어차피 config server 를 다시 요청하기때문에 이미 설정이 변경되게된다. 설정을 한번 더 바꿔서 push 해주자. 그리고 아래처럼 config client 를 호출하자.


curl -X POST localhost:8081/actuator/refresh 


유의할점은 refresh 는 post 메서드로 호출해야한다는 점이다. refresh 를 호출하면 어떤 설정이 refresh 됐는지 json 으로 응답을 하게된다. env 를 확인해보자.



env에도 설정이 바뀐걸 볼 수 있다! 그런데 이게 끝이 아니다. 위에서 만들어 놓은 Controller 가 있다면 이곳으로 요청을 해보자. 그럼 env에는 설정이 바뀌었는데 여기는 또 바뀌지않았다. env가 아무리 변경이 반영되더라도 실제로 그 config 를 사용하는 곳이 변경되지않는다면 아무런 소용이 없다.


Controller 클래스에 @RefreshScope 애노테이션을 달아주자.


@RestController
@RefreshScope
public static class Controller {
@Value("${example.phase}")
private String config;

@GetMapping
public String test() {
return config;
}
}


여기서 서버를 다시시작해야하는데 그러면 또 어차피 서버가 올라가면서 config 를 다시 읽을테니 서버가 다 올라간 이후 config 를 한번 더 수정해주고 push 하자. 그상태에서 refresh 를 해주면 그땐 사용하는 부분도 config 가 변경된걸 확인할 수 있다.



혹시 config client 로 스프링 부트 2 애플리케이션을 사용하고있고, DataSource 로 스프링 부트 2 기본 설정인 HikariCP 를 사용하고있다면 refresh 할때 에러가 발생하는 경우가있다. 그럴땐 이전 포스팅을 참고하길 바란다.


지금까지 진행한 내용은 https://github.com/LichKing-lee/spring-cloud-config-example 에 정리했다.

댓글
댓글쓰기 폼