지금까지 E-commerce 에 필요한 서비스들을 만들어봤다.
지금부터 각각의 서비스의 application.yml 파일에 내용이 변경될 때 애플리케이션 자체를 빌드 , 배포를 해야하는 단점을 해결해보자.
private Git Repository 에서 Spring Cloud Config Server 를 거쳐서 각 서비스에 구성 정보를 전달하는 방식으로 변경해보자.
현재 token 에 관련된 정보가 user-service , api-gateway-service 2군데에서 관리가 되고 있다.
이것을 ecommerce.yml 파일 한 군데에서 관리할 수 있도록 단일화를 해보자.
그런후에 Spring Cloud Config Server 의 역할을 하는 프로젝트를 하나 더 생성한다.
git-local-repo 파일을 만들고 Visual Studio Code 를 이용해 ecommerce.yml 를 만들고 여기에 token 에 해당하는 정보들을 넣었다.
# config-server applicatino.yml
# config-server의 default port 번호가 8888
server:
port: 8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: file:///Users/supportkim/Desktop/git-local-repo
Users Microservice 에 있는 /health_check 에 해당하는 메서드에서 yml 파일에 있는 각 정보들을 출력하는 로직를 만들어서 테스트도 해본다.
먼저 user-service 에서 application.yml 파일에 token 정보를 주석처리한다.
# user-service bootstrap.yml
spring:
cloud:
config:
uri: http://127.0.0.1:8888
# name 에는 파일명 넣기(ecommerce.yml)
name: ecommerce
@GetMapping("/health_check")
public String status() {
return String.format("It's Working in User Service"
+ ", port(local.server.port)=" + env.getProperty("local.server.port")
+ ", port(server.port)=" + env.getProperty("server.port")
+ ", token secret=" + env.getProperty("token.secret")
+ ", token expiration time=" + env.getProperty("token.expiration_time"));
}
token 정보는 yml 파일에서 주석처리를 했지만 config-server 는 git-local-repo 에 들어있는 ecommerce.yml 파일을 가지고 있고, user-service 는 bootstrap.yml 에 config-server 의 URI 와 yml 파일 이름을 넣어줬기 때문에 token 정보를 가져올 수 있다.
여기서 문제는 ecommerce.yml 파일의 구성 정보를 변경한 것을 반영하기 위해서는 3가지의 선택지가 주어진다.
1. 서버 재기동
먼저 2번의 방법을 사용하고 3번 방법은 다음 시간에 사용해본다.
# user-service application.yml
management:
endpoints:
web:
exposure:
include: refresh , health , beans
먼저 apigateway-service 에서 3가지 의존성을 추가하고 bootstrap.yml 파일을 만들고 user-serivce 와 같이 작성한다.
# bootstrap.yml
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce
# application.yml
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/actuator/**
- Method=GET,POST
filters:
- RemoveRequestHeader=Cookie
- RewritePath=/user-service/(?<segment>.*), /$\{segment}
management:
endpoints:
web:
exposure:
include: refresh , health , beans , httptrace
@Bean
public HttpExchangeRepository httpExchangeRepository() {
return new InMemoryHttpExchangeRepository();
}
해당 정보를 추가하고 실행하면 8888 정보를 가져오고, 만약 구성 정보의 변경을 반영하기 위해서는 /actuator/refresh 를 POST 로 요청하고 나면 반영이 된다.
위에 우선순위를 보면 현재 2번에 있는 방법을 사용한 것이다.
이번에는 3번의 방법을 사용해보자.
# 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
만약 git-local-repo 라는 파일을 Git 에 올렸을때 해당 정보를 가지고 오는 방법을 알아보자.
# config-server application.yml
server:
port: 8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: git repo 주소
username:
password:
git 에 저장하는 것이 아닌 파일 시스템에 저장한 정보를 가져오는 방법을 알아보자.
native-file-repo 라는 파일을 만든다.
# config-server application.yml
server:
port: 8888
spring:
application:
name: config-service
profiles:
active: native
cloud:
config:
server:
native:
search-locations: file://${user.home}/Desktop/native-file-repo
http.authorizeHttpRequests((authz) -> authz
.requestMatchers(new AntPathRequestMatcher("/actuator/**")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/**")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/h2-console/**")).permitAll()
.requestMatchers("/**").access(
new WebExpressionAuthorizationManager("hasIpAddress('127.0.0.1') or hasIpAddress('172.30.56.196')"))
).authenticationManager(authenticationManager);