본문 바로가기
개발/Spring Cloud

[Spring Cloud] Config Server 구축하기 (busrefresh 하기)

by baau 2023. 6. 19.

Spring Cloud Config Server

  • 분산 시스템 환경에서 서버, 클라이언트 구성에 필요한 설정 정보를 외부 시스템에서 관리하는 서버
  • 외부에서 모든 환경에 대한 정보들을 관리해주는 중앙 서버
  • 기존에는 각 Micro Service가 설정 정보 파일(application.yml)를 관리하여, 해당 파일이 변경되면 해당 서버를 다시 빌드하고 배포해야하는 번거로움이 있었다.

 

Config Server의 장단점

  • 장점
    • 여러 서버의 설정 파일을 중앙 서버에서 관리할 수 있다.
    • 변경 사항이 있을 때 모든 Micro Service에 대해 일관된 업데이트를 적용할 수 있어, 중복 설정을 줄이고 유지 보수를 간소화할 수 있다.
    • Mirco Service가 재배포 하지 않고 설정 파일의 변경사항을 반영할 수 있다.
    • 여러 환경(개발, 테스트, 운영 등)에 대해 다른 구성값을 제공할 수 있다.
  • 단점
    • Config Server가 장애가 발생하면 Mirco Service 전체에 영향을 줄 수 있다. (SPOF)
    • 설정 파일의 우선순위로 인해 설정 정보가 덮어씌워질 수 있다.

 

Config Server 구축

Remote Git Repository 에 설정파일 생성

설정파일을 Local Git Repository, File Storage에 저장하여 Config Server가 설정 파일을 읽어올 수 있다. 해당 포스트에서는 중앙 집중식 관리와 협업 지원을 위해 Remote Git Repository에 설정파일을 저장하는 방법으로 구축한다.

  • Git Repository를 만들고, 디렉토리 구조는 각자의 환경에 맞도록 생성한다.
  • 설정 파일의 이름은 {앱 이름}-{프로파일}.yml 로 작성한다.

예시) ecommerce-dev.yml

token:
    expriation_time : 864000000
    secret: jwt_secret_token

gateway:
    ip: xxx.xxx.x.x

 

Gradle 의존성 추가

implementation 'org.springframework.cloud:spring-cloud-config-server'
implementation 'org.springframework.boot:spring-boot-starter-actuator'

 

Config Server 설정 파일 (application.yml)

Public Repository

server:
  port: 8888

spring:
  application:
    name: config-service

  cloud:
    config:
      server:
        git:
          uri: {git repository 주소}
          search-paths: {설정 파일들을 찾을 경로}
          default-label: {git branch 이름}
  • server.port
    • Config Server는 기본적으로 8888 포트를 사용하기 때문에 server.port는 8888로 지정
  • spring.cloud.config.server.git
    • uri : Git Repository의 URI
    • search-paths : Git Repository에서 구성 파일을 검색할 경로 지정
    • default-lable : Git Repository의 기본 브랜치 지정

Private Repository

server:
  port: 8888

spring:
  application:
    name: config-service

  cloud:
    config:
      server:
        git:
          uri: {git repository 주소}
          username: {github username}
          password: {github password}
          search-paths: {설정 파일들을 찾을 경로}
          default-label: {git branch 이름}
  • Private Repository인 경우에는 username과 password를 추가한다.

 

Config Server 활성화 (XXXApplication.java)

@SpringBootApplication
@EnableConfigServer
public class XXXApplication {

    public static void main(String[] args) {
        SpringApplication.run(XXXApplication.class, args);
    }

}
  • 메인 클래스에 @EnableConfigServer 추가하면 구축 끝!

 

Config Server 구축 완료 후, 설정 파일을 잘 읽어오는지 확인

Config Server 실행 후, http://127.0.0.1:8888/{앱이름}/{프로파일} 로 접근하면 정상적으로 동작하는지를 확인할 수 있다.

 

