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 의 경우 외부 원본 설정 도 로 컬 파일 보다 높 은 우선 순 위 를 가지 고 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.