yaml파일의 내용이 변경되나거나 어플리케이션 자체가 다시 빌드가 되고 다시 배포가 되어야 한다.
이런 상황을 개선하기 위해서 어플리케이션 내부에 구성파일을 갖는 것이 아니라 외부에 가지고 있는 걸로 해결.
구성정보 파일을 하나만 만들어서 사용하는 것이 아니라 마이크로 서비스가 개발되고 각각의 단계에 맞춰서 설정파일을 바꿔서 사용하는것을 스프링부트에서는 프로파일이라고 얘기한다.
다양한 프로파일을 만들어서 구성파일을 이 프로파일 환경에 맞춰 설정하고 사용하는 방법을 알아보자.
- 분산 시스템에서 서버, 클라이언트 구성에 필요한 설정 정보(application.yml)를 외부 시스템에서 관리
- 하나의 중앙화 된 저장소에서 구성요소 관리 가능
- 각 서비스를 다시 빌드하지 않고, 바로 적응 가능
- 에플리케이션 배포 파이프라인을 통해 DEV-UAT-PROD환경에 맞는 구성 정보 사용
config-service 생성
$ cd /c/Users/lsi66/Desktop/MSA_STUDY/git-local-repo
$ code ecommerce.yml
token:
expiration_time: 864000000
secret: user_token
gateway:
ip: 127.0.0.1
저장한 다음
$ git init
$ git add ecommerce.yml
git commit -m "upload an default aplication yaml file"
config-service 프로젝트 생성
- 디펜던시 추가
ConfigServiceApplication.java 파일 수정
어노테이션 추가
@EnableConfigServer
application.yml
server:
port: 8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: file:///Users/lsi66/Desktop/MSA_STUDY/git-local-repo
# commerce.yml있는 주소 넣기
서버 실행 후 아래처럼 주소들어가기
uri에 적어둔 파일 내용이 보인다.
💡 application.yml 우선순위
💡 application.yml 우선순위
application.yml → application-name.yml (ex.user-service.yml) → application-name<profile>.yml (ex.user-sesrvice-dev.yml)
Spring Cloud Config 연동
user-service
Dependency 추가
- config
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- bootstartp
최근 스프링 클라우드 버전에서는 스프링 클라우드 부트스트랩을 자동으로 읽고 오는 부분이 빠져있다.
잊지말고 추가해주자. 이걸 넣어야 Configuration에 있는 정보를 인식할 수 있도록 설정이 된다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
혹은 yaml 파일에 spring.cloud.bootstartp.enabled=true 설정
bootstrap.yml 파일을 사용한 이유는 application.yml 파일에서 설정한 내용보다 먼저 호출되어야 할 설정이 필요할 경우에 사용합니다. 수업에서 사용한 것 처럼, config-service의 위치를 지정하는 용도로 사용되었으며, config-service에서는 encryption을 위한 key 값을 설정하기 위해 사용했습니다.
spring cloud config에 대한 정보를 먼저 등록해주는 파일로 이용
configuration values 변경했을 때 방영하는 3가지 방법
1. 서버 재가동
2. Actuator의 refresh옵션(서버 재가동 X)
참고링크
- Spring Boot Actuator Dependendy추가
- Application 상태, 모니터링
- Metric 수집을 위한 Http End point 제공
3. Spring cloud bus 사용 (서버 재가동 X)
1. 서버 재가동
변경하고 서버 재가동하면 됨
2. Actuator의 refresh옵션(서버 재가동 X)
user-service에 Actuator 등록
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
implementation 'org.springframework.boot:spring-boot-starter-actuator'
WebSecutiry.java
http.authorizeRequests().antMatchers("/actuator/**").permitAll();
application.yml
액추에이터(Actuator) 라이브러리를 사용하여 애플리케이션의 상태 및 정보에 접근할 수 있는 웹 엔드포인트를 정의한다.
management:
endpoints:
web:
exposure:
include: refresh, health, beans
💡Actuator
참고링크
참고링크에 들어가면 많은 endpoint를 확인할 수있다.
include: refresh, health, beans
ID Description health Shows application health information. 전체 기동 상태 확인 beans Displays a complete list of all the Spring beans in your application. 사용하고 있는 빈 확인 refresh The application context is refreshed. The application performs startup tasks and does not receive traffic yet.
설정정보 갱신httptrace 클라이언트 요청이 들어와서 스프링 부트에 구성되어 있는 각각의 마이크로 서비스 아니면 사용하고 있는 다른 서비스의 호출되는 상태, 반환 처리되는 상태 등 트레이싱을 보여준다.
Application.java에 반환 값으로서 HttpTraceRepository라는 bean을 등록해야 한다.
/health 조회
/beans 조회
refresh는 POST를 해야 값이 반영 됨
원래값은 이렇게 나온다.
ecommerce.yml
secret값 변경하고 저장
token:
expiration_time: 864000000
secret: value1
gateway:
ip: 192.168.0.106
git에 반영
git add commerce.yml
git commit -m "Changed some values"
postman에서 "../actuator/refresh" POST요청한다.(서버를 재부팅하지 않고도 변경된 값 적용)
서버를 재부팅하지 않고도 변경된 값 적용되었다.
apigateway-service에 Actuator 등록
pom.xml
Dependency 추가
- config
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- bootstartp
최근 스프링 클라우드 버전에서는 스프링 클라우드 부트스트랩을 자동으로 읽고 오는 부분이 빠져있다.
잊지말고 추가해주자. 이걸 넣어야 Configuration에 있는 정보를 인식할 수 있도록 설정이 된다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
혹은 yaml 파일에 spring.cloud.bootstartp.enabled=true 설정
- actuator
<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
ApigatewaServiceApplication.java
강의에서는 HttpTrcaRepository를 사용하지만, spring boot 3.x 부터 변경되어 HttpExchangeRepository 사용
@Bean
public HttpExchangeRepository httpTraceRepository() {
return new InMemoryHttpExchangeRepository();
}
application.yml
actuator 라우터 등록
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/actuator/**
- Method=GET, POST
filters:
- RemoveRequestHeader=Cookies
- RewritePath=/user-service/(?<segment>.*), /$\{segment}
config-servie, apigateway-servie, user-service, discover-service 프로젝트 모두 기동
잘되고 있다.
설정 정보가 바뀌었을 때는 각각 프로젝트를 refresh를 POST요청해야 한다.
반영 방법
step 1) 설정 정보를 변경해보겠다.
step 2) git 반영
git add commerce.yml
git commit -m "Changed some values"
step 3) refresh POST요청
apigateway-service에 반영
token값도 넣어줘야 함
user-service에 반영
반영이 되었다.
재가동은 안해도 되지만, 각각 프로젝트를 refresh POST요청해야 되는 게 매우 불편하다..
3. Spring cloud bus 사용 (서버 재가동 X)
다음 게시글에서 작성하겠다..
다음 게시글 - [MSA] Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) - Spring Cloud Bus(RabbitMQ)
Multiple environments
만약 데이터가 존재하지 않으면 디폴트 파일을 찾아간다.
dev로 설정했는데 파일이 존재하지 않는다면 이전의 application.yml파일이나 디폴트 파일을 찾아간다.
.yml 파일 생성
git 반영
git add commerce.yml
git commit -m "Changed some values"
apigateway-service에는 prod, user-service에는 dev 반영
apigateway-service
bootstrap.yml
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce # 어플리케이션 이름 적어줬음..파일이름을 적어라..
profiles:
active: prod
user-service
bootstrap.yml
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce # 어플리케이션 이름 적어줬음..파일이름을 적어라..
profiles:
active: dev
user-service
user-service에서 health_check를 한다.
로그인해서 나온 token을 복사하여 user-service/health_check를 진행한다.
그럼 apigateway를 거친다.
apigateway-service는 설정에서 지정했던 것처럼 prod를 가져왔다.
user-service와 token이 갖지 않기 때문에 health_check를 조회할 수 없다.(권한이 없다)
secret값(dev, prod)으로 토큰값을 만든다.
apigateway-service를 dev로 바꿔준다. 그럼 token이 동일해진다.
dev로 잘 들어왔다.
health_check값도 dev로 잘 나오고 있다.
.yml파일 말고 profiles의 active 설정하는 방법
오른쪽 상단 ...버튼에서 edit에서 Active profiles에서도 간단한게 설정할 수 있다.
테스트나 간단히 필요할 때 사용해보자.
config 파일 가져오는 바법
방법 1. git에 저장
ecommerce.yml를 깃에 올려보자
깃에서 레포지토리 만들고 링크 복사
git remote -v
git remote add origin https://github.com/MSASTUDYALONE/git-local-repo.git
버전확인
git remote -v
git push
git에 잘 올라왔다.
그럼 config-service에서 파일로 .yml을 받아오게 해뒀었는데 git으로 받아오게 해보자
config-service
application.yml
git push까지 하면 내용 적용해서 config-service에서 반영한다.
server:
port: 8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
# uri: file:///Users/lsi66/Desktop/MSA_STUDY/git-local-repo
uri: https://github.com/MSASTUDYALONE/spring-cloud-config.git #.git 생략 가능
# username: (private면 적어야함..)
# password:
방법 2. 파이 시스템에 저장
native-file-repo 파일 생성
config-service
application.yml
server:
port: 8888
spring:
application:
name: config-service
profiles: # 여기!!
active: native
cloud:
config:
server:
native: # 여기!!
search-locations: file:///${user.home}/Desktop/MSA_STUDY/native-file-repo
git:
# uri: file:///Users/lsi66/Desktop/MSA_STUDY/git-local-repo
uri: https://github.com/MSASTUDYALONE/spring-cloud-config.git #.git 생략 가능
# username: (private면 적어야함..)
# password:
../ecommerce/native
주소값은 ip:8888/파일이름/profile명 이렇게 적으면 된다.
(ex. http://127.0.0.1:8888/ecommerce/prod)
native로 잘 나오고 있다
native로 잘 나오고 있다