springcloud config 설정 읽 기 우선 순위 과정 상세 설명

상황 묘사
최근 Eureka 의 정적 페이지 에 불 러 올 수 없 는 결함 을 복구 할 때 원 격 GIT 창고 에서 정적 자원 접근 방식 을 사용 하지 않도록 설정 한 것 으로 밝 혀 졌 습 니 다(spring.resources.add-mappings=false).마지막 으로 원 격 GIT 창 고 를 직접 수정 하 는 이 설정 이 해결 되 었 지만(spring.resources.add-mappings=true)관련 설정 읽 기 우선 순 위 를 잘 살 펴 봐 야 합 니 다.
springcloud config 창고 설정 읽 기
config client 모듈 을 통 해 원 격 창고 설정 을 읽 습 니 다.boostrap.properties 파일 에 다음 속성 을 설정 하면 됩 니 다.

spring.application.name=eureka
spring.cloud.config.uri=http://localhost:8888
spring.cloud.config.name=dev
spring.cloud.config.username=dev
spring.cloud.config.password=dev
GET 방식 으로 요청 할 거 예요.http://localhost:8888/eureka/dev주 소 는 설정 을 끌 어 내 립 니 다.
물론 상기 API 주소 도 방문 서버 에 config server 서 비 스 를 배치 해 야 호출 할 수 있 고 구체 적 인 세부 사항 은 전개 되 지 않 습 니 다.
외부 원본 읽 기 우선 순위
spring 의 설정 속성 관 리 는 모두 Envirome 대상 에 저 장 된 것 을 알 고 있 습 니 다.일반 프로젝트 Standard Environment 를 예 로 들 면 설정 의 저장 순 서 는 다음 과 같 습 니 다.
순위
key
근원
설명 하 다.
1
commandLineArgs
main 함수 에 들 어 오 는 매개 변수 목록
Program arguments
2
systemProperties
System.getProperties()
JDK 속성 목록,운영 체제 속성,-D 로 시작 하 는 VM 속성 등
3
systemEnvironment
System.getEnv()
환경 속성,예 를 들 어 JAVAHOME/M2_HOME
4
${file_name}
프로필
예 를 들 어 application.yml
5
defaultProperties
SpringApplicationBuilder#properties()
원 격 으로 읽 을 설정 의 저장 소 는 위 와 같은 위치 에 두 어야 합 니까?
boostrap 컨 텍스트 는 org.spring from work.cloud.boottstrap.config.Property SourceLocator 인 터 페 이 스 를 노출 하여 제3자 의 외부 소스 설정 을 통합 하여 읽 기 편리 하 다 는 것 을 잘 알 고 있 습 니 다.예 를 들 어 본 고 에서 언급 한 config client 모듈 의 org.spring from work.cloud.config.client.Config Service Property SourceLocator 실현 류 입 니 다.
그러나 최종 적 으로 외부 원본 설정 을 읽 고 Environment 대상 에 삽입 하 는 것 은 org.spring from work.cloud.bootstrap.config.Property SourceBootstrap Configuration 류 를 통 해 이 루어 집 니 다.
PropertySourceBootstrapConfiguration
이것 도 Application ContextInitializer 인터페이스의 실현 클래스 입 니 다.cloud 소스 코드 를 읽 어 본 사람 은 모두 알 고 있 습 니 다.이러한 호출 은 하위 클래스 의 컨 텍스트 가 초기 화 될 때 저 희 는 주로 복사 한 initialize()방법 을 봅 니 다.

 @Override
 public void initialize(ConfigurableApplicationContext applicationContext) {
  CompositePropertySource composite = new CompositePropertySource(
    BOOTSTRAP_PROPERTY_SOURCE_NAME);
  //   boostrap      PropertySourceLocator bean      
  AnnotationAwareOrderComparator.sort(this.propertySourceLocators);
  boolean empty = true;
  ConfigurableEnvironment environment = applicationContext.getEnvironment();
  for (PropertySourceLocator locator : this.propertySourceLocators) {
   PropertySource<?> source = null;
   //        
   source = locator.locate(environment);
   if (source == null) {
    continue;
   }
   logger.info("Located property source: " + source);
   composite.addPropertySource(source);
   empty = false;
  }
  if (!empty) {
   MutablePropertySources propertySources = environment.getPropertySources();
   String logConfig = environment.resolvePlaceholders("${logging.config:}");
   LogFile logFile = LogFile.get(environment);
   if (propertySources.contains(BOOTSTRAP_PROPERTY_SOURCE_NAME)) {
    propertySources.remove(BOOTSTRAP_PROPERTY_SOURCE_NAME);
   }
   //    Environment     
   insertPropertySources(propertySources, composite);
   reinitializeLoggingSystem(environment, logConfig, logFile);
   setLogLevels(applicationContext, environment);
   handleIncludedProfiles(environment);
  }
 }
