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 사용하기
- spring-boot-starter-actuator 의존성 추가
- application.yml에 actuator endpoint 지정 (아래 공식문서에서 actuator에서 지원하는 endpoint를 확인할 수 있다.)
https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html
...
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 설치
- https://www.rabbitmq.com/install-homebrew.html
- 127.0.0.1:15672
- 초기 username, password는 guest
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" 호출
'개발 > Spring Cloud' 카테고리의 다른 글
[Spring Cloud] 마이크로서비스간 통신 (RestTemplate vs FeignClient) (0) | 2023.06.22 |
---|---|
[Spring Cloud] Config Server 설정 정보의 암호화 처리 (0) | 2023.06.20 |
[Spring Cloud] Spring Cloud Gateway 구축하기 (0) | 2023.06.12 |
[Spring Cloud] Client Side Load Balancer & API Gateway 개념 정리 (0) | 2023.06.11 |
[Spring Cloud] Eureka Client 구축하기 (0) | 2023.06.05 |