복붙노트

[SPRING] Spring 부트가없는 Spring Cloud 구성 클라이언트

SPRING

Spring 부트가없는 Spring Cloud 구성 클라이언트

우리는 Amazon Elastic Beanstalk에 WAR 파일로 배포 된 기존 스프링 웹 응용 프로그램을 보유하고 있습니다. 현재 우리는 속성 파일을 http 리소스로로드하여 속성 자리 표시 자 구성 확인의 단일 소스를 제공합니다. 우리가 git 버전 관리 등의 이점을 제공하기 위해 새로운 스프링 클라우드 구성 서버로 교체하는 방법을 조사 중입니다.

그러나 문서 (http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html)는 스프링 부트 클라이언트 애플리케이션을 설명하는 것으로 보인다. 기존 웹 애플리케이션에서 Spring Cloud Config Client를 설정할 수 있습니까? 부트 스트랩 상위 응용 프로그램 컨텍스트 등을 수동으로 설정해야합니까? 예가 있습니까? 현재의 스프링 구성은 XML 기반입니다.

해결법

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

    1.Spring Boot로 "그냥 작동한다"는 것은 실제로는 몇 가지 설정 이상입니다. 하루가 끝나면 봄 애플리케이션 일뿐입니다. 그래서 저는 Boot가 자동으로 당신을 위해 모든 것을 수동으로 설정할 수 있다고 믿습니다. 그러나 저는이 특별한 각도를 실제로 시도하는 사람을 알지 못합니다. 부트 스트랩 응용 프로그램 컨텍스트를 만드는 것이 바람직한 방법이지만, 사용법에 따라 속성 소스 위치 지정자가 충분히 일찍 실행되는지 확인하는 경우 단일 컨텍스트로 작업 할 수도 있습니다.

    Spring Boot로 "그냥 작동한다"는 것은 실제로는 몇 가지 설정 이상입니다. 하루가 끝나면 봄 애플리케이션 일뿐입니다. 그래서 저는 Boot가 자동으로 당신을 위해 모든 것을 수동으로 설정할 수 있다고 믿습니다. 그러나 저는이 특별한 각도를 실제로 시도하는 사람을 알지 못합니다. 부트 스트랩 응용 프로그램 컨텍스트를 만드는 것이 바람직한 방법이지만, 사용법에 따라 속성 소스 위치 지정자가 충분히 일찍 실행되는지 확인하는 경우 단일 컨텍스트로 작업 할 수도 있습니다.

    비 스프링 (또는 비 스프링 부트) 앱은 설정 서버에서 일반 텍스트 또는 바이너리 파일에 액세스 할 수 있습니다. 예 : Spring에서는 http : // configserver / {app} / {profile} / {label} /application.properties 또는 http : // configserver / {app}와 같은 URL 인 자원 위치로 @PropertySource를 사용할 수 있습니다. {프로필} .properties. 이 모든 것은 사용자 가이드에 포함되어 있습니다.

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

    2.비슷한 요구 사항이 있습니다. 일부 XML bean을 정의하기 위해 Spring XML 설정을 사용하는 웹 애플리케이션이있다. 프로퍼티의 값은 .property 파일에 저장된다. 요구 사항은 개발 중에 하드 디스크에서 구성을로드하고 프로덕션 환경의 Spring Cloud 구성 서버에서 구성을로드해야한다는 것입니다.

    비슷한 요구 사항이 있습니다. 일부 XML bean을 정의하기 위해 Spring XML 설정을 사용하는 웹 애플리케이션이있다. 프로퍼티의 값은 .property 파일에 저장된다. 요구 사항은 개발 중에 하드 디스크에서 구성을로드하고 프로덕션 환경의 Spring Cloud 구성 서버에서 구성을로드해야한다는 것입니다.

    내 생각은 PropertyPlaceholderConfigurer에 대해 두 가지 정의를하는 것이다. 첫 번째 설정은 하드 디스크에서 구성을로드하는 데 사용됩니다.

            <bean id="resources" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" doc:name="Bean">
            <property name="locations">
                <list>
                    <value>dcm.properties</value>
                    <value>post_process.properties</value>
                </list>
            </property>
        </bean>
    

    두 번째 것은 스프링 설정 서버에서 .properties를로드 할 것입니다 :

        <bean id="resources" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" doc:name="Bean">
            <property name="locations">
                <list>
                    <value>http://localhost:8888/trunk/dcm-qa.properties</value>
                </list>
            </property>
        </bean>
    
  3. ==============================

    3.Refrenced : https://wenku.baidu.com/view/493cf9eba300a6c30d229f49.html

    Refrenced : https://wenku.baidu.com/view/493cf9eba300a6c30d229f49.html

    루트 WebApplicationContext와 Servlet WebApplicationContext는 환경을 사용하고 스프링 프로파일을 기반으로 PropertySources를 초기화합니다. 비 스프링 부팅 응용 프로그램의 경우 구성 서버에서 등록 정보를 가져오고 등록 정보가 변경 될 때마다 Bean을 새로 고치려면이를 사용자 정의해야합니다. 아래는 SpringMVC에서 설정이 작동하도록 변경된 사항입니다. 또한 spring.profile.active에 대한 시스템 속성이 필요합니다.

    RefreshAppplicationContext.java

    @Component
    public class RefreshAppplicationContext implements ApplicationContextAware {
    
        private ApplicationContext applicationContext;
        public void setApplicationContext(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
    
        public void refreshctx(){
            ((XmlWebApplicationContext)(applicationContext)).refresh();
        }
    }
    
  4. ==============================

    4.데이브 시어 (Dave Syer)의 탁월한 대답에 대해 논할 충분한 점수가 없기 때문에 답변으로 게시하십시오. 우리는 프로덕션에서 제안 된 솔루션을 구현했으며 예상대로 작동하고 있습니다. 우리의 새로운 애플 리케이션은 부트를 사용하여 작성되지만, 레거시 애플 리케이션은 스프링을 사용하지만 부팅은 사용하지 않습니다. 우리는 Spring Cloud Config를 사용하여 속성을 모두 제공하는 속성 서비스를 만들 수있었습니다. 변화는 미미했습니다. 레거시 속성 파일을 war 파일에서 Property Service git 저장소로 옮기고 Dave가 클래스 패스에 대해했던 것처럼 시스템 환경 변수를 삽입하고 Dave가 URL에 대한 클래스 경로 참조에서 속성 정의를 변경했습니다. 그것은 쉽고 효과적이었습니다.

    데이브 시어 (Dave Syer)의 탁월한 대답에 대해 논할 충분한 점수가 없기 때문에 답변으로 게시하십시오. 우리는 프로덕션에서 제안 된 솔루션을 구현했으며 예상대로 작동하고 있습니다. 우리의 새로운 애플 리케이션은 부트를 사용하여 작성되지만, 레거시 애플 리케이션은 스프링을 사용하지만 부팅은 사용하지 않습니다. 우리는 Spring Cloud Config를 사용하여 속성을 모두 제공하는 속성 서비스를 만들 수있었습니다. 변화는 미미했습니다. 레거시 속성 파일을 war 파일에서 Property Service git 저장소로 옮기고 Dave가 클래스 패스에 대해했던 것처럼 시스템 환경 변수를 삽입하고 Dave가 URL에 대한 클래스 경로 참조에서 속성 정의를 변경했습니다. 그것은 쉽고 효과적이었습니다.

    <util:properties id="envProperties" location="https://properties.me.com/property-service/services-#{envName}.properties" />
    <context:property-placeholder properties-ref="envProperties" ignore-resource-not-found="true" ignore-unresolvable="true" order="0" />
    <util:properties id="defaultProperties" location="https://properties.me.com/property-service/services-default.properties" />
    <context:property-placeholder properties-ref="defaultProperties" ignore-resource-not-found="true" ignore-unresolvable="true" order="10" />
    
  5. ==============================

    5.스프링 부트없이 스프링 클라우드 - 사육사를 사용하는 솔루션을 찾았습니다. 여기 제공된 아이디어를 기반으로합니다. https://wenku.baidu.com/view/493cf9eba300a6c30d229f49.html

    스프링 부트없이 스프링 클라우드 - 사육사를 사용하는 솔루션을 찾았습니다. 여기 제공된 아이디어를 기반으로합니다. https://wenku.baidu.com/view/493cf9eba300a6c30d229f49.html

    Spring Cloud Config 서버를 사용하여 필요에 맞게 쉽게 업데이트해야합니다 (Zookeeper 대신 서버에서 파일을로드하기 위해 CloudEnvironement 클래스를 업데이트해야 함)

    먼저 PropertySource (Zookeeper의 ex)를 생성하는 CloudEnvironement 클래스를 만듭니다.

    CloudEnvironement.java

      public class CloudEnvironment extends StandardServletEnvironment { 
    
      @Override 
      protected void customizePropertySources(MutablePropertySources propertySources) { 
        super.customizePropertySources(propertySources); 
        try { 
          propertySources.addLast(initConfigServicePropertySourceLocator(this)); 
        } 
        catch (Exception ex) { 
          logger.warn("failed to initialize cloud config environment", ex); 
        } 
      } 
    
      private PropertySource<?> initConfigServicePropertySourceLocator(Environment environment) { 
        ZookeeperConfigProperties configProp = new ZookeeperConfigProperties(); 
        ZookeeperProperties props = new ZookeeperProperties(); 
        props.setConnectString("myzookeeper:2181"); 
        CuratorFramework fwk = curatorFramework(exponentialBackoffRetry(props), props); 
        ZookeeperPropertySourceLocator propertySourceLocator = new ZookeeperPropertySourceLocator(fwk, configProp); 
        PropertySource<?> source= propertySourceLocator.locate(environment); 
        return source ; 
      } 
    
      private CuratorFramework curatorFramework(RetryPolicy retryPolicy, ZookeeperProperties properties) { 
        CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); 
        builder.connectString(properties.getConnectString()); 
        CuratorFramework curator = builder.retryPolicy(retryPolicy).build(); 
        curator.start(); 
        try { 
          curator.blockUntilConnected(properties.getBlockUntilConnectedWait(), properties.getBlockUntilConnectedUnit()); 
        } 
        catch (InterruptedException e) { 
          throw new RuntimeException(e); 
        } 
        return curator; 
      } 
    
      private RetryPolicy exponentialBackoffRetry(ZookeeperProperties properties) { 
        return new ExponentialBackoffRetry(properties.getBaseSleepTimeMs(), 
            properties.getMaxRetries(), 
            properties.getMaxSleepMs()); 
      } 
    
    }
    

    그런 다음 사용자 정의 XmlWebApplicationContext 클래스를 만듭니다. 웹 응용 프로그램을 시작하고 Spring Boot의 부트 스트랩 매직을 대체 할 때 Zookeeper에서 PropertySource를로드 할 수 있습니다.

    MyConfigurableWebApplicationContext.java

    public class MyConfigurableWebApplicationContext extends XmlWebApplicationContext { 
    
      @Override 
      protected ConfigurableEnvironment createEnvironment() { 
        return new CloudEnvironment(); 
      } 
    }
    

    마지막으로 web.xml 파일에서 MyConfigurableWebApplicationContext 클래스를 사용하고 CloudEnvironment를 부트 스트랩하기 위해 다음과 같은 컨텍스트 매개 변수를 추가합니다.

    <context-param>           
          <param-name>contextClass</param-name> 
          <param-value>com.kiabi.config.MyConfigurableWebApplicationContext</param-value> 
        </context-param> 
    

    표준 속성 파일 구성자를 사용하는 경우 로컬 파일과 사육자 모두에서 속성을 가질 수 있도록로드해야합니다.

    이 모든 작업을하기 위해서는 class-path에 spring-cloud-starter-zookeeper-config와 curator-framework jar가 있어야하며, maven을 사용한다면 pom.xml에 다음을 추가하면된다.

    <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-zookeeper-dependencies</artifactId>
                    <version>1.1.1.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-zookeeper-config</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-framework</artifactId>
            </dependency>
        </dependencies>
    
  6. from https://stackoverflow.com/questions/28367425/spring-cloud-config-client-without-spring-boot by cc-by-sa and MIT license