대응 하 는 insert Property Sources()방법 을 직접 관찰 합 니 다.

 private void insertPropertySources(MutablePropertySources propertySources,
   CompositePropertySource composite) {
  //        
  MutablePropertySources incoming = new MutablePropertySources();
  incoming.addFirst(composite);
  PropertySourceBootstrapProperties remoteProperties = new PropertySourceBootstrapProperties();
  //             PropertySourceBootstrapProperties     
  //   spring.cloud.config.overrideSystemProperties   
  Binder.get(environment(incoming)).bind("spring.cloud.config",
    Bindable.ofInstance(remoteProperties));
  // spring.cloud.config.allow-override=false  spring.cloud.config.override-none=false spring.cloud.config.override-system-properties=true
  if (!remoteProperties.isAllowOverride() || (!remoteProperties.isOverrideNone()
    && remoteProperties.isOverrideSystemProperties())) {
   propertySources.addFirst(composite);
   return;
  }
  // spring.cloud.config.override-none=true        
  if (remoteProperties.isOverrideNone()) {
   propertySources.addLast(composite);
   return;
  }
  //   spring.cloud.config.override-system-properties       systemProperties    
  if (propertySources
    .contains(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME)) {
   if (!remoteProperties.isOverrideSystemProperties()) {
    propertySources.addAfter(
      StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
      composite);
   }
   else {
    propertySources.addBefore(
      StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
      composite);
   }
  }
  else {
   propertySources.addLast(composite);
  }
 }
상술 한 코드 설명 에 대해 총 결 을 하 다.
1.상기 설정 속성 은 모두 Property SourceBootstrapProperties 실체 클래스 에 매 핑 되 며,기본 값 은 다음 과 같 습 니 다.
속성
기본 값
설명 하 다.
spring.cloud.config.allow-override
true
외부 원본 설정 을 덮어 쓸 수 있 는 지 여부
spring.cloud.config.override-none
false
외부 원본 설정 이 원본 을 덮어 쓰 지 않 을 지 여부
spring.cloud.config.override-system-properties
true
외부 원본 설정 이 로 컬 속성 을 덮어 쓸 수 있 는 지 여부
2.해당 속성의 값 에 대응 하 는 외부 원본 이 Environment 대상 에서 읽 기 우선 순 위 는 다음 과 같 습 니 다.
속성
읽 기 우선 순위
spring.cloud.config.allow-override=false
가장 높다
spring.cloud.config.override-none=false&&spring.cloud.config.override-system-properties=true
최고(기본)
spring.cloud.config.override-none=true
최저한도
spring 컨 텍스트 시스템 환경 속성 없 음
최저한도
spring 컨 텍스트 에는 system Environment 속성&spring.cloud.config.override-system-properties=false 가 있 습 니 다.
시스템 환경 이후로
spring 컨 텍스트 에는 system Environment 속성&spring.cloud.config.override-system-properties=false 가 있 습 니 다.
시스템 환경 전에
즉,기본적으로 외부 원본 의 설정 속성의 읽 기 우선 순위 가 가장 높 습 니 다.
또한 spring.cloud.config.override-none=true 를 제외 한 다른 경우 외부 원본 의 읽 기 우선 순 위 는 로 컬 프로필 보다 높 습 니 다.
참고:사용자 가 상기 속성 을 복사 하려 면 bootstrap.yml|application.yml 설정 파일 에 두 는 것 은 유효 하지 않 습 니 다.원본 분석 에 따 르 면 Property SourceLocator 인 터 페 이 스 를 사용자 정의 하여 클래스 를 만 들 고 해당 하 는 spring.factories 파일 에 배치 하면 중국 측 에서 유효 합 니 다.
사용자 정의 PropertySourceLocator 인터페이스
위의 설명 에 대해 만약 에 이런 장면 이 있다 고 가정 하면 원 격 창고 의 설정 은 모두 공유 되 고 우 리 는 이 를 수정 할 수 없다.우 리 는 프로젝트 에서 해당 하 는 설정 을 복사 해서 호 환 의 목적 을 달성 할 수 있다.그러면 사용 자 는 사용자 정의 로 인 터 페 이 스 를 만들어 야 합 니 다.
1.Property SourceLocator 인터페이스 구현 클래스 작성

package com.example.configdemo.propertysource;

import org.springframework.cloud.bootstrap.config.PropertySourceLocator;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.PropertySource;

import java.util.HashMap;
import java.util.Map;

/**
 * @author nanco
 * @create 19/9/22
 * @description     PropertySourceLocator                  
 * @see org.springframework.cloud.config.client.ConfigServicePropertySourceLocator
 */
@Order(value = Ordered.HIGHEST_PRECEDENCE + 1)
public class CustomPropertySourceLocator implements PropertySourceLocator {

 private static final String OVERRIDE_ADD_MAPPING = "spring.resources.add-mappings";

 @Override
 public PropertySource<?> locate(Environment environment) {

  Map<String, Object> customMap = new HashMap<>(2);
  //         false,      
  customMap.put(OVERRIDE_ADD_MAPPING, "true");

  return new MapPropertySource("custom", customMap);
 }
}
2.BootstrapConfiguration 작성

package com.example.configdemo.propertysource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author nanco
 * @create 19/9/22
 */
@Configuration
public class CustomBootstrapConfiguration {

 @Bean("customPropertySourceLocator")
 public CustomPropertySourceLocator propertySourceLocator() {
  return new CustomPropertySourceLocator();
 }
}
3.src\main\resources 디 렉 터 리 에 META-INF\spring.factories 파일 만 들 기

# Bootstrap components
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.example.configdemo.propertysource.CustomBootstrapConfiguration
4.main 함 수 를 실행 하면 됩 니 다
작은 매듭
기본적으로 외부 원본 설정 은 가장 높 은 우선 순 위 를 가지 고 있 습 니 다.spring.cloud.config.override-none=false 의 경우 외부 원본 설정 도 로 컬 파일 보다 높 은 우선 순 위 를 가지 고 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기