Spring

Spring Cloud Config에서 특정 프로필을 선택하면 기본 프로필 값이 반환되지 않습니다.

기록만이살길 2021. 3. 12. 07:06
반응형

Spring Cloud Config에서 특정 프로필을 선택하면 기본 프로필 값이 반환되지 않습니다.

1. 질문(문제점):

로컬 application.yml구성 파일에서 구성 서버 관리 구성으로 이동 중입니다.

내 application.yml 파일에는 동일한 파일에 다음 형식으로 2 개 이상의 프로필이 포함되어 있습니다.

spring.application.name: config-client
app.myvar1: "Var 1 in default profile"
app.myvar2: "Var 2 in default profile"
---
spring.config.activate.on-profile: docker
app.myvar1: "Var 1 in docker profile"

NOT config-server 환경에서이 구성 파일을 테스트 할 때 특정 프로필에서 결과를 읽었으며 찾을 수없는 경우 기본값에서 읽습니다. 견본

config-server없이 테스트 할 때 올바른 결과

Profile: docker
MyVar1=Var 1 in docker profile
MyVar2=Var 2 in default profile

테스트를 위해 간단한 프로그램을 사용하고 있습니다.

package com.bthinking.configclient;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class ConfigClientApplication {

    @Autowired
    private Environment environment;

    @Value("${app.myvar1:MyVar1 not found}")
    String myVar1;
    @Value("${app.myvar2:MyVar2 not found}")
    String myVar2;

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

    @RequestMapping("/")
    public String index() {
        StringBuffer b = new StringBuffer();
        for (String profile : environment.getActiveProfiles()) {
            b.append(String.format("Profile: %s</br>", profile));
        }
        b.append(String.format("MyVar1=%s</br>", myVar1));
        b.append(String.format("MyVar2=%s</br>", myVar2));
        return b.toString();
    }
}

그리고 (나는 gradle을 사용합니다)로 프로그램을 시작합니다.

gradle :config-client:bootRun --args='--spring.profiles.active=docker'

그러나 구성 서버로 마이그레이션하여 파일을 구성 저장소로 이동하면 (파일 기반 저장소를 사용하고 있습니다) 잘못된 결과를 얻습니다 (기본 섹션에서 변수를 읽을 수 없음). 나는 또한 --spring.profiles.active = docker, default를 변경하지 않고 시도했습니다.

Profile: docker
MyVar1=Var 1 in docker profile
MyVar2=MyVar2 not found

참고로 내 config-server에는 다음 구성이 있습니다.

server.port: 8888

spring.application.name: config-server

spring.cloud.config.server.native.searchLocations: file:${PWD}/config-repo
# spring.cloud.config.server.native.searchLocations: file:/Users/jmalbarran/Projects/BTH/BTH/SPB_SpringBoot/bugs/config/config-repo

logging.level:
  root: debug
---
spring.config.activate.on-profile: docker
spring.cloud.config.server.native.searchLocations: file:/config-repo

메인 클래스

package com.bthinking.configserver;

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

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

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

}

그리고 build.gradle

plugins {
    id 'org.springframework.boot' version '2.4.1'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'com.b-thinking'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
    maven { url 'https://repo.spring.io/milestone' }
}

ext {
    set('springCloudVersion', "2020.0.0")
}

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-config-server'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

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

test {
    useJUnitPlatform()
}

다음으로 시작합니다.

gradle :config-server:bootRun --args='--spring.profiles.active=native'

참고 : 이것이 버그라고 생각하므로 github에서도 문제가 발생했습니다. 체크인 문제

2. 해결방안:

@spencergibb (감사합니다!) 댓글 후에 버전 3.0.1로 시도해 보았고 문제가 해결되었습니다.

이것은 이제 내 build.gradle입니다.

plugins {
    id 'org.springframework.boot' version '2.4.1'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'com.b-thinking'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
    maven { url 'https://repo.spring.io/milestone' }
}

ext {
    set('springCloudVersion', "2020.0.0")
}

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-config-server:3.0.1'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

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

test {
    useJUnitPlatform()
}

3.0.1 버전이 반대 버그를 해결한다고보고 되었기 때문에 놀랍습니다 (기본 구성이 특정 문제를 재정의 함).하지만 검토를 통해 둘 다 해결되었다고 생각합니다.

참고로 이것은 관련 문제였습니다.

Issue # 1777 프로필이 SpringBoot 2.4.1 + Ilford 2020.0.0에서 올바르지 않음 (2.4.1 + Ilford 2020.0.0-RC1에서 작동)

구성 서버의 Issue @ 1778 다중 문서 파일이 동일한 속성 이름을 가짐

65708253
반응형