위 사진은 Netflix의 마이크로서비스들의 관계를 나타낸 것이다. 한눈에 봐도 복잡해보이는 이러한 어플리케이션이 구성되기 위해서는 수십~백가지의 마이크로서비스들이 모여 통신한다. 각각의 마이크로서비스들은 설정 파일들을 개발 환경(개발 - 테스트 - 배포)에 따라 하나 이상의 설정 파일들이 있을 것이다.
기본적으로 서비스에는 application.yml이 들어가 있는데 이 설정 파일들을 한 곳에서 관리하기 위해서는 식별 할 수 있어야 하기 때문에 설정 파일에 각 서비스 이름을 부여해줘야 할 것이다. 이때 작명에 따라서 우선순위가 나눠질 수 있다.
# 설정 파일을 저장할 디렉토리로 이동
git init
# 설정 파일 변경 시 반복
git add <추가/변경 된 파일명>
git commit -m "commit message"
token:
expiration_time: 864000000
secret: user_token_default
Local Git Repository를 생성한 후 그곳에 설정 파일을 생성하고 해당 서비스에 필요한 설정 내용들을 작성한다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
@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:///{Local Repository PATH}
http://localhost:8888/{yml명}/{profile명} 에 요청하게 되면 아까 전에 생성하였던 ecommerce.yml이 조회되는 것을 확인할 수 있다.
<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>
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce
config service의 uri와 가져올 설정 파일의 이름을 작성하고 application.yml과 동일 PATH 상에 파일을 생성한다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/")
public class UserController {
private final Environment env;
@GetMapping("health_check")
public String status(){
return String.format("It's Working in User Service"
+ ", local port : " + env.getProperty("local.server.port")
+ ", port : " + env.getProperty("server.port")
+ ", secret : " + env.getProperty("token.secret")
+ ", expiration_time : " + env.getProperty("token.expiration_time"));
}
}
연동할 서비스의 컨트롤러에 내용이 제대로 적용이 되었는지 기존 서비스 applcation.yml 설정되어 있는 서버 포트와 config service에서 가져온 port, secret, expiration_time 정보를 확인할 수 있는 엔드포인트를 작성한다.
http://127.0.0.1:<포트번호>/health_check 에 요청을 보내게 되면 applcation.yml에 있는 port 정보와 config service에 있는 ecommerce.yml의 secret, expiration_time 정보와 port는 따로 정보를 준것이 없기 때문에 0으로 나타나있는 것을 확인할 수 있다.포트번호>
# ecommerce-dev.yml
token:
expiration_time: 86400000
secret: user_token_dev#1
# ecommerce-prod.yml
token:
expiration_time: 86400000
secret: user_token_prod#1
MicroService bootstrap.yml 수정
# 개발 환경
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce
profiles:
active: dev
# 배포 환경
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: ecommerce
profiles:
active: prod
spring.cloud.profiles.active
에 적용하고 싶은 설정 파일 하이폰 뒤에 주었던 profile 명을 기입한다.
http://127.0.0.1:<포트번호>/health_check 에 요청을 보내게 되면 설정한 profile 환경에 맞게 설정이 되는 것을 확인할 수 있다.포트번호>
깃허브로 이동하여 설정 파일을 저장할 저장소를 하나 생성한다.
# 설정 파일을 저장할 디렉토리로 이동
# 원격 저장소 연동 방법 1
git init
git remote add origin <Git Repository URL>
git add .
git commit -m "commit message"
git push --set-upstream origin master
# 원격 저장소 연동 방법 2
git clone <Git Repository URL>
git add .
git commit -m "commit message"
git push
spring:
cloud:
config:
server:
git:
# uri: {Local Repository PATH}
uri: https://github.com/mangchhe/WEB_Cloud_Tutorial_Config.git
# username: [username]
# password: [password]
이전에 했던 Local Repository 부분을 주석처리하고 uri 부분에 생성했던 깃허브 주소를 입력한다. username, password 같은 경우에는 공개여부가 public일 경우 설정해줄 필요가 없다.
로컬에 설정 파일을 담은 디렉토리를 하나 생성하고 각종 설정 파일들을 담는다.
spring:
profiles:
active: native
cloud:
config:
server:
native:
# uri: {Local Repository PATH}
# uri: {Remote Repository PATH}
search-locations: file:///<native-repository-url>
현재 로컬 디렉토리에는 다음과 같은 5개의 설정파일들이 존재하고 config service를 구동시켜 설정 파일이 정상 등록이 되었는지 확인해보자
http://localhost:8888/user-service/default
http://localhost:8888/user-service/dev
http://localhost:8888/ecommerce/default
로컬에 있는 각 설정 파일들이 정상적으로 등록되어있는 것을 확인할 수 있다.