Spring Config

조현재·2023년 2월 1일
0

MSA

목록 보기
14/17

Spring Config란

각각의 구성정보파일 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

Config Server 생성

프로젝트 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
  • Spring cloud bus 사용 세가지있다

Actuator refresh

솔직히 서버 재기동을 하기에는 너무 번거로움이 많다 그래서 제외하고 바로 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으로 실행하면
서버 재가동 없이 정보가 바뀌는걸 알 수 있다.

profile
내일이 다른

0개의 댓글