[MSA] Spring Cloud Config - MicroService 연동하기 (1)
++) Spring Cloud Config 에 대한 기본 개념 정리 링크
https://born2bedeveloper.tistory.com/60
MicroService와 Spring Cloud Config 연동하기
프로젝트의 service와 spring cloud config를 연동하는 방법을 알아보자.
필자는 기존에 만들어 둔 프로젝트를 사용한다. 흐름은 같으니 각자 원하는 프로젝트를 통해 적용해보도록 하자.
spring cloud 설정정보에서 가져올 부분을 주석처리하자.
만약 yml이나 properties 파일 내용을 통째로 들고 올 경우면 설정파일을 지우거나 전체 주석처리 해도 무방하다.
다음 pom.xml 파일에서 두 가지 dependency를 추가하자 (maven refresh 잊지말기~)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
bootstrap은 뭐지?
해당 dependency에
spring-boot-starter, spring-cloud-context, spring-cloud-commons, spring-security-rsa, spring-core가 포함되어있다.
이후 bootstrap.yml 설정파일을 통해 spring cloud config에서 다른 설정 파일보다 먼저 실행시키기 위한 용도로 사용함
이제 application.yml과 같은 위치에 bootstrap.yml 파일을 생성하고 아래와 같이 기입하자.
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce
해당 설정은 Spring cloud config 의 서버로 돌아가는 프로젝트의 uri 및 해당 프로젝트에서 참조하는 설정파일의 name이다. 이전 포스팅에서 다룬 프로젝트를 그대로 사용할 것이기 때문에 이곳 을 참고하자
잘 반영되었는지 컨트롤러에 메소드를 하나 생성해서 확인해보자.
@GetMapping("/health_check")
public String status() {
return String.format("It's Working in User Service"
+ ", port(local.server.port)=" + env.getProperty("local.server.port")
+ ", port(server.port)=" + env.getProperty("server.port")
+ ", token secret=" + env.getProperty("token.secret")
+ ", token expiration time=" + env.getProperty("token.expiration_time"));
}
해당 token에 대한 설정정보는 외부에 .yml파일을 만들어서 spring config 서버에 등록해둔 상태다.
그 후 해당 service 프로젝트를 구동하면
맨 첫 줄에서 Config server 프로젝트 (포트번호 8888)과 무사히 연결된 것을 확인할 수 있다.
그 다음줄을 보자
2022-07-20 13:32:52.719 INFO 21088 --- [ restartedMain] c.c.c.ConfigServicePropertySourceLocator : Located environment: name=ecommerce, profiles=[default], label=null, version=788232b345489b0a637180b8847ff0fffad00abe, state=null
2022-07-20 13:32:52.720 INFO 21088 --- [ restartedMain] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-configClient'}, BootstrapPropertySource {name='bootstrapProperties-file://C:\Users\Metanet\git-local-repo/file:C:\Users\Metanet\git-local-repo\ecommerce.yml'}]
첫 번째 줄에는 우리가 외부에 작성한 ecommerce.yml 파일에 대한 정보가 기입되어 있고,
Config Server에 떠있는 해당 환경 설정 정보들을 내가 만든 user-service에서 잘 가져왔음을 알 수 있다.
이 정보값들을 한번 출력해보자!
token의 secret값과 expiration_time 값은 user-service의 설정정보에서는 맨 처음에 주석처리했다.
우리가 외부에서 만든 설정파일이 무사히 연동된것이다!
그게 맞는지 해당 파일을 수정해서 확인해보자.
secret 내용을 바꾸고 git에 다시 커밋해보자.
야호! 무사히 바꼈다!
다만 설정 정보가 바뀔 때마다 user-service를 재기동 하는 방식은 조금, 아니 많이 불편하다. 방법이 없을까?
Config value 갱신하기 - Actuator refresh
설정 정보를 바꾸는 방법은 보편적으로 3가지다.
- 서버 재기동 (방금 했던 방식)
- Actuator refresh (Spring boot의 Actuator 기능 중에 refresh를 사용한다.)
- Spring cloud bus (2번 방법보다 더 효율적이다! 즉, 이거 쓰라는 소리)
그렇담 먼저 3번의 효율성을 알기 위해 2번 방법을 한번 사용해보자.
Spring Boot Actuator
- Application 상태, 모니터링
- Metric (수치)수집을 위한 Http End point 제공
공식 문서에 사용할 수 있는 기능들이 아주 잘 나와있다. 한번 쓱 흝어보자
https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints
이제 actuator를 사용하기 위해 pom.xml안의 dependency에 추가해보자!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
만약, spring security를 사용중이라면
위와 같이 actuator에 대한 정보는 인증절차를 거치지 않도록 설정해두자
그 후, 각자 구동중인 프로젝트(나의 경우 user-service)의 applications.yml 파일에 다음 내용을 추가하자.
각각 actuator의 기능을 살펴보면
refresh : configuration server에서 가져와야 할 정보들을 refresh한다. (application 재기동 할 필요 없음)
health : 애플리케이션 상태 정보를 표시
beans : 애플리케이션에 있는 모든 Spring 빈의 전체 목록을 표시
해당 actuator가 잘 동작하는지! 어플리케이션을 구동해서 들어가보자!
각 기능을 사용할땐 /actuator/기능 의 uri 패턴으로 입력하면 된다.
health, beans 둘 다 아주 잘 돌아간다.
refresh의 경우 그냥 uri로 이용할 수 없고, post방식으로 전달해야 한다.
POSTMAN을 이용해 실시간으로 갱신되는지 한번 설정파일을 바꿔보자
값을 바꿔주고, 이전처럼 git add, commit 과정을 통해 반영하자
이제는 application을 재구동 할 필요 없다! POSTMAN 요청을 통해 refresh를 요청해보자
send 요청을 하면 반환값으로 바뀐 변수들이 출력된다. 이제 다시 health_check 메소드를 호출해보자.
야호! microservice를 재부팅 하지 않고 actuator의 refresh 기능을 통해 configuration 상태 정보 값을 갱신 할 수 있었다.
[참고 reference]