본문 바로가기
해피 코딩/Spring

[MSA] Spring Cloud Config

by happy-coding 2024. 9. 28.
🔥 분산 시스템 환경에서 중앙 집중식 구성 관리를 제공하는 프레임워크인 Spring Cloud Config 공부하기

[ Spring Cloud Config 주요 기능 ]

  • 중앙 집중식 구성 관리: 모든 마이크로서비스의 설정을 중앙에서 관리합니다.
  • 환경별 구성: 개발, 테스트, 운영 등 환경별로 구성을 분리하여 관리할 수 있습니다.
  • 실시간 구성 변경: 설정 변경 시 애플리케이션을 재시작하지 않고도 실시간으로 반영할 수 있습니다.

[ 환경별 설정 파일 관리 ]

  • Config 서버는 환경별로 다른 설정 파일을 제공할 수 있습니다.
  • ex) application-dev.yml, application-prod.yml 파일을 Git 저장소에 저장하여 환경별 설정을 관리합니다.

[ 설정 파일 구성 ]

  • application.yml 파일에서 Config 서버의 설정을 정의합니다.
server:
  port: 8888

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/my-config-repo/config-repo
          clone-on-start: true
  • 중요❗❗
    • 우리는 Git 저장소에서 설정 파일을 읽어오지 않고 local에서 Project를 동작하여 연습

[ Spring Cloud Config 서버 설정 ]

Dependencies

ConfigApplication.java
  • Application에 EnableConfigServer 어노테이션을 추가하여 ConfigServer임을 선언
@EnableConfigServer
@SpringBootApplication
public class ConfigApplication {
    public static void main(String[] args) {
       SpringApplication.run(ConfigApplication.class, args);
    }
}
application.yml
server:
  port: 18080

spring:
  profiles:
    active: native
  application:
    name: config-server
  # yml 파일들을 resources/config-repo에서 관리   
  cloud: 
    config:
      server:
        native:
          search-locations: classpath:/config-repo  # resources/config-repo

eureka:
  client:
    service-url:
      defaultZone: http://localhost:19090/eureka/

테스트를 위해 Product Application으로 전달할 서로 다른 두 개의 yml 생성

product-service-local.yml
  • Config 클라이언트인 ProductApplication에서 Config 서버의 서버 포트와 메시지를 가져와서 사용하면 성공
server:
  port: 19083

message: "product-service-local message update"

[ Spring Cloud Config 클라이언트 설정 ]

Dependencies
  • Config 서버에 등록할 Application에 ConfigClient 의존성 추가

application.yml 수정
  • Config 클라이언트(ProductApplication)에서 Config 서버의 resources/config-repo에 있는 local.yml을 사용하기 위해 yml 수정
spring:
  application:
    name: product-service
  profiles:
    active: local # 활성화할 프로파일을 지정, local 프로파일이 활성화
  config:
    import: "configserver:" # Spring Cloud Config Server를 사용하여 설정을 가져오겠다는 의미
  cloud:
    config:
      discovery:
        enabled: true
        service-id: config-server # Config Server의 서비스 ID 지정

server:
  port: 0
eureka:
  client:
    service-url:
      # 유레카 서버의 주소 설정
      defaultZone: http://localhost:19090/eureka/
      
message: "default message"

[ Run ]

  • Product Application에서 설정한 yml이 아닌, Config에서 설정한 yml을 읽어오면 성공

 

http://localhost:19090에 접속하여 각각의 인스턴스를 확인합니다.
  • PRODUCT-SERVICE의 포트번호가 Config 서버의 yml에서 설정한 19083번으로 나오는걸 확인할 수 있다.

 

Product.Controller
  • 해당 엔트포인트로 접근 시 Config 서버에 설정한 yml의 포트번호와 메시지를 가져오면 성공
@RefreshScope // 설정 파일이 변경되었을 때 애플리케이션을 재시작하지 않고도 새로운 설정을 적용할 수 있게 해준다.
@RestController
public class ProductController {

  @Value("${server.port}") // 애플리케이션이 실행 중인 포트를 주입받습니다.
  private String serverPort;

  @Value("${message}")
  private String message;

  @GetMapping("/product")
  public String getProduct(
  ) {
    return "Product info!!!!! From port : " + serverPort + "and message : " + message ;
  }
}

실행 결과
  • Product의 Application.yml에서 설정해준 서버포트 값인 "0" , 메시지 내용 "default message"가 아닌,
  • Config의 local.yml에서 설정해준 서버포트 값과 메시지 내용을 반환하는 모습을 볼 수 있다.


읽어주셔서 감사합니다😊