Spring Cloud Config

정권호·2022년 3월 6일
0

Spring-MSA

목록 보기
1/2
post-thumbnail

Spring Cloud Config란?

분산 시스템에서 서버, 클라이언트 구성에 필요한 설정 정보(application.yml)를 외부 시스템에서 관리하게 해줍니다.
이로인해 하나의 중앙화 된 저장소에서 구성요소 관리가 가능합니다.

왜 쓰는건가?

Spring Cloud Config를 사용하지 않는다면 서버의 설정값을 바꾸면 빌드를 다시해서 배포를 해야하지만 spring cloud config를 적용한다면 이런 과정을 거치지 않고 바로 적용이 가능합니다.


Spring Cloud Config Server

먼저 Spring Cloud Config를 이용하기 위해선 Config Server를 구성해야합니다.

의존성 추가

프로젝트를 생성해주고 아래의 의존성을 추가해줍니다.

<dependency>
	<groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

Config Server 설정

프로젝트의 Application 클래스에 @EnableConfigServer를 추가해줍니다.

application.yml 작성

application.yml 파일을 다음과 같이 구성합니다.
(여기서 저는 Git을 이용하여 설정파일들을 관리할 것입니다.)

server:
  port: 8888 # 서버 포트

spring:
  application:
    name: config-service # application의 이름 (본인이 원하는 이름 작성 가능)
  cloud:
    config:
      server:
        git:
          uri: https://github.com/jjh5887/spring-cloud-config.git # 설정파일들을 저장할 본인의 git 저장소

Spring Cloud Config Server 테스트

Git Repository

Git Repository를 다음과 같이 구성해줍니다.

ecommerce.yml

설정 파일 테스트

서버를 가동한 상태에서 http://localhost:8888/ecommerce/default 요청을 보내면 다음과 같은 화면을 확인할 수 있습니다.
(아래의 추가적인 정보는 기본 설정파일의 정보입니다.)

이렇게 Git Repository에 등록해 놓은 설정파일을 정상적으로 읽어 왔음을 확인 할 수 있습니다.

여기서 uri를 http://localhost:8888/ecommerce/dev 로 수정하면 ecommerce-dev.yml 파일을 불러 올 수 있습니다.


Spring Cloud Config Client

이제 Spring Cloud Config Server를 사용할 Clinet를 구성해줍니다.

의존성 추가

Config Server를 사용할 프로젝트에 다음 의존성을 추가해줍니다.

<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.yml 작성

이번에는 application.yml 를 사용하지 않고 bootstrap.yml을 사용합니다.
(파일의 위치는 application.yml과 같은곳에 위치하면 됩니다.)

spring:
  cloud:
    config:
      uri: http://localhost:8888
      name: user-service
#  profiles:
#    active: dev # 해당 설정을 활성화 시키면 user-service-dev 파일의 설정을 가져온다.

bootstrap.yml을 사용하는 이유는 application.yml 파일보다 우선순위가 높아서 Config Server 에서 사용하려는 정보를 먼저 읽어오게 하기위함입니다.


Controller 작성

다음은 Config Server 에서 설정 정보를 잘 가져왔는지 테스트하기 위한 Controller 입니다.


Spring Cloud Config Client 테스트

user-service.yml

위에서 작성한 Controller 에서 불러올 값들을 설정해 줍니다.

설정 파일 테스트

서버를 가동한 상태에서 http://localhost:8811/health_check 요청을 보내면 다음과 같은 화면을 확인할 수 있습니다.

기본 설정 파일

여기서 이상한점이 있는데 user-service.yml 파일에는 token secret과 token expiration time 정보가 없는데도 정보를 읽어오고 있습니다.
사실 이정보는 Config Server의 기본 설정인 application.yml 에서 가져오고 있습니다.

application.yml

application.yml 파일은 모든 설정파일에 공통으로 적용되어 위에서 user-service.yml 파일에 없는 정보여도 기본 설정 파일을 통해 정보를 읽어 올 수 있습니다.

설정 파일 변경 테스트

이번에는 Config Server의 user-service.yml 파일을 수정하여서 테스트 해보겠습니다.

설정 파일을 수정하고 다시 요청해보았지만 수정한 내용이 반영이 되지 않았습니다.

문제점

이러한 문제를 해결하려면 서버를 재가동하는 방법도 있지만 그렇다면 Config 서버를 사용하는 의미가 없습니다.
이런 문제를 해결하기 위해서 Spring Boot Actuator를 사용해 보겠습니다.


Spring Boot Actuator란?

  • application의 상태를 쉽게 모니터링할 수 있게 해주는 라이브러리 입니다.
  • Metric 수집을 위한 Http End Point를 제공해 줍니다.

의존성 추가

Spring Cloud Config Client에 해당 의존성을 추가해줍니다.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.yml 작성

기존의 설정파일에 아래의 정보를 추가해줍니다.

management:
  endpoints:
    web:
      exposure:
        include: refresh, health, beans

Spring Boot Actuator 테스트

위의 설정을 모두 완료하였다면 Spring Cloud Config Client를 재구동 해줍니다.

간단한 적용 테스트

http://localhost:8811/actuator/health 로 요청을 보내보면 다음과 같은 화면이 나옵니다.
(위에 주석부분은 신경쓰지 않으셔도 됩니다.)

http://localhost:8811/actuator/beans 로 요청을 보내면 현재 등록되어있는 Bean들도 확인할 수 있습니다.

설정 파일 변경 테스트

이전에 테스트에서 설정 파일을 변경하여도 적용이 되지 않았던 테스트를 다시 해보면 현재 설정이 다음과 같이 되어있습니다.
(서버를 재가동 하면서 변경된 설정 파일이 적용된 상태입니다.

다시 한번 설정 파일을 변경해보겠습니다.

다시 http://localhost:8811/health_check 요청을 보내면 아직 변경사항이 적용되지 않았음을 확인할 수 있습니다.

변경사항을 적용 하기위해 http://localhost:8811/actuator/refresh 로 post 요청을 보내보겠습니다.
(post로 요청을 보내야하기 때문에 Postman을 이용하였습니다.)

이제 변경 사항이 적용이 확인하기 위해 다시 http://localhost:8811/health_check 로 요청을 보내보면 다음과 같이 정상적으로 반영이 된것을 확인할 수 있습니다.


마치며

Spring Cloud Config을 이용하여 여러 Application의 설정 파일을 관리 하는 방법과 설정 파일의 변경 사항이 바로 적용되지 않았던 문제를 Spring Boot Atuator를 이용하여 문제를 해결하였지만 하지만 아직 모든 문제가 해결된 것은 아닙니다.

지금 처럼 하나의 서버만 변경사항을 적용할 때는 문제가 없지만 여러개의 서버에 변경 사항을 적용하려면 일일히 요청을 보내야 하는 문제가 남아있습니다.

그래서 다음에는 이 문제를 해결해줄 Spring Cloud BusRabbitMQ 를 이용한 방법을 알아보겠습니다.

profile
머라도 해봐요

0개의 댓글