우리는 구성 정보 파일로써 application.yml 파일을 사용했었는데,
yml 파일의 내용이 변경이되버리면 어플리케이션 자체가 다시 빌드가 되고 배포가 되어야 된다.
그런 방법을 개선하기 위해서 어플리케이션 내부에서 구성 파일을 가지고 있는 것이 아니라 외부에 있는 시스템을 통해서 구성 파일 정보를 관리할 수 있는 기능이다.
cd git-local-repo
git init
// git add를 통한 ecommerce.yml 추적관리
git add ecommerce.yml
// commit을 통해 git local repo에 저장
git commit -m "upload an application yaml file"
ecommerce.yml
# 토큰 정보
token:
expiration_time: 86400000
secret: user_token
# 허용 IP
gateway:
ip: 192.168.35.233
dependencies {
implementation 'org.springframework.cloud:spring-cloud-config-server'
}
@SpringBootApplication
@EnableConfigServer
public class ConfigServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServiceApplication.class, args);
}
server: port:8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: file:///D:\\Study\\git-local-repo
implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-bootstrap'
현재 application.yml은 각종 설정정보가 여기에 들어가 있다. port정보, spring cloud의 어플리케이션 name이라던가 아니면 접속하고자하는 외부에 있는 api 주소 정보라던가 아니면 라우팅 정보라던가 이러한 정보들을 어플리케이션의 상황에 맞춰서 정의를 해왔다.
여기에 bootstrap.yml을 만들고자 한다.
application.yml보다 우선순위가 높은 설정파일이 하나 생기는 것이다.
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce
물론 이 정보는 application.yml 안에 내부적으로 같이 가지고 있어도 되는 부분이다. 하지만 우리가 하고자 하는 작업의 핵심은 원래 가지고 있었던 application.yml의 특정한 부분을 띄어서 별도의 다른 공용 서버 역할을 해주는 spring cloud config 서버를 이용해보겠다는 이번 프로젝트의 목적이다.
해당하는 부분이 읽혀지는 부분들을 앞에 있는 application.yml 파일 보다는 먼저 작업을 해야지만 전체적으로 우리가 필요했던 resource가 다 맞아 떨어진다.
따라서 오른쪽에있는 cloud config에 대한 정보를 등록해 줄 수 있는 파일이 필요하다.
⚠ 스프링 클라우드 config client -> bootstrap.yml 지원 만료
spring:
cloud:
config:
name: ecommerce
config:
import: optional:configserver:http://localhost:8888
bootstrap.yml은 그대로 유지
spring:
config:
import:
- classpath:/bootstrap.yml
-> 서버를 매번 재기동하는 방법은 좋은 방법은 아니다. (Spring Cloud를 사용하는 의미가 없다.)
: Actuator 여러가지 옵션 중에서 refresh라는 옵션을 사용하게 되면 현재 User-MicroService를 재부팅하지 않은 상태에서도 우리들이 필요한 정보를 얻어올 수 있다.
💡 Spring Boot Actuator?
- Application의 상태라던가 모니터링을 할 수 있는 작업을 의미
- Metric 수집을 위한 Http End point 제공
implementation 'org.springframework.boot:spring-boot-starter-actuator'
# Actuator 구성을 지정하는데 사용되는 부분
management:
# Actuator 엔드포인트를 구성하는 데 사용되는 부분
endpoint:
# Actuator 엔드포인트가 웹 요청에 응답하는 데 사용되는 부분
web:
# Actuator 엔드포인트에서 노출할 엔드포인트를 구성하는 데 사용되는 부분
exposure:
# Actuator 엔드포인트에서 노출할 엔드포인트의 목록을 구성하는 데 사용되는 속성
include: refresh, health, beans
application.yml
management:
endpoints:
web:
exposure:
include: refresh, health, beans, httptrace
httptrace: client 요청이 들어와서 spring boot에 구성되어 있는 각각의 마이크로서비스의 상태를 화면에 보여줄 수 있다.
💡 Spring 3.x.x 버전부터 HttpTrace 대신 HttpExchanges로 이름 변경
- application.yml에서는 httptrace 대신 httpexchanges를 적어준다.
- HttpTraceRepository 대신 HttpExchangeRepository를 적어주면 된다.
HttpTraceRepository
빈 등록
// HTTP 요청과 응답에 대한 추적 정보를 저장하고 관리하는 이넡페이스
@Bean
public HttpTraceRepository httpTraceRepository() {
// 메모리에 HTTP 추적 정보를 저장함
return new InMemoryHttpTraceRepository();
}
클라우드 버스를 사용하게 되면 2번째 방법보다 효율적으로 정보를 사용할 수 있다. (이후에 다룸)
git-local-repo에 ecommerce-dev.yml, ecommerce-prod.yml 파일 추가
user-service, api-gateway-service의 bootstrap.yml 파일에 profiles 설정 추가
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce
profiles:
active: dev
config-service의 application.yml 파일 수정
server: port:8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: https://github.com/Sanizzang/spring-cloud-config
# Private으로 설정시 username, password 정보도 입력해야함
# username: [your username]
# password: [your password]
spring:
application:
name: config-service
profiles:
active: native
cloud:
config:
server:
native:
search-locations: file:///${user.home}\\file경로
git:
uri: https://github.com/Sanizzang/spring-cloud-config
노드: MicroService
메시지 브로커: RabbitMQ 사용 예정
Spring Cloud Config Server + Spring Cloud Bus
데이터가 갱신되었음을 알려줄 예정
AMQP(Advanced Message Queing Protocol)을 이용해서
데이터가 변경되었음을 알려줄 예정
Kafka가 대용량의 데이터를 처리하고자 할 때 많이 선택되는 솔루션이고 RabbitMQ는 더 적은 데이터를 안전하게 전달하는 것을 보장시켜주는 데이터라고 보면된다.
Spring Cloud Bus는 연결되어진 노드에게 전달하는 방송(Broadcast)역할을 한다.
RabbitMQ라는 메시지 큐잉 서비스에 configuration 서버, apigateway 서버, user 서버가 연결되어 있는 구조
Spring Cloud Config는 구성 정보를 중앙 집중식으로 저장하고, 클라이언트 애플리케이션은 해당 서비스에서 구성 정보를 로드하여 사용할 수 있다.
이를 통해 분산 시스템의 다양한 애플리케이션에서 중복되는 구성 정보를 제거하고, 애플리케이션의 유지 보수성을 높이는 데 도움이 된다.
RabbitMQ는 분산 메시징 시스템으로서, 애플리케이션 간에 비동기적으로 메시지를 전송할 수 있도록 도와준다. RabbitMQ를 사용하면 애플리케이션 간의 결합도를 낮추고, 느슨한 결합을 유지할 수 있어 애플리케이션의 확장성과 유연성을 높일 수 있다.
Spring Cloud Config와 RabbitMQ를 함께 사용할 경우, RabbitMQ를 사용하여 구성 정보 변경 사항을 다른 애플리케이션에게 전파할 수 있다. 예를 들어, 구성 서비스에서 구성 정보를 업데이트하면 해당 변경 사항을 RabbitMQ에 게시하고, 다른 애플리케이션은 해당 변경 사항을 구독하여 자동으로 업데이트된 구성 정보를 수신할 수 있다. 이를 통해 애플리케이션 간이 구성 정보 변경 사항을 쉽게 전파하고, 애플리케이션의 유연성과 확장성을 높일 수 있다.
/refresh 사용 -> /busrfresh 사용 변경
-> Spring Cloud에 연결되어 있는 아무곳에서나 실행해도 적용이 된다.
C:> rabbitmq-plugins enable rabbitmq_management
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-amqp'
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: busrefresh