2020년 6월 26일 금요일

Spring Boot Cloud Config 해보기

Spring Boot Cloud Config 로 분산시스템에서 설정파일을 외부로 분리 해보자
스프링 뿐만 아니라 , 다른 언어로 개발된 외부서버에서도 동일한 설정값을 적용할때 유용하다.

예를들어, 스프링부트 애플리케이션 , 노드제이에스애플리케이션 으로 구성된 프로젝트에서 개발할때는 전부 테스트용 디비에 접속했다가, 프로덕션때는 실서버로 설정파일을 바꾸고자 할때, 스프링 클라우드 콘픽 서버에서 설정값만 바꾸면 두 애플케이션에 동시에 적용되게 한다든지가 가능하다.


일단 로컬에 있는 설정파일을 이용하여 콘픽서버를 구성해보자.

1. Spring Boot Cloud Config Server
누군가는 콘픽설정을 가지고 있어야 되니까 서버가 필요하다.
- spring init 사이트에서 의존성 추가해서 웹어플로 하나 만들자.
- 의존성 : implementation 'org.springframework.cloud:spring-cloud-config-server'
- 설정파일을 로컬에 보관하고 서버에서 그 파일을 사용하겠다고 지정
  -  Config Server 는 application.yml 보다 bootstrap.yml 을 먼저 읽어야하니까 해당화일을 만든다 (또는 bootstrap-local.yml , bootstrap-prod.yml 으로 구분가능)
  - 내용은 일단 간단하게 입력
server:
port: 9000 <- 포트는 아무거나
spring:
profiles:
active: native <- 이게 로컬파일 쓰겠다는 것
cloud:
config:
server:
native:
search-locations: file://${user.home}/springcloud_config <- 콘픽파일들이 들어있는 폴더위치를
지정하면 클라이언트에서 요청한 콘픽파일을 이 폴더에서 찾아서 돌려준다
  - 사용자폴더안에 springcloud_config 폴더를 만들고 파일들을 넣어준다. 내용은 아무거나 좋다.
   단 파일이름사이에 - 표시로 요청 url 가 결정된다.
springcloud_config
 - bootstrap-test1.yml
 - bootstrap-test2.yml
  폴더와 파일들을 만들고
 - bootstrap-test1.yml 파일에는
spring:
  profiles: test1
  message: Hello Spring MemberService Test1 Server!
라고 만들었다.
  - 이제 서버를 기동하고 http://localhost:9000/bootstrap/test1 , 또는 다른컴에서 http://xx,xx,xx,xx:9000/bootstrap/test1 라고 입력하면 json 형태로 설정파일의 데이터가 출력된다.


2. Spring Boot Cloud Config Client
서버에서 Json 형태로 출력이 되니 서버주소만 입력하고 제이손 파싱만하면된다.
같은 스프링부트 프로젝트니까 의존성추가하고 bootstrap.yml 에 콘픽서버놈 설정하고 애플리케이션의 에서 설정속성을 읽어내면 된다. 
기존의 application.yml  에서 읽어 오는걸 콘픽서버에서 읽어 들인다고 생각하면된다.
의존성
implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation 'org.springframework.boot:spring-boot-starter-actuator' <-- 요놈을 추가하면 서버에서 콘픽설정 
정보가 바뀔때 클라이언트 에서 서버의 재기동없이도 해당값이 적용되도록 하는게 가능하다. 밑의 콘트롤러에서 @RereshScope 를 사용할때 설명
bootstrap.yml 파일
server:
port: 8081

spring:
application:
name: bootstrap
profiles:
active: test1
cloud:
config:
uri: http://localhost:9000
콘트롤러
@RestController
@RefreshScope <-- actuator 의존성이 되어 있다면 이 어노테이션을 설정가능하다. 이놈이 붙어있으면 서버의 설정파일에 변경사항이 있을경우 클라이언트에서 POST http://클라이언트/actuator/refresh 요청하여 설정파일의 갱신이 가능하다.
public class HmmConfigClientController {

@Value("${spring.message}")
private String identify;

@GetMapping("/hi")
public String test() {
return identify;
}

}
지금은 http://localhost:8081/hi 하면 화면에 Hello Spring MemberService Local Server22233!!!!! 가 출력됨.
근데, 서버의 bootstrap-test1.yml 의 내용이 변경되었음
spring:
  profiles: test1
  message: Xuck  Apple !!!!!
하지만 아직 test1 설정을 읽어들인 클라이언트들은 예전메시지 나옴
자, 이제 외부에서 POST 로 클라이언트 서버에 actuator/refresh  해서 콘픽서버의 변경된 설정을 반영해보자.
사실은 콘픽 서버가 변경될떄, 각 클라이언트의 actuator/refresh 를 적용하도록 하는게 맞는거다. 유레카 서비스연동한다면 
등록되어 있는 클라리언트를 찾아서 반영하는것도 가능하다.
여튼. 간단히 curl -X POST  http://localhost:8081/actuator/refresh 하면 클라이언트는 콘픽서버로부터 새로운 
설정값을 가져온다.

지금은 http://localhost:8081/hi 하면 화면에 Xuck  Apple !!!!!
이 나옴. 또는 클라이언트 재가동 하든가. 

일단 콘픽 서버는 json 형태로 출력하니까 Json 파싱이 가능한 다른 애플리케이션에서도 이용가능하다. 스프링부트 에서 쓸때는 
좀더 편리할뿐.

0 comments:

댓글 쓰기