Spring Cloud Config
- 분산 시스템에서 서버, 클라이언트 구성에 필요한 설정 정보(application.yml)를 외부 시스템에서 관리
- 하나의 중앙화 된 저장소에서 구성요소 관리 가능
- 각 서비스를 다시 빌드하지 않고, 바로 적응 가능
- 애플리케이션 배포 파이프라인을 통해
DEV
–UAT
–PROD
환경에 맞는 구성 정보 사용
DEV
: 개발환경
UAT
: user acceptable test - 유저가 테스트(개발을 요청한 고객)
PROD
: 운영환경 (소비자가 사용할 수 있는 환경)
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.yml
이application.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.yml
로 user-service.yml
을 사용하고 있음
Configuration Service와 마이크로 서비스 구성
변경 사항이 있을 때 Git의 내용만 수정하면 연결된 서비스도 자동으로 변경 되도록 해주는게 Configuration Service !!
이름은 user-service.yml
로 만들었고 다음과 같이 작성했다.
server:
port: 8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: ⭐️위에서 만들어준 로컬 깃 레포의 경로를 작성해줌 !!⭐️
"name"
: 어디서 읽어 왔는지"source"
: 어떤 값들을 가지고 왔는지UserController.java
user-service.yml
내용을 변경하고 로컬 git에 커밋
그리고 config 페이지에 다시 접속하면 변경 내용이 반영됨
⭐️ 하지만 유저서비스에는 자동으로 반영되지 않음 ⭐️
health-check에 접속해서 새로고침해도 안됨
유저서비스를 "재기동" 해야 반영됨. 하지만 매번 재기동할 수는 없다 !!!
💡 Actuator의 refersh 기능을 사용하자
서비스들이 재부팅 없이 설정 정보나 구성 정보를 반영할 수 있음
antMatchers("/actuator/**").permitAll();
/actuator/ 아래 모든 엔드포인트에 대한 접근 허용antMatchers("/**").hasIpAddress("192.168.0.8")
그 외의 모든 요청(/**)에 대해 특정 IP(192.168.0.8)에서만 접근 허용
포스트맨 post 요청보내기
localhost:60000/actuator/refresh
다시 유저서비스 http://localhost:60000/health-check 새로고침해주면
재부팅 없이 내용이 변경된 것을 확인할 수 있음 !!
user-service-dev.yml
파일을 따로 만들어서 설정할 수도 있음 → 환경에 따라 다른 설정 값
설정 파일에서 로컬 레포의 위치 정보를 원격으로 바꿔서 사용함
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 깃허브 주소 !!!! ⭐️
<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>
management:
endpoints:
web:
exposure:
include: refresh,health,beans,httptrace
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/actuator/**
- Method =GET,POST
//for httptrace 요청 추적 기능 활성화
@Bean
public HttpTraceRepository httpRepository(){
reutn new InMemoryHttpTraceRepository();
}
그런데 마이크로서비스의 개수가 매우 많을 수 있다.
연결된 모든 마이크로서비스마다actuator refresh
해주는게 번거로움..
한번에 모든 서비스에 refresh가 적용되도록 하자 !! ➡️ 📩 메세지 브로커를 이용
개별 서버를 하나 하나 업데이트 하는게 아니라 클라우드 버스에 변경사항을 업데이트 해줌
컨피그에 변경사항이 있으면 메세지 브로커에게 알려줌
👉 그럼 브로커가 개별 마이크로 서비스에 변경 사항을 알려줌
busrefresh
가지고 있는 모든 마이크로 서비스에 한꺼번에 업데이트 가능하게 해줌
메시지 브로커 시스템 : 시스템 간 데이터를 주고받을 때 중간에서 메시지를 관리
- 비동기 처리: 시간이 오래 걸리는 작업을 백그라운드에서 실행
- 분산 시스템: 여러 개의 애플리케이션이 동시에 데이터를 처리할 때 사용
서비스 기동 되는 동시에
Rabbit MQ
에 등록이 됨
docker run -it --rm -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:4.0-management
설정한 정보대로 대시보드에서 로그인하면
컨피그 → 게이트웨이 → 유저 서비스 실행
실행중인 3개 서버 확인 가능
- Config 서비스가 Rabbit MQ에 bus refresh 호출 → 연결된 모든 서비스에 적용됨
HTTP POST http://localhost:8888/actuator/busrefresh
연결된 모든 서비스를 refresh하고 싶으면 busrefresh
해주면 됨
HTTP POST http://127.0.0.1:8000/user-service/actuator/busrefresh