ConfigClient 구축

Gradle 의존성 추가

implementation 'org.springframework.cloud:spring-cloud-config-client'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'

 

  • spring-cloud-starter-bootstrap
    • Spring Cloud Config와 연동되어 외부 구성 서버에서 구성 파일을 가져오는 기능을 제공합니다.
    • 구성 서버의 URI, 구성 파일 경로, 프로파일 등의 설정은 bootstrap.properties 또는 bootstrap.yml에 작성한다.
    • application.yml 보다는 먼저 Spring Cloud Config Server에서 설정 파일을 읽어오는 역할을 한다.

 

Config Client 설정 파일 (bootstrap.yml)

spring:
  cloud:
    config:
      uri: {Config Server URI}
      name: {앱이름}
  profiles:
    active: {프로파일}

 

Config Server에서 설정 파일을 잘 읽어오는지 확인

Config Client 실행시, 콘솔창에서 Config Server로 부터 설정파일을 읽어왔음을 확인할 수 있다.

 

Config Server의 구성 정보가 변경되면 Mirco Server가 해당 값을 다시 읽어오는 방법

1) Micro Server 재기동

  • Micro Server를 재시작하면 Config Server에 대한 새로운 설정 정보를 가져온다.
  • 가장 직관적인 방법이지만, 대규모 시스템에서 여러 개의 Micro Server를 하나하나 재기동하기는 것은 매우 번거로운 일이다.
  • 불가능

2) Actuator refresh

  • Spring Boot Actuator는 애플리케이션의 운영 및 모니터링을 지원하는 라이브러리이다.
  • Actuator의 '/refresh' 엔드포인트를 호출하면 Micro Server는 Config Server에게 설정 변경 사항을 확인하고 업데이트된 설정 정보를 가져올 수 있다.
  • 서비스 중단 없이 구성 변경을 적용할 수 있는 장점이 있다.
  • 하지만 모든 Micro Server에 대해서 개별적으로 호출해야 하므로 작업량이 많아질 수 있다.

Actuator refresh 사용하기

...

management:
  endpoints:
    web:
      exposuer:
        include: refresh,health,beans
  • 각 Micro Server에서 Post방식으로 "{서버 URI}/actuator/refresh" 호출

 

3) Spring Cloud Bus 사용

  • 서비스 노드를 연결하여 설정 정보 등의 변경을 전파해주기 위한 경량화된 메세지 브로커 프로젝트
  • AMQP를 메세지 브로커로 사용
    • AMQP(Advanced Message Queuing Protocol)는 메시지 지향 미들웨어 시스템 간의 표준화된 통신 프로토콜
    • 메시지 큐 시스템, 이벤트 기반 아키텍처, 분산 시스템 및 MSA 등 다양한 환경에서 사용
    • 메시지 지향, 큐잉, 라우팅, 신뢰성, 보안, 확장성 등 특징을 가진다.
    • AMQP 브로커로 대표적으로 RabbitMQ가 있다.
  • Config Server의 변경사항이 생기면 Spring Bus를 통해 각 Micro Service를 자동으로 갱신한다.

 

RabbitMQ 설치

 

Spring Cloud Bus 사용

1) Config Server와 Micro Service에 spring-cloud-starter-bus-amqp 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'

 

2) Config Server, Micro Service 설정파일에 rabbimq 등록

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: {username}
    password: {password}
    
management:
  endpoints:
    web:
      exposure:
        include: health,refresh,busrefresh
  • web으로 RabbiMQ를 접속할 때는 포트가 15672이지만, 시스템에서 AMQP를 호출할 때는 포트가 5672 이다.
  • Actuator의 endpoint로 busrefresh 추가

 

3) 테스트

  • RabbitMQ Server → Config Server → Eureka Discovery Server → Gateway Server → Micro Service 순으로 실행
  • Post방식으로 "{서버 URI}/actuator/busrefresh" 호출