복붙노트

[SPRING] 공유 라이브러리에서 스프링 클라우드 부트 스트랩 속성을 관리하는 방법은 무엇입니까?

SPRING

공유 라이브러리에서 스프링 클라우드 부트 스트랩 속성을 관리하는 방법은 무엇입니까?

Spring Cloud Config / Eureka 설정을 사용하는 응용 프로그램에 대해 독창적 인 구성을 제공하는 라이브러리를 작성하는 중입니다. 아이디어는 개별 microservice 앱에 스프링 클라우드 관련 보일러 플레이트가 거의 없거나 전혀없는 사용자 정의 스타터로이 구성을 제공하는 것입니다.

이 시점에서이 라이브러리에 넣으려는 공유 구성의 대부분은 bootstrap.yml의 내용으로 구성됩니다. 내 맞춤 스타터에 bootstrap.yml을 제공하고 싶지만 라이브러리를 사용하는 응용 프로그램은 spring.application.name을 적절하게 설정할 수있을지라도 여전히 자신의 bootstrap.yml을 제공 할 수 있어야합니다.

classpath에서 bootstrap.yml이로드되는 방식 때문에, 응용 프로그램에 고유 한 bootstrap.yml이 있으면 Spring은 공유 라이브러리의 내용을 무시한 것 같습니다. 부트 스트랩 컨텍스트가 ApplicationContextInitializers를 다루는 특별한 방법으로 인해 ApplicationContextInitializer를 사용하여 환경을 사용자 정의 할 수도 없습니다.

누구든지 여기서 일할 접근법에 대한 권고 사항이 있습니까? 우리의 모든 프로젝트에서 상용구 bootstrap.yml을 복제 할 필요없이 우리의 독창적 인 부트 스트랩 설정을 작동시키는 드롭 인 (drop-in) lib를 제공하고 싶습니다.

해결법

  1. ==============================

    1.META-INF / spring.factories 파일의 org.springframework.cloud.bootstrap.BootstrapConfiguration 키를 사용하여 공유 라이브러리의 PropertySource를 부트 스트랩 특성에 추가 할 수 있습니다.

    META-INF / spring.factories 파일의 org.springframework.cloud.bootstrap.BootstrapConfiguration 키를 사용하여 공유 라이브러리의 PropertySource를 부트 스트랩 특성에 추가 할 수 있습니다.

    예를 들어, 다음을 포함하는 라이브러리를 작성할 수 있습니다.

    src / main / java / com / example / mylib / MyLibConfig.java

    package com.example.mylib;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    @Configuration
    @PropertySource("classpath:mylib-config.properties")
    public class MyLibConfig {
    }
    

    src / main / resources / mylib-config.properties

    eureka.instance.public=true
    # or whatever...
    

    src / main / resources / META-INF / spring.factories

    org.springframework.cloud.bootstrap.BootstrapConfiguration=com.example.mylib.MyLibConfig
    

    세부 정보 : http://projects.spring.io/spring-cloud/spring-cloud.html#_customizing_the_bootstrap_configuration

  2. ==============================

    2.나는 이것에 대한 해결책을 찾을 수 있었다. 이 솔루션의 목표는 다음과 같습니다.

    나는 이것에 대한 해결책을 찾을 수 있었다. 이 솔루션의 목표는 다음과 같습니다.

    주요 과제는 애플리케이션 라이프 사이클의 적절한 시점에 코드를 삽입하는 것입니다. 특히, 우리는 bootstrap.yml PropertySource가 환경에 추가 된 후에 그것을 수행해야합니다 (사용자 정의 PropertySource를 적절한 순서로 주입 할 수 있도록). 또한 응용 프로그램이 Bean 구성을 시작하기 전에 (구성 값 제어 행동).

    내가 찾은 해결책은 사용자 지정 EnvironmentPostProcessor를 사용하는 것이 었습니다.

    public class CloudyConfigEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
    
        private YamlPropertySourceLoader loader;
    
        public CloudyConfigEnvironmentPostProcessor() {
            loader = new YamlPropertySourceLoader();
        }
    
        @Override
        public void postProcessEnvironment(ConfigurableEnvironment env, SpringApplication application) {
            //ensure that the bootstrap file is only loaded in the bootstrap context
            if (env.getPropertySources().contains("bootstrap")) {
                //Each document in the multi-document yaml must be loaded separately.
                //Start by loading the no-profile configs...
                loadProfile("cloudy-bootstrap", env, null);
                //Then loop through the active profiles and load them.
                for (String profile: env.getActiveProfiles()) {
                    loadProfile("cloudy-bootstrap", env, profile);
                }
            }
        }
    
        private void loadProfile(String prefix, ConfigurableEnvironment env, String profile) {
            try {
                PropertySource<?> propertySource = loader.load(prefix + (profile != null ? "-" + profile: ""), new ClassPathResource(prefix + ".yml"), profile);
                //propertySource will be null if the profile isn't represented in the yml, so skip it if this is the case.
                if (propertySource != null) {
                    //add PropertySource after the "applicationConfigurationProperties" source to allow the default yml to override these.
                    env.getPropertySources().addAfter("applicationConfigurationProperties", propertySource);
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    
        @Override
        public int getOrder() {
            //must go after ConfigFileApplicationListener
            return Ordered.HIGHEST_PRECEDENCE + 11;
        }
    
    }
    

    이 커스텀 EnvironmentPostProcessor는 META-INF / spring.factories를 통해 주입 될 수 있습니다 :

    #Environment PostProcessors
    org.springframework.boot.env.EnvironmentPostProcessor=\
    com.mycompany.cloudy.bootstrap.autoconfig.CloudyConfigEnvironmentPostProcessor
    

    주목해야 할 몇 가지 사항 :

    편집 : 내 초기 대답이 작동하지 않았다. 나는 그것을이 것으로 대체 할 것이다.

  3. from https://stackoverflow.com/questions/37888231/how-to-manage-spring-cloud-bootstrap-properties-in-a-shared-library by cc-by-sa and MIT license