본문 바로가기
spring cloud

Spring Cloud Config

by 킹차니 2022. 3. 5.

스프링 프로젝트의 구성에 필요한 정보는 주로 application.yml(혹은 application.properties)파일에서 관리된다. 그런데 해당 설정 정보 파일을 스프링 프로젝트 내부가 아닌 외부에 분리할 수 있다.

-> 1. 하나의 중앙화된 저장소에서 구성요소 관리 가능

-> 2. 각 서비스를 다시 빌드하지 않고, 바로 적용 가능

-> 3. 애플리케이션 배포 파이프라인을 통해 DEV(개발)-UAT(테스트)-PROD(프로덕션) 환경에 맞는 구성 정보 사용

 

 

이와 같은 Spring Cloud Config Server를 만들어 보자.

 

먼저 해당 Config Server 프로젝트를 만들기 전에 원하는 폴더에 다른 micro service들에서 참조할 yml을 만들어 줘야 한다.

본인 git-local-repo라는 폴더 아래에 ecommerce.yml 파일을 만들고 깃허브 리퍼지토리 원격 저장소에 추가하였다.

token:
  expiration_time: 86400000
  secret: user_token
gateway:
  ip: 192.168.0.8

 

Config Server 만들기

이제 Config Server를 만들어 보자.

 

해당 스프링 프로젝트는 아래의 의존성 하나만을 추가해주면 된다.

그리고 main함수에 @EnableConfigServer를 붙여준다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServiceApplication.class, args);
    }
}

 

그리고 application.yml파일은 아래와 같다.

server:
  port: 8888

spring:
  application:
    name: config-service
  cloud:
    config:
      server:
        git:
          uri: https://github.com/kingchan223/spring-config-study.git

특히 " spring.cloud.config.server.git.uri: " 부분을 보면 위에서 만든 깃허브 리포지토리의 주소를 적어줬다.

 

그리고 이제 해당 프로젝트를 실행하고 localhost:8888/ecommerce/defalut 로 접속해보자.

그러면 아래와 같이 우리가 작성한 ecommerce.yml의 내용이 나온다.

현재 우리는 위의 yml이 test용인지, 개발용인지를 명시하지 않았기에 "/ecommerce/test"로 접속해도 위와 같이 나온다.

 

 

 

Config Client

이제 config client를 만들어 보자. config client는 user-service, order-service 등과 같은 마이크로 서비스들의 Config Server의 Client가 된다. 이를 위해 아래의 의존성들을 추가해주어야 한다. (본인은 이전 포스트에서 만든 user-service가 config client가 되도록 할 것이다.)

그리고 yml에 다음과 같이 빨간 네모 부분을 추가해준다.

현재 구동중인 config server의 주소와 사용할 yml파일의 이름이 필요하다. 현재 git-repo-repository에 ecommerce.yml 파일을 참고할 것 이므로 spring.cloud.config.name에 ecommerce를 명시해주었다. 

 

만약 ecommerce의 내용을 수정하면 변경사항을 원격 저장소에 commit, push한 뒤, user-service를 재구동 시키면 된다.

하지만 config 정보가 변경될 때마다 서버를 재구동하는 방법은 좋은 방법은 아니다. 하여 Spring Actuator를 사용해보자.

 


Spring Boot Actuator

- Appication 상태, 모니터링

- Metric 수집을 위한 Http End Point 제공

 

먼저 이를 사용하기 위해서는 actuator 의존성을 user-service에 추가해준다.

그리고 현재 user-service에 security가 적용되어 있으므로 acuator를 사용하기 위한 /actuator 이하의 경로에 대해선 시큐리티 적용을 하지 않도록 한다.

 

그리고 브라우저로 actuator에 대한 여러가지 기능을 사용하기 위해 아래와 같이 end 포인트를 추가해준다.

server:
  port: 0

spring:
  application:
    name: user-service
# 요 아래부터
  config:
    import: "optional:configserver:http://localhost:8888"
  cloud:
    config:
      name: ecommerce #원격의 yml파일명
      profile: default
# 요기까지 spring-cloud-config 외부에서 불러오기
  datasource:
    url: jdbc:h2:tcp://localhost/~/datajpa
    username: king
    password:
    driver-class-name: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        show_sql: true
        format_sql: true

eureka:
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka
greeting:
  message: Welcome to the Simple E-Commerce.

logging:
  level:
    com.example.usermicroservice: DEBUG

# !!!(추가 부분) actuator에서 사용할 수 있는 end포인트
management:
  endpoints:
    web:
      exposure:
        include: refresh, health, beans

 

이제 해당 프로젝트를 구동시켜 보자

 

해당 프로젝트가 구동된 포트로 /actuator/health로 들어가면 아래와 같이 "status"는 "UP"상태로 나온다.

 

그리고 현재 user-service에서 만들어 놓은 컨트롤러의  /health_check로 들어가보면 현재 구동중인 port번호, ecommerce.yml에 지정한 값들이 나온다.

이제 ecommerce.yml을 수정한 뒤 commit, push 해보자.

token secret : user_token_ecommerce -> user_token_ecommerce_change로 변경

token expiration_time : 86400000 -> 86499999 로 변경

(수정 후 반드시 commit, push 해주자!)

 

그리고 이제 /actuator/refresh를 post로 요청 보내면 새로고침이 되면서 어떤 값들이 변경되었는지 나온다.

( 반그시 refresh를 해주어야 변경된 값을 가져온다.)

이제 다시 /health_check 요청을 해보자.

값이 잘 변경된 것을 확인할 수 있다.

 

 

이제 apigateway-service에도 위와 같이 actuator를 추가해보자.

apigateway-service는 메이븐 프로젝트이기 때문에 아래와 같은 의존성들을 추가해주어야 한다.

 

그리고 yml파일에는 아래와 같이 빨간 박스 부분, 파란 박스 부분을 추가해준다.

그리고 위의 파란박스 부분에서 보이듯이 actuator 관리 중 httptrace 기능을 사용할 것이기 때문에 HttpTraceRepository Bean을 추가해주어야 한다.


 

이번에는 Config 서버에 여러가지 yml 파일을 만들어두고 사용하는 방법을 알아보자.

예로 ecommerce-dev.yml, ecommerce-uat.yml, ecommerce-prod.yml 처럼 3개의 파일을 만들고, user service는 ecommerce-dev.yml을 사용하고, apigateway는 ecommerce-uat.yml를 사용할 수 있게 하는 것이다.

 

일단 git-local-repo에 ecommerce-dev.yml 과 ecommerce-prod.yml 파일을 추가하고 다르게 해야할 부분만 바꿔준다.

 

그리고 apigateway-service는 ecommerce-prod.yml 파일을 사용하기 위해 아래와 같이 profile 정보를 추가해준다.

 

같은 방법으로 user-service는 dev를 사용한다.

이렇게만 해주면 각 서비스들이 다른 yml을 참고할 수 있다.

 

 

 

출처 : 인프런 Lee Dowon님의 강의와 PDF 자료
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4