Cloud

Config Server

Jungsoomin :) 2020. 12. 14. 18:11

Spring Cloud Config 는 분산 시스템 환경에서 환경설정을 외부로 분리시켜 관리하는 기능을 제공함.

 

Config Server 를 사용하게 되면 개발, 테스트, 프로덕션 등에 대한 App 의 속성을 한 장소에서 관리하게 됨.

 

하나의 Config 서버 에서  Git 과 연동하여 설정파일을 관리하고 있음


장점

  • 설정 관리가 분산되지 않는다.
  • 추가 설정으로 운영 중 서버를 빌드하거나 배포하지 않고 환경설정 변경가능함.

기능

Spring Cloud Config Server => 설정파일 배달

  • properties , yml 파일 을 위한 HTTP Resource 기반 API
  • 속성 값 암호화와 복호화
  • @EnableConfigServer 로 Boot App 에 적용가능

Config Client => 설정파일 사용

  • Config Server 에 묶여 원격 속성 소스로 Spring 환경 초기화
  • 속성 값 암호화, 복호화

구성 

  • 필요의존 : org.springframework.cloud:spring-cloud-config-server
plugins {
    id 'org.springframework.boot' version '2.3.7.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'com.study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "Hoxton.SR9")
}

dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.cloud:spring-cloud-config-server'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

test {
    useJUnitPlatform()
}
  • application.yml 
  • 기본 브랜치 이름은 master 로 잡혀있으니 리포지토리 생성시 Root Branch 이름은 반드시 master 로 잡아야 검색된다.
 spring:
   application:
     name: {configServiceId}
   cloud:
     config:
       server:
     git:
       uri: {remote.property.source.uri} # git repository 주소
       username: {username}
       password: {password}
 server:
   port: 8888

 # Eureka(service discovery)를 사용할 경우 아래 설정 추가
 eureka:
   client:
     serviceUrl:
       defaultZone: {eurekaServerUrl}
     enabled: true
  • @EnableConfigServer 추가
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

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

}

호출 양식은 /ServiceID/profile 로 호출되며  json 형태를 가진다.

 


Spring Cloud Config Client

  • 필요의존 : org.springframework.cloud:spring-cloud-starter-actuator / o.s.c:spring-clould-starter-config
plugins {
    id 'org.springframework.boot' version '2.3.7.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'com.study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "Hoxton.SR9")
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.cloud:spring-cloud-starter-config'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

test {
    useJUnitPlatform()
}
  • actuator 는 /refresh 엔드포인트를 위해 사용된다.
  • Spring Cloud Config Client 의 환경설정 파일원격 설정 저장소(GitHub) 으로 이동시킨다.

Client 의 application.yml 은 삭제, bootstrap.yml 파일을 생성하여 기본 값들을 기록한다.

 

 

application.yml => 유심히 보자.

spring:
  application:
    name: config-client
  cloud:
    config:
      discovery:
        enabled: true
        service-id: CONFIG-SERVER
#  profiles:
#    active: test 해당 프로파일을 엑티브 시키면 Git Repository 에 있는 config-client-test.yml이 실행

server:
  port: 8771

eureka:
  client:
    service-url:
      defaultZone: ${EUREKA_SERVER_LIST:http://localhost:8761/eureka/}

# /refresh 엔드포인트 설정
management:
  endpoint:
    env:
      enabled: true
    web:
  endpoints:
    web:
      exposure:
        include: "refresh"

설정 파일을 사용하는 모든 메서드에 @RefreshScope 를 추가한다.

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConfigClientApplication {

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

    @RefreshScope
    @GetMapping("/default")
    public String defaultTest(@Value("${soomin.name}") String name,@Value("${soomin.said}")String said){
        return name + ", said : "+said;
    }
}

 

읽어 들였다면 해당 요청을 보내 확인한다.

수정할 점이 생겼다면 다시 Git Repository 에 Push 하고, Config Client/refresh 엔드포인트를 POST 로 호출한다.

 

로그 찍히는 기록으로 보아, /refresh 란 외부 설정 저장소에 내용을 다시 끌어오는 것으로 보인다.


 

이후 서버 중단 없이 다시 확인해보면 설정사항 변경이 먹힌것을 볼 수 있다.

'Cloud' 카테고리의 다른 글

Spring Cloud Bus  (0) 2020.12.15
Sleuth & ZipKin  (0) 2020.12.14
Hystrix  (0) 2020.12.08
Feign  (0) 2020.12.08
Ribbon  (0) 2020.12.08