From bc43637872d0e94d4c2eae832e83b78867a8c280 Mon Sep 17 00:00:00 2001 From: xiaolongzuo <150349407@qq.com> Date: Tue, 30 Oct 2018 15:59:38 +0800 Subject: [PATCH 1/2] Extract acm configuration to bootstrap phase. # Conflicts: # spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/refresh/AcmContextRefresher.java --- .../alicloud/acm/AcmAutoConfiguration.java | 60 +++++++------- .../acm/refresh/AcmContextRefresher.java | 83 +++++++++---------- .../context/acm/AcmIntegrationProperties.java | 7 ++ 3 files changed, 76 insertions(+), 74 deletions(-) diff --git a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/AcmAutoConfiguration.java b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/AcmAutoConfiguration.java index 5930568a9..36da2e858 100644 --- a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/AcmAutoConfiguration.java +++ b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/AcmAutoConfiguration.java @@ -16,13 +16,12 @@ package org.springframework.cloud.alicloud.acm; -import com.taobao.diamond.client.Diamond; import org.springframework.beans.BeansException; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.alicloud.acm.endpoint.AcmHealthIndicator; import org.springframework.cloud.alicloud.acm.refresh.AcmContextRefresher; import org.springframework.cloud.alicloud.acm.refresh.AcmRefreshHistory; +import org.springframework.cloud.alicloud.context.acm.AcmIntegrationProperties; import org.springframework.cloud.alicloud.context.acm.AcmProperties; import org.springframework.cloud.context.refresh.ContextRefresher; import org.springframework.context.ApplicationContext; @@ -30,44 +29,47 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import com.taobao.diamond.client.Diamond; + /** * Created on 01/10/2017. * * @author juven.xuxb */ @Configuration -@ConditionalOnClass({Diamond.class}) -@EnableConfigurationProperties(AcmProperties.class) +@ConditionalOnClass({ Diamond.class }) public class AcmAutoConfiguration implements ApplicationContextAware { - private ApplicationContext applicationContext; + private ApplicationContext applicationContext; - @Bean - public AcmPropertySourceRepository acmPropertySourceRepository() { - return new AcmPropertySourceRepository(applicationContext); - } + @Bean + public AcmPropertySourceRepository acmPropertySourceRepository() { + return new AcmPropertySourceRepository(applicationContext); + } - @Bean - public AcmHealthIndicator acmHealthIndicator(AcmProperties acmProperties, - AcmPropertySourceRepository acmPropertySourceRepository) { - return new AcmHealthIndicator(acmProperties, acmPropertySourceRepository); - } + @Bean + public AcmHealthIndicator acmHealthIndicator(AcmProperties acmProperties, + AcmPropertySourceRepository acmPropertySourceRepository) { + return new AcmHealthIndicator(acmProperties, acmPropertySourceRepository); + } - @Bean - public AcmRefreshHistory acmRefreshHistory() { - return new AcmRefreshHistory(); - } + @Bean + public AcmRefreshHistory acmRefreshHistory() { + return new AcmRefreshHistory(); + } - @Bean - public AcmContextRefresher acmContextRefresher(AcmProperties acmProperties, ContextRefresher contextRefresher, - AcmRefreshHistory refreshHistory, - AcmPropertySourceRepository propertySourceRepository) { - return new AcmContextRefresher(contextRefresher, acmProperties, refreshHistory, propertySourceRepository); - } + @Bean + public AcmContextRefresher acmContextRefresher( + AcmIntegrationProperties acmIntegrationProperties, + ContextRefresher contextRefresher, AcmRefreshHistory refreshHistory, + AcmPropertySourceRepository propertySourceRepository) { + return new AcmContextRefresher(contextRefresher, acmIntegrationProperties, + refreshHistory, propertySourceRepository); + } - @Override - public void setApplicationContext(ApplicationContext applicationContext) - throws BeansException { - this.applicationContext = applicationContext; - } + @Override + public void setApplicationContext(ApplicationContext applicationContext) + throws BeansException { + this.applicationContext = applicationContext; + } } diff --git a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/refresh/AcmContextRefresher.java b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/refresh/AcmContextRefresher.java index 1fa9e4637..a6115912e 100644 --- a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/refresh/AcmContextRefresher.java +++ b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/refresh/AcmContextRefresher.java @@ -16,26 +16,25 @@ package org.springframework.cloud.alicloud.acm.refresh; -import com.alibaba.edas.acm.ConfigService; -import com.alibaba.edas.acm.listener.ConfigChangeListener; +import java.io.UnsupportedEncodingException; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.cloud.alicloud.acm.AcmPropertySourceRepository; import org.springframework.cloud.alicloud.acm.bootstrap.AcmPropertySource; -import org.springframework.cloud.alicloud.context.acm.AcmProperties; +import org.springframework.cloud.alicloud.context.acm.AcmIntegrationProperties; import org.springframework.cloud.context.refresh.ContextRefresher; import org.springframework.context.ApplicationListener; -import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; -import java.io.UnsupportedEncodingException; -import java.math.BigInteger; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import com.alibaba.edas.acm.ConfigService; +import com.alibaba.edas.acm.listener.ConfigChangeListener; /** * On application start up, AcmContextRefresher add diamond listeners to all application @@ -50,7 +49,7 @@ public class AcmContextRefresher implements ApplicationListener listenerMap = new ConcurrentHashMap<>(16); - @Autowired - private Environment environment; - public AcmContextRefresher(ContextRefresher contextRefresher, - AcmProperties properties, AcmRefreshHistory refreshHistory, + AcmIntegrationProperties acmIntegrationProperties, + AcmRefreshHistory refreshHistory, AcmPropertySourceRepository acmPropertySourceRepository) { this.contextRefresher = contextRefresher; - this.properties = properties; + this.acmIntegrationProperties = acmIntegrationProperties; this.refreshHistory = refreshHistory; this.acmPropertySourceRepository = acmPropertySourceRepository; } @@ -76,7 +73,7 @@ public class AcmContextRefresher implements ApplicationListener new ConfigChangeListener() { + @Override + public void receiveConfigInfo(String configInfo) { + String md5 = ""; + if (!StringUtils.isEmpty(configInfo)) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md5 = new BigInteger(1, + md.digest(configInfo.getBytes("UTF-8"))) + .toString(16); + } + catch (NoSuchAlgorithmException + | UnsupportedEncodingException e) { + logger.warn("unable to get md5 for dataId: " + dataId, e); + } } + refreshHistory.add(dataId, md5); + contextRefresher.refresh(); } - refreshHistory.add(dataId, md5); - contextRefresher.refresh(); - } - - }; - listenerMap.put(dataId, listener); - } + }); + ConfigService.addListener(dataId, + acmIntegrationProperties.getAcmProperties().getGroup(), listener); } } diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java index 0ad6a6b4c..8491ef129 100644 --- a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java +++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java @@ -34,6 +34,10 @@ public class AcmIntegrationProperties { private AcmProperties acmProperties; + public String getApplicationConfigurationDataIdWithoutGroup() { + return applicationName + "." + acmProperties.getFileExtension(); + } + public List getGroupConfigurationDataIds() { List groupConfigurationDataIds = new ArrayList<>(); if (StringUtils.isEmpty(applicationGroup)) { @@ -88,4 +92,7 @@ public class AcmIntegrationProperties { this.acmProperties = acmProperties; } + public AcmProperties getAcmProperties() { + return acmProperties; + } } From 397d6e063a80bcf1c5553843f51b6a7dd6d75fad Mon Sep 17 00:00:00 2001 From: xiaolongzuo <150349407@qq.com> Date: Tue, 30 Oct 2018 16:16:29 +0800 Subject: [PATCH 2/2] Extract acm configuration to bootstrap phase. # Conflicts: # spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/refresh/AcmContextRefresher.java --- .../acm/refresh/AcmContextRefresher.java | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/refresh/AcmContextRefresher.java b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/refresh/AcmContextRefresher.java index a6115912e..881bae2d1 100644 --- a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/refresh/AcmContextRefresher.java +++ b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/refresh/AcmContextRefresher.java @@ -91,28 +91,31 @@ public class AcmContextRefresher implements ApplicationListener new ConfigChangeListener() { - @Override - public void receiveConfigInfo(String configInfo) { - String md5 = ""; - if (!StringUtils.isEmpty(configInfo)) { - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - md5 = new BigInteger(1, - md.digest(configInfo.getBytes("UTF-8"))) - .toString(16); - } - catch (NoSuchAlgorithmException - | UnsupportedEncodingException e) { - logger.warn("unable to get md5 for dataId: " + dataId, e); - } + ConfigChangeListener listener = listenerMap.get(dataId); + if (listener == null) { + listener = new ConfigChangeListener() { + @Override + public void receiveConfigInfo(String configInfo) { + String md5 = ""; + if (!StringUtils.isEmpty(configInfo)) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md5 = new BigInteger(1, + md.digest(configInfo.getBytes("UTF-8"))).toString(16); + } + catch (NoSuchAlgorithmException + | UnsupportedEncodingException e) { + logger.warn("unable to get md5 for dataId: " + dataId, e); } - refreshHistory.add(dataId, md5); - contextRefresher.refresh(); } - }); + refreshHistory.add(dataId, md5); + contextRefresher.refresh(); + } + + }; + listenerMap.put(dataId, listener); + } + ConfigService.addListener(dataId, acmIntegrationProperties.getAcmProperties().getGroup(), listener); }