[Spring Cloud] Spring Cloud Config 에서 Spring Actuator 와 Spring Cloud Bus

최동근·2023년 10월 18일
0

해당 포스팅은 인프런의 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 을 수강하면서 정리하는 글입니다. 이도원님의 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

안녕하세요 오늘은 Spring Cloud Config 과 함께 사용되는 Spring ActuatorSpring Cloud Bus 에 대해서 알아보겠습니다 ❗️

☁️ Spring Cloud Config Server 기본 동작 방식과 문제점

이는 설정 파일을 외부로 분리하고 필요할 때마다 Config Server 에서 최신화된 설정값을 가져오기 때문에 가능합니다.

하지만 클라이언트와 직접 맞닿아 있는 분산 시스템의 애플리케이션에 변경 사항이 반영되려면 별도의 기술이 필요합니다 🤔

가령, Git 저장소에 저장되어 있는 Config 값을 변경하면 Config Server 는 업데이트 된 설정 파일을 가져올 수 있지만 Config Server 에서 설정값을 가져오는 각 애플리케이션이 가져온 설정값은 업데이트되지 않습니다 ❗️
그 이유는 애플리케이션과 Config Server 을 연결한 후, 각 애플리케이션이 구동 되는 시점에 Config Server 에서 값을 가져오기 때문입니다 💁‍♂️

Spring Cloud Config Server 동작 원리 살펴보기


그림처럼 MSA 의 User 라는 이름의 서비스가 있다고 하겠습니다.
User 라는 서비스는 구축된 Config Server 을 통해 Config Repository 에 존재하는 외부 설정 파일 값을 가져옵니다.
여기서 가정할 시나리오는 개발자가 Config Repository 에 접근해 설정 파일값을 변경하는 상황입니다.

  1. User Service 는 해당 인스턴스 생성 시점에 Config Server에 설정 파일을 요청한다.
    이때 User Service 의 애플리케이션 이름 + 프로파일을 조합해 요청한다.

  2. Config Server 는 이에 따라 Config Repository 에 설정 파일을 요청한다.

  3. 관리자(개발자) 가 Config Repository 의 설정 파일을 변경한다.

이렇게 User 서비스가 잘 사용중이던 설정 파일 값을 Config Repository 에서 변경하면 애플리케이션으로부터 Config Server 로 요청이 들어올때 Config Server 는 업데이트 버전을 재구동없이 반영하지만,
User 서비스는 재구동하지 않는 이상 이전 값을 사용하게 됩니다. 즉, User 서비스가 처음에 구동할때 Config Server 로부터 가져온 설정 파일을 유지합니다.

해당 이미지는 로컬 8888 port 에서 돌아가는 Config Server 에서 설정값을 가져오는 User Application 이 구동될 때 로그 이미지입니다.
메세지에서 알 수 있듯이, 애플리케이션이 구동될때 Config Server 에서 값을 가져오는 것(Fetching) 을 알 수 있습니다.
따라서, 애플리케이션 구동 중에, 설정 값이 변경되면 변경된 설정 값을 사용하는 애플리케이션은 모두 재구동 시켜야 하는 번거로움이 있습니다 🤔

이를 위해 Spring ActuatorSpring Cloud Bus 라는 2가지 기술이 함께 사용됩니다 두가지 기술에 대해 간단히 알아보고 실습 파트에서 적용해보겠습니다. 🧑🏼‍💻

☁️ Spring Actuator 의 Refresh

1. spring actuator 란

Spring Actuator 란 애플리케이션의 상태를 모니터링, Metric 수집을 위한 Http EndPoint 을 제공해주는 모듈입니다.
뿐만 아니라, 애플리케이션을 제어할 수 있는 일부 기능 또한 제공합니다.
: spring-boot-actuator 주요 엔드포인트

implementation 'org.springframework.boot:spring-boot-starter-actuator' 

