[Spring Cloud 마이크로서비스] Spring Cloud Config와 Spring Cloud Bus를 활용한 분산 시스템 구성 및 설정 자동 반영

November·2025년 3월 10일
0
post-thumbnail

Spring Cloud Config

  • 분산 시스템에서 서버, 클라이언트 구성에 필요한 설정 정보(application.yml)를 외부 시스템에서 관리
  • 하나의 중앙화 된 저장소에서 구성요소 관리 가능
  • 각 서비스를 다시 빌드하지 않고, 바로 적응 가능
  • 애플리케이션 배포 파이프라인을 통해 DEVUATPROD 환경에 맞는 구성 정보 사용

DEV: 개발환경
UAT : user acceptable test - 유저가 테스트(개발을 요청한 고객)
PROD: 운영환경 (소비자가 사용할 수 있는 환경)


유저 서비스의 설정 파일 2가지

bootstrap.yml 추가하기

spring:
  cloud:
    config:
      uri: http://127.0.0.1:8888 #Spring Cloud Config Server 주소 지정
      name: user-service # Config Server에서 가져올 설정 파일 이름 지정
      # profiles: 환경별 설정 파일 가져올 수 있음 
		# active: dev

bootstrap.ymlapplication.yml보다 먼저 읽힘 (더 높은 우선순위)
8888은 config-service의 포트번호, 컨피그 서버에서 user-service를 가져오라는 뜻

application.yml

spring:
#  config:
#    import: optional:configserver:http://127.0.0.1:8888/
  cloud:
    config:
      name: user-service

우선 순위


application-<profile>.yml 이 가장 먼저 !
현재 실습에서 application-name.ymluser-service.yml을 사용하고 있음


Configuration Service와 마이크로 서비스 구성


변경 사항이 있을 때 Git의 내용만 수정하면 연결된 서비스도 자동으로 변경 되도록 해주는게 Configuration Service !!


로컬 깃 레포지토리 생성


이름은 user-service.yml로 만들었고 다음과 같이 작성했다.

application.yml

server:
	port: 8888

spring:
	application:
    	name: config-service
    cloud:
    	config:
        	server:
            	git:
                	uri: ⭐️위에서 만들어준 로컬 깃 레포의 경로를 작성해줌 !!⭐️

http://127.0.0.1:8888/user-service/default 로 접속해 컨피그 설정 정보 확인

  • "name" : 어디서 읽어 왔는지
  • "source" : 어떤 값들을 가지고 왔는지

설정 정보 사용하기

UserController.java

http://localhost:60000/health-check 로 접속해서 토큰 정보가 잘 나오는 지 확인

컨피그 정보를 수정하면 자동으로 반영이 될까 ⁉️

user-service.yml 내용을 변경하고 로컬 git에 커밋
그리고 config 페이지에 다시 접속하면 변경 내용이 반영됨
⭐️ 하지만 유저서비스에는 자동으로 반영되지 않음 ⭐️
health-check에 접속해서 새로고침해도 안됨
유저서비스를 "재기동" 해야 반영됨. 하지만 매번 재기동할 수는 없다 !!!


⬇️

재기동 하지 않고도 config의 변경 사항이 적용되도록 하고 싶다 ‼️

💡 Actuator의 refersh 기능을 사용하자
서비스들이 재부팅 없이 설정 정보나 구성 정보를 반영할 수 있음

  • antMatchers("/actuator/**").permitAll();
    /actuator/ 아래 모든 엔드포인트에 대한 접근 허용
  • antMatchers("/**").hasIpAddress("192.168.0.8")
    그 외의 모든 요청(/**)에 대해 특정 IP(192.168.0.8)에서만 접근 허용

Actuator refresh 사용

포스트맨 post 요청보내기 localhost:60000/actuator/refresh
다시 유저서비스 http://localhost:60000/health-check 새로고침해주면
재부팅 없이 내용이 변경된 것을 확인할 수 있음 !!


Multiple environments

user-service-dev.yml 파일을 따로 만들어서 설정할 수도 있음 → 환경에 따라 다른 설정 값


config server로 원격 깃 레포지토리를 사용하고 싶다면 ❓

설정 파일에서 로컬 레포의 위치 정보를 원격으로 바꿔서 사용함

spring:
#  profiles:
#    active: native
  application:
    name: config-service
  cloud:
    config:
      server:
        native:
          ##search-locations: file:////Users/binys/Desktop//git-local-repo
        git: #default
          uri: ⭐️ 여기에 remote 깃허브 주소 !!!! ⭐️ 

Spring Cloud Gateway

의존성 추가

 <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

application.yml

Actuator에서 사용할 수 있는 엔드포인트를 활성화

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

USER-SERVICE의 Actuator 정보 추가

- id: user-service
  uri: lb://USER-SERVICE
  predicates:
    - Path=/user-service/actuator/**
    - Method =GET,POST

ApigatewayServiceApplication.java

//for httptrace 요청 추적 기능 활성화 
@Bean
public HttpTraceRepository httpRepository(){
	reutn new InMemoryHttpTraceRepository();
}

Spring Cloud Bus

그런데 마이크로서비스의 개수가 매우 많을 수 있다.
연결된 모든 마이크로서비스마다 actuator refresh 해주는게 번거로움..
한번에 모든 서비스에 refresh가 적용되도록 하자 !! ➡️ 📩 메세지 브로커를 이용

원리

개별 서버를 하나 하나 업데이트 하는게 아니라 클라우드 버스에 변경사항을 업데이트 해줌
컨피그에 변경사항이 있으면 메세지 브로커에게 알려줌
👉 그럼 브로커가 개별 마이크로 서비스에 변경 사항을 알려줌

Actuator bus-refresh Endpoint

busrefresh

  • 분산 시스템의 노드를 경량 메시지 브로커와 연결
  • 상태 및 구성에 대한 변경 사항을 연결된 노드에게 전달(Broadcast)

가지고 있는 모든 마이크로 서비스에 한꺼번에 업데이트 가능하게 해줌

🐰 Rabbit MQ

메시지 브로커 시스템 : 시스템 간 데이터를 주고받을 때 중간에서 메시지를 관리

  • 비동기 처리: 시간이 오래 걸리는 작업을 백그라운드에서 실행
  • 분산 시스템: 여러 개의 애플리케이션이 동시에 데이터를 처리할 때 사용

의존성 & 설정 정보 등록

서비스 기동 되는 동시에 Rabbit MQ에 등록이 됨

도커로 Rabbit MQ 사용하기

docker run -it --rm -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:4.0-management

http://127.0.0.1:15672 로 이동하면 Rabbit MQ 대시보드가 보임

설정한 정보대로 대시보드에서 로그인하면

컨피그 → 게이트웨이 → 유저 서비스 실행
실행중인 3개 서버 확인 가능

Rabbit MQ 연결한 서비스 구성도

연결된 모든 서비스를 refresh하고 싶으면 busrefresh해주면 됨
HTTP POST http://127.0.0.1:8000/user-service/actuator/busrefresh

0개의 댓글