각각의 구성정보파일 application.yml파일 정보가 바뀌면 다시 빌드하고 해야하는데 그걸 개선하기 위해 외부에 있는 시스템을 통해서 구성파일 정보를 관리할 수 있는 기능
git을 통해서
$ ~/Desktop/work/git-local-repo 디렉토리 생성
$ cd init
ecmmerce.yml 파일 생성
$ git add ecommerce.yml
$ git commit -m "upload an application yaml file"
후 code ecommerce.yml 치면 vs가 켜지는데
기존 yml파일에 있던 중복되던 내용을
token:
expiration_time: 86400000
secret: user_token
프로젝트 Spring Cloud Config - Config server만 선택 후 생성
@SpringBootApplication
@EnableConfigServer
public class ConfigServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServiceApplication.class, args);
}
바로 @EnableConfigServer를 써주면서 Config 서버로 구동시켜준다
server:
port: 8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: file://{등록한 y폴더경로}/ecommerce
http://112.1.1.2:8888/ecommerce/default 입력하면
// 20230201234421
// http://112.1.1.2:8888/ecommerce/default
{
"name": "ecommerce",
"profiles": [
"default"
],
"label": null,
"version": "e95f07fb2851a044c0db619517a279b877c69ce9",
"state": null,
"propertySources": [
{
"name": "file://C:/l/ecommerce/ecommerce.yml",
"source": {
"token.expiration_time": 86400000,
"token.secret": "user_token",
"gateway.ip": "112.1.1.2"
}
}
]
}
겹치는 user Service에서 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>
bootstrap.yml
spring:
cloud:
config:
uri: http://112.1.1.2:8888
name: ecommerce #파일명 yml
pom.xml과 application.yml과 동일한 위치의 resources 폴더 아래에 bootstrap.yml 파일을 생성한 후 우리가 실행한 서버의 uri와 접근할 name을 적어준다.
내용을 확인하고자 기존에 있던 usercontroller에 health_check부분을 수정
@GetMapping("/health_check")
public String status(){
return String.format("유저 서비스"
+ ", 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")
);
}
ecommerce 정보들을 가져오는걸 볼 수 있다
여기서 이런 설정들이 변경이 자주 있을텐데 이런 방법을 가져오는데는 3가지 방법이 있는데
*서버 재기동
솔직히 서버 재기동을 하기에는 너무 번거로움이 많다 그래서 제외하고 바로 Actuator refresh부터 해보았다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
AuthenticationManager authenticationManager = getAuthenticationFilter(http);
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/actuator/**").permitAll() //actuator는 모두 허용
.antMatchers("/error/**").permitAll()
// .antMatchers("/**").hasIpAddress("112.1.1.2")
.and()
.authenticationManager(authenticationManager)
.addFilter(getAuthenticationFilter(authenticationManager));
//h2 console error 해결을 위해
http.headers().frameOptions().disable();
return http.build();
application.yml
management:
endpoints:
web:
exposure:
include: refresh, health, beans
#refresh: 현재 마이크로서비스에 있는 config-service에서 가져와야하는 정보를 refresh하겠다
등록후 health나 beans는 web으로 가능하지만 refresh는 안된다
POSTMAN에서 POST http://112.1.1.2:52750/actuator/refresh
를 보내 변경하는 식으로 해야한다.
다시 VS로 돌아가서 yml파일 정보를 바꾼 후
$ git add ecommerce.yml
$ git commit -m "changed values"
로 정보를 바꾼 후
http://112.1.1.2:52750/actuator/refresh postman으로 실행하면
서버 재가동 없이 정보가 바뀌는걸 알 수 있다.