이렇게 dependency 만 추가해주면 사용이 가능합니다❗️
알아보았듯이, 사용법도 쉽고 개발자에게 편의를 제공하는 기능을 가지고 있지만,
잘못 사용할 경우 비밀번호, API Key, Token 등 보안이나 내부 서비스 도메인, IP 주소와 같은 중요 정보들이 유출될 수 있습니다.
: Spring Actuator 안전하게 사용하기

따라서, 기본적으로 Spring ActuatorHealthInfo 엔드포인트를 제외하고는 모두 비활성화 되어 있습니다 ❗️
개발자가 사용하기 원하는 엔드포인트가 있는 경우 이와같이 별도로 application.yml 에 추가해주어야 합니다.

management:
  endpoints:
    web:
      exposure:
        include: refresh,health,beans,httpexchanges # 활성화할 endpoint

앞에서 언급했던, 설정값이 변경되었을 때 해당 설정값과 관련된 모든 Application 을 재구동시켜야 하는 문제점을 해결하기 위해 Spring ActuatorRefresh 라는 기능을 제공합니다 ❗️
해당 기능을 사용함으로서 애플리케이션을 재구동할 필요없이 업데이트된 설정 파일 저장소의 설정값을 가져올 수 있습니다.

2. user service 구성 살펴보기

위에서 가정한 사오항과 동일하게 User Service 을 이용해서 테스트를 해보고자합니다.
먼저 User Serviceapplication.yml 을 살펴보겠습니다.

// User Service 의 application.yml
server:
  # 0 : 랜덤 포트
  port: 0

spring:
  application:
    name: user-service

  config:
    name: user-service
    import: optional:configserver:http://localhost:8888

  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:~/scna_user_service
    username: sa
    password:

  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console

  jpa:
    properties:
      hibernate:
        format_sql: true

    hibernate:
      ddl-auto: update

# host ip:application name:port
# 동일한 포트로 여러 동일 서비스를 구동 시켜도 eureka dashboard 에 하나만 표기 -> instance id 지정해야한다.
eureka:
  instance:
    instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
  client:
    # eureka server 에 client 로 등록할지
    register-with-eureka: true
    # eureka server 로 부터 주기적으로 instance 정보를 가져올지
    fetch-registry: true
    # eureka server 위치
    service-url:
      defaultZone: http://localhost:8761/eureka


## spring actuator
management:
  endpoints:
    web:
      exposure:
        include: refresh, health, beans

greeting:
  message: Welcome to the Simple E-Commerce User Service

logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type: trace

해당 실습에서 Spring Eureka 및 데이터베이스 설정을 위해 application.yml 이 비대하지만, 이번 파트에서 집중적으로 보아야할 부분은 Spring Cloud Config ServerSpring Actuator 설정 부분입니다.

local 에서 8888번 포트로 구동되는 Config Server 에서 필요한 설정 값을 가져오고 있으며, Spring Actuztor 기능으로 refresh, health, beans 을 활성화 하고 있습니다.
user service 는 default 프로파일로 구동됩니다.

3. Spring Cloud Config Server 구성 살펴보기

// Config Server 의 application.yml
## config server = 8888
server:
  port: 8888

## org.springframework.boot:spring-cloud-config-server

spring:
  application:
    name: config-server

  cloud:
    config:
      server:
        git:
          uri: https://github.com/choidongkuen/spring_cloud_config_repo.git

해당 application.yml 에서 볼 수 있듯이 Git Hub 을 이용해 구성되어있는 외부 설정 파일 저장소를 바라보고 있습니다.
: Git Hub 외부 설정 파일 저장소 주소

4. spring actuator refresh 테스트 해보기

앞서 언급한바와 같이 user service 는 default 프로파일로 구동됩니다.
따라서 외부 설정 파일 저장소 기준 user-service-default.yml -> user-service.yml -> application.yml 순서의 우선순위로 설정 파일의 설정 값을 가져옵니다.

외부 설정 파일 저장소의 user-service-default.yml 을 살펴보겠습니다.

우리는 테스트를 위해 user-service-default.ymljwt:expiration 설정값을 바꿔보겠습니다.

☁️ Spring Cloud Bus

profile
비즈니스가치를추구하는개발자

0개의 댓글