Software Architecture/MSA

[MSA] Spring Cloud Config - MicroService 연동하기 (1)

jimkwon 2022. 7. 20. 14:51
반응형

 

++) Spring Cloud Config 에 대한 기본 개념 정리 링크

https://born2bedeveloper.tistory.com/60

 

[MSA] Spring Cloud Config - (5)

이전에는 MSA구조 중 API Gateway Service에 대해 다뤘다. 이번에는 Config 정보를 하나로 통합하여 관리할 수 있는 Spring Cloud Config에 대해 다뤄보자.  Spring Cloud Config - 설정 정보의 중앙화 이전에 Mi..

born2bedeveloper.tistory.com

 

 

 

 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가지다.

 

 

  1. 서버 재기동 (방금 했던 방식)
  2. Actuator refresh (Spring boot의 Actuator 기능 중에 refresh를 사용한다.)
  3. 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

 

Production-ready Features

You can enable HTTP Tracing by providing a bean of type HttpTraceRepository in your application’s configuration. For convenience, Spring Boot offers InMemoryHttpTraceRepository, which stores traces for the last 100 (the default) request-response exchange

docs.spring.io

 

 

이제 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]

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4

 

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) - 인프런 | 강의

Spring framework의 Spring Cloud 제품군을 이용하여 마이크로서비스 애플리케이션을 개발해 보는 과정입니다. Cloud Native Application으로써의 Spring Cloud를 어떻게 사용하는지, 구성을 어떻게 하는지에 대해

www.inflearn.com