diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosPropertySourceRepository.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosPropertySourceRepository.java index ac391bad..56265f45 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosPropertySourceRepository.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosPropertySourceRepository.java @@ -65,9 +65,8 @@ public final class NacosPropertySourceRepository { public static void collectNacosPropertySource( NacosPropertySource nacosPropertySource) { - NACOS_PROPERTY_SOURCE_REPOSITORY - .putIfAbsent(getMapKey(nacosPropertySource.getDataId(), - nacosPropertySource.getGroup()), nacosPropertySource); + NACOS_PROPERTY_SOURCE_REPOSITORY.putIfAbsent(getMapKey(nacosPropertySource.getDataId(), + nacosPropertySource.getGroup()), nacosPropertySource); } public static NacosPropertySource getNacosPropertySource(String dataId, diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmAutoConfiguration.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmAutoConfiguration.java index 3ff2bec4..ac4065b9 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmAutoConfiguration.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmAutoConfiguration.java @@ -21,12 +21,9 @@ import com.alibaba.alicloud.acm.refresh.AcmRefreshHistory; import com.alibaba.alicloud.context.acm.AcmIntegrationProperties; import com.taobao.diamond.client.Diamond; -import org.springframework.beans.BeansException; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.context.refresh.ContextRefresher; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -38,14 +35,7 @@ import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) @ConditionalOnClass({ Diamond.class }) @ConditionalOnProperty(name = "spring.cloud.alicloud.acm.enabled", matchIfMissing = true) -public class AcmAutoConfiguration implements ApplicationContextAware { - - private ApplicationContext applicationContext; - - @Bean - public AcmPropertySourceRepository acmPropertySourceRepository() { - return new AcmPropertySourceRepository(applicationContext); - } +public class AcmAutoConfiguration { @Bean public AcmRefreshHistory acmRefreshHistory() { @@ -56,15 +46,9 @@ public class AcmAutoConfiguration implements ApplicationContextAware { public AcmContextRefresher acmContextRefresher( AcmIntegrationProperties acmIntegrationProperties, ContextRefresher contextRefresher, AcmRefreshHistory refreshHistory, - AcmPropertySourceRepository propertySourceRepository) { + AcmPropertySourceRepository acmPropertySourceRepository) { return new AcmContextRefresher(contextRefresher, acmIntegrationProperties, - refreshHistory, propertySourceRepository); - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) - throws BeansException { - this.applicationContext = applicationContext; + refreshHistory, acmPropertySourceRepository); } } diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmPropertySourceRepository.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmPropertySourceRepository.java index 2ea1d60a..4604ae6c 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmPropertySourceRepository.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmPropertySourceRepository.java @@ -17,54 +17,46 @@ package com.alibaba.alicloud.acm; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import com.alibaba.alicloud.acm.bootstrap.AcmPropertySource; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.PropertySource; /** * @author juven.xuxb, 5/17/16. + * @author yuhuangbin */ public class AcmPropertySourceRepository { - private final ApplicationContext applicationContext; - - public AcmPropertySourceRepository(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; - } + private Map acmPropertySourceMap = new ConcurrentHashMap<>(); /** - * get all acm properties from application context. + * get all acm properties from AcmPropertySourceRepository. * @return list of acm propertysource */ - public List getAll() { + public List allAcmPropertySource() { List result = new ArrayList<>(); - ConfigurableApplicationContext ctx = (ConfigurableApplicationContext) applicationContext; - for (PropertySource p : ctx.getEnvironment().getPropertySources()) { - if (p instanceof AcmPropertySource) { - result.add((AcmPropertySource) p); - } - else if (p instanceof CompositePropertySource) { - collectAcmPropertySources((CompositePropertySource) p, result); - } - } + result.addAll(this.acmPropertySourceMap.values()); return result; } - private void collectAcmPropertySources(CompositePropertySource composite, - List result) { - for (PropertySource p : composite.getPropertySources()) { - if (p instanceof AcmPropertySource) { - result.add((AcmPropertySource) p); + public void collectAcmPropertySource( + Collection> acmPropertySources) { + acmPropertySources.forEach(propertySource -> { + if (propertySource.getClass().isAssignableFrom(AcmPropertySource.class)) { + AcmPropertySource acmPropertySource = (AcmPropertySource) propertySource; + this.acmPropertySourceMap.put(getMapKey(acmPropertySource.getDataId(), + acmPropertySource.getGroup()), acmPropertySource); } - else if (p instanceof CompositePropertySource) { - collectAcmPropertySources((CompositePropertySource) p, result); - } - } + }); + } + + public String getMapKey(String dataId, String group) { + return String.join(",", dataId, group); } } diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmConfigBootStrapConfiguration.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmConfigBootStrapConfiguration.java new file mode 100644 index 00000000..91bb484a --- /dev/null +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmConfigBootStrapConfiguration.java @@ -0,0 +1,49 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.alicloud.acm.bootstrap; + +import com.alibaba.alicloud.acm.AcmPropertySourceRepository; +import com.alibaba.alicloud.context.acm.AcmIntegrationProperties; +import com.taobao.diamond.client.Diamond; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author yuhuangbin + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnClass({ Diamond.class }) +@ConditionalOnProperty(name = "spring.cloud.alicloud.acm.enabled", matchIfMissing = true) +public class AcmConfigBootStrapConfiguration { + + @Bean + public AcmPropertySourceRepository acmPropertySourceRepository() { + return new AcmPropertySourceRepository(); + } + + @Bean + public AcmPropertySourceLocator acmPropertySourceLocator( + AcmPropertySourceRepository acmPropertySourceRepository, + AcmIntegrationProperties acmIntegrationProperties) { + return new AcmPropertySourceLocator(acmIntegrationProperties, + acmPropertySourceRepository); + } + +} diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySource.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySource.java index 7d73ba8c..5fc7020a 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySource.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySource.java @@ -29,14 +29,17 @@ public class AcmPropertySource extends MapPropertySource { private final String dataId; + private final String group; + private final Date timestamp; private final boolean groupLevel; - AcmPropertySource(String dataId, Map source, Date timestamp, - boolean groupLevel) { + AcmPropertySource(String dataId, String group, Map source, + Date timestamp, boolean groupLevel) { super(dataId, source); this.dataId = dataId; + this.group = group; this.timestamp = timestamp; this.groupLevel = groupLevel; } @@ -49,6 +52,10 @@ public class AcmPropertySource extends MapPropertySource { return timestamp; } + public String getGroup() { + return group; + } + public boolean isGroupLevel() { return groupLevel; } diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceBuilder.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceBuilder.java index 17004f83..be5130bb 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceBuilder.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceBuilder.java @@ -52,7 +52,8 @@ class AcmPropertySourceBuilder { if (properties == null) { return null; } - return new AcmPropertySource(dataId, toMap(properties), new Date(), groupLevel); + return new AcmPropertySource(dataId, diamondGroup, toMap(properties), new Date(), + groupLevel); } private Properties loadDiamondData(String dataId, String diamondGroup) { diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceLocator.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceLocator.java index 4f3fe56f..4c983c80 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceLocator.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceLocator.java @@ -16,10 +16,9 @@ package com.alibaba.alicloud.acm.bootstrap; +import com.alibaba.alicloud.acm.AcmPropertySourceRepository; import com.alibaba.alicloud.context.acm.AcmIntegrationProperties; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.bootstrap.config.PropertySourceLocator; import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.Environment; @@ -28,17 +27,24 @@ import org.springframework.core.env.PropertySource; /** * @author juven.xuxb * @author xiaolongzuo + * @author yuhuangbin */ -@ConditionalOnProperty(name = "spring.cloud.alicloud.acm.enabled", matchIfMissing = true) public class AcmPropertySourceLocator implements PropertySourceLocator { private static final String DIAMOND_PROPERTY_SOURCE_NAME = "diamond"; private AcmPropertySourceBuilder acmPropertySourceBuilder = new AcmPropertySourceBuilder(); - @Autowired private AcmIntegrationProperties acmIntegrationProperties; + private AcmPropertySourceRepository acmPropertySourceRepository; + + public AcmPropertySourceLocator(AcmIntegrationProperties acmIntegrationProperties, + AcmPropertySourceRepository acmPropertySourceRepository) { + this.acmIntegrationProperties = acmIntegrationProperties; + this.acmPropertySourceRepository = acmPropertySourceRepository; + } + @Override public PropertySource locate(Environment environment) { @@ -57,7 +63,8 @@ public class AcmPropertySourceLocator implements PropertySourceLocator { loadDiamondDataIfPresent(compositePropertySource, dataId, acmIntegrationProperties.getAcmProperties().getGroup(), false); } - + acmPropertySourceRepository + .collectAcmPropertySource(compositePropertySource.getPropertySources()); return compositePropertySource; } diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpoint.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpoint.java index 6441cc4b..6a84b844 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpoint.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpoint.java @@ -43,7 +43,7 @@ public class AcmEndpoint { private final AcmRefreshHistory refreshHistory; - private final AcmPropertySourceRepository propertySourceRepository; + private final AcmPropertySourceRepository acmPropertySourceRepository; private ThreadLocal dateFormat = new ThreadLocal() { @Override @@ -53,10 +53,10 @@ public class AcmEndpoint { }; public AcmEndpoint(AcmProperties properties, AcmRefreshHistory refreshHistory, - AcmPropertySourceRepository propertySourceRepository) { + AcmPropertySourceRepository acmPropertySourceRepository) { this.properties = properties; this.refreshHistory = refreshHistory; - this.propertySourceRepository = propertySourceRepository; + this.acmPropertySourceRepository = acmPropertySourceRepository; } @ReadOperation @@ -65,7 +65,7 @@ public class AcmEndpoint { result.put("config", properties); Map runtime = new HashMap<>(); - List all = propertySourceRepository.getAll(); + List all = acmPropertySourceRepository.allAcmPropertySource(); List> sources = new ArrayList<>(); for (AcmPropertySource ps : all) { diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointAutoConfiguration.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointAutoConfiguration.java index 2aaf1f8a..a835c045 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointAutoConfiguration.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointAutoConfiguration.java @@ -43,13 +43,11 @@ public class AcmEndpointAutoConfiguration { @Autowired private AcmRefreshHistory acmRefreshHistory; - @Autowired - private AcmPropertySourceRepository acmPropertySourceRepository; - @ConditionalOnMissingBean @ConditionalOnEnabledEndpoint @Bean - public AcmEndpoint acmEndpoint() { + public AcmEndpoint acmEndpoint( + AcmPropertySourceRepository acmPropertySourceRepository) { return new AcmEndpoint(acmProperties, acmRefreshHistory, acmPropertySourceRepository); } diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmHealthIndicator.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmHealthIndicator.java index 703e353a..b2197e27 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmHealthIndicator.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmHealthIndicator.java @@ -36,10 +36,10 @@ public class AcmHealthIndicator extends AbstractHealthIndicator { private final AcmProperties acmProperties; - private final AcmPropertySourceRepository acmPropertySourceRepository; - private final List dataIds; + private final AcmPropertySourceRepository acmPropertySourceRepository; + public AcmHealthIndicator(AcmProperties acmProperties, AcmPropertySourceRepository acmPropertySourceRepository) { this.acmProperties = acmProperties; @@ -47,7 +47,7 @@ public class AcmHealthIndicator extends AbstractHealthIndicator { this.dataIds = new ArrayList<>(); for (AcmPropertySource acmPropertySource : this.acmPropertySourceRepository - .getAll()) { + .allAcmPropertySource()) { this.dataIds.add(acmPropertySource.getDataId()); } } diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/refresh/AcmContextRefresher.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/refresh/AcmContextRefresher.java index 8cef7c47..bd570034 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/refresh/AcmContextRefresher.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/refresh/AcmContextRefresher.java @@ -57,9 +57,9 @@ public class AcmContextRefresher private final AcmRefreshHistory refreshHistory; - private ApplicationContext applicationContext; + private AcmPropertySourceRepository acmPropertySourceRepository; - private final AcmPropertySourceRepository acmPropertySourceRepository; + private ApplicationContext applicationContext; private Map listenerMap = new ConcurrentHashMap<>(16); @@ -82,14 +82,15 @@ public class AcmContextRefresher if (acmIntegrationProperties.getAcmProperties().isRefreshEnabled()) { for (String dataId : acmIntegrationProperties .getApplicationConfigurationDataIds()) { - registerDiamondListener(dataId); + registerDiamondListener(dataId, + acmIntegrationProperties.getAcmProperties().getGroup()); } } } - private void registerDiamondListener(final String dataId) { - - ConfigChangeListener listener = listenerMap.computeIfAbsent(dataId, + private void registerDiamondListener(final String dataId, final String group) { + String key = acmPropertySourceRepository.getMapKey(dataId, group); + ConfigChangeListener listener = listenerMap.computeIfAbsent(key, i -> new ConfigChangeListener() { @Override public void receiveConfigInfo(String configInfo) { @@ -111,8 +112,7 @@ public class AcmContextRefresher "ACM Refresh, dataId=" + dataId)); } }); - ConfigService.addListener(dataId, - acmIntegrationProperties.getAcmProperties().getGroup(), listener); + ConfigService.addListener(dataId, group, listener); } @Override diff --git a/spring-cloud-alicloud-acm/src/main/resources/META-INF/spring.factories b/spring-cloud-alicloud-acm/src/main/resources/META-INF/spring.factories index 0ed3fa01..25af6663 100644 --- a/spring-cloud-alicloud-acm/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alicloud-acm/src/main/resources/META-INF/spring.factories @@ -1,5 +1,5 @@ org.springframework.cloud.bootstrap.BootstrapConfiguration=\ -com.alibaba.alicloud.acm.bootstrap.AcmPropertySourceLocator +com.alibaba.alicloud.acm.bootstrap.AcmConfigBootStrapConfiguration org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.alibaba.alicloud.acm.AcmAutoConfiguration,\ diff --git a/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointTests.java b/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointTests.java index 24ece738..442d2002 100644 --- a/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointTests.java +++ b/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointTests.java @@ -95,9 +95,6 @@ public class AcmEndpointTests { @Autowired private AcmRefreshHistory refreshHistory; - @Autowired - private AcmPropertySourceRepository propertySourceRepository; - @Autowired private AcmPropertySourceRepository acmPropertySourceRepository; @@ -133,7 +130,7 @@ public class AcmEndpointTests { private void checkoutEndpoint() throws Exception { AcmEndpoint acmEndpoint = new AcmEndpoint(properties, refreshHistory, - propertySourceRepository); + acmPropertySourceRepository); Map map = acmEndpoint.invoke(); assertThat(properties).isEqualTo(map.get("config")); assertThat(refreshHistory.getRecords())