Merge pull request #77 from xiaolongzuo/master

Extract acm configuration to bootstrap phase and optimize error message.
pull/898/head
xiaojing 6 years ago committed by GitHub
commit 4e2e0e1716

@ -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;
}
}

@ -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<ApplicationReady
private final ContextRefresher contextRefresher;
private final AcmProperties properties;
private final AcmIntegrationProperties acmIntegrationProperties;
private final AcmRefreshHistory refreshHistory;
@ -58,14 +57,12 @@ public class AcmContextRefresher implements ApplicationListener<ApplicationReady
private Map<String, ConfigChangeListener> 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<ApplicationReady
}
private void registerDiamondListenersForApplications() {
if (properties.isRefreshEnabled()) {
if (acmIntegrationProperties.getAcmProperties().isRefreshEnabled()) {
for (AcmPropertySource acmPropertySource : acmPropertySourceRepository
.getAll()) {
if (acmPropertySource.isGroupLevel()) {
@ -87,11 +84,8 @@ public class AcmContextRefresher implements ApplicationListener<ApplicationReady
}
if (acmPropertySourceRepository.getAll().isEmpty()) {
String applicationName = environment
.getProperty("spring.application.name");
String dataId = applicationName + "." + properties.getFileExtension();
registerDiamondListener(dataId);
registerDiamondListener(acmIntegrationProperties
.getApplicationConfigurationDataIdWithoutGroup());
}
}
}
@ -119,7 +113,8 @@ public class AcmContextRefresher implements ApplicationListener<ApplicationReady
contextRefresher.refresh();
}
});
ConfigService.addListener(dataId, properties.getGroup(), listener);
ConfigService.addListener(dataId,
acmIntegrationProperties.getAcmProperties().getGroup(), listener);
}
}

@ -16,8 +16,6 @@
package org.springframework.cloud.alicloud.context.acm;
import static org.springframework.core.env.AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
@ -68,7 +66,7 @@ public class AcmContextBootstrapConfiguration {
String applicationName = environment.getProperty("spring.application.name");
String applicationGroup = environment.getProperty("spring.application.group");
Assert.isTrue(!StringUtils.isEmpty(applicationName),
"'spring.application.name' must be configured..");
"'spring.application.name' must be configured in bootstrap.properties or bootstrap.yml/yaml...");
acmIntegrationProperties.setApplicationName(applicationName);
acmIntegrationProperties.setApplicationGroup(applicationGroup);
acmIntegrationProperties.setActiveProfiles(environment.getActiveProfiles());

@ -34,6 +34,10 @@ public class AcmIntegrationProperties {
private AcmProperties acmProperties;
public String getApplicationConfigurationDataIdWithoutGroup() {
return applicationName + "." + acmProperties.getFileExtension();
}
public List<String> getGroupConfigurationDataIds() {
List<String> groupConfigurationDataIds = new ArrayList<>();
if (StringUtils.isEmpty(applicationGroup)) {
@ -88,4 +92,7 @@ public class AcmIntegrationProperties {
this.acmProperties = acmProperties;
}
public AcmProperties getAcmProperties() {
return acmProperties;
}
}

@ -34,9 +34,10 @@ public class AliCloudPropertiesTests {
@Test
public void testConfigurationValueDefaultsAreAsExpected() {
this.contextRunner.run(context -> {
AliCloudProperties config = context.getBean(AliCloudProperties.class);
assertThat(config.getAccessKey()).isNull();
assertThat(config.getSecretKey()).isNull();
AliCloudProperties aliCloudProperties = context
.getBean(AliCloudProperties.class);
assertThat(aliCloudProperties.getAccessKey()).isNull();
assertThat(aliCloudProperties.getSecretKey()).isNull();
});
}
@ -44,9 +45,10 @@ public class AliCloudPropertiesTests {
public void testConfigurationValuesAreCorrectlyLoaded() {
this.contextRunner.withPropertyValues("spring.cloud.alicloud.access-key=123",
"spring.cloud.alicloud.secret-key=123456").run(context -> {
AliCloudProperties config = context.getBean(AliCloudProperties.class);
assertThat(config.getAccessKey()).isEqualTo("123");
assertThat(config.getSecretKey()).isEqualTo("123456");
AliCloudProperties aliCloudProperties = context
.getBean(AliCloudProperties.class);
assertThat(aliCloudProperties.getAccessKey()).isEqualTo("123");
assertThat(aliCloudProperties.getSecretKey()).isEqualTo("123456");
});
}

@ -29,7 +29,7 @@ import com.alibaba.cloud.context.AliCloudServerMode;
/**
* @author xiaolongzuo
*/
public class AnsPropertiesTests {
public class AcmPropertiesTests {
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(
@ -67,14 +67,15 @@ public class AnsPropertiesTests {
"spring.cloud.alicloud.acm.endpoint=testDomain",
"spring.cloud.alicloud.acm.group=testGroup",
"spring.cloud.alicloud.acm.file-extension=yaml").run(context -> {
AcmProperties config = context.getBean(AcmProperties.class);
assertThat(config.getServerMode()).isEqualTo(AliCloudServerMode.EDAS);
assertThat(config.getServerList()).isEqualTo("10.10.10.10");
assertThat(config.getServerPort()).isEqualTo("11111");
assertThat(config.getEndpoint()).isEqualTo("testDomain");
assertThat(config.getGroup()).isEqualTo("testGroup");
assertThat(config.getFileExtension()).isEqualTo("yaml");
assertThat(config.getNamespace()).isEqualTo("testNamespace");
AcmProperties acmProperties = context.getBean(AcmProperties.class);
assertThat(acmProperties.getServerMode())
.isEqualTo(AliCloudServerMode.EDAS);
assertThat(acmProperties.getServerList()).isEqualTo("10.10.10.10");
assertThat(acmProperties.getServerPort()).isEqualTo("11111");
assertThat(acmProperties.getEndpoint()).isEqualTo("testDomain");
assertThat(acmProperties.getGroup()).isEqualTo("testGroup");
assertThat(acmProperties.getFileExtension()).isEqualTo("yaml");
assertThat(acmProperties.getNamespace()).isEqualTo("testNamespace");
});
}
@ -97,10 +98,6 @@ public class AnsPropertiesTests {
.size()).isEqualTo(2);
assertThat(acmIntegrationProperties
.getApplicationConfigurationDataIds().size()).isEqualTo(2);
System.out.println("-----"
+ acmIntegrationProperties.getGroupConfigurationDataIds());
System.out.println(acmIntegrationProperties
.getApplicationConfigurationDataIds());
});
}

@ -40,26 +40,26 @@ public class AnsPropertiesTests {
public void testConfigurationValueDefaultsAreAsExpected()
throws ClassNotFoundException {
this.contextRunner.withPropertyValues().run(context -> {
AnsProperties config = context.getBean(AnsProperties.class);
assertThat(config.getServerMode()).isEqualTo(AliCloudServerMode.LOCAL);
assertThat(config.getServerList()).isEqualTo("127.0.0.1");
assertThat(config.getServerPort()).isEqualTo("8080");
assertThat(config.getClientDomains()).isEqualTo("");
assertThat(config.getClientWeight()).isEqualTo(1.0F);
assertThat(config.getClientWeights().size()).isEqualTo(0);
assertThat(config.getClientTokens().size()).isEqualTo(0);
assertThat(config.getClientMetadata().size()).isEqualTo(0);
assertThat(config.getClientToken()).isNull();
assertThat(config.getClientCluster()).isEqualTo("DEFAULT");
assertThat(config.isRegisterEnabled()).isTrue();
assertThat(config.getClientInterfaceName()).isNull();
assertThat(config.getClientPort()).isEqualTo(-1);
assertThat(config.getEnv()).isEqualTo("DEFAULT");
assertThat(config.isSecure()).isFalse();
assertThat(config.getTags().size()).isEqualTo(1);
assertThat(config.getTags().keySet().iterator().next())
AnsProperties ansProperties = context.getBean(AnsProperties.class);
assertThat(ansProperties.getServerMode()).isEqualTo(AliCloudServerMode.LOCAL);
assertThat(ansProperties.getServerList()).isEqualTo("127.0.0.1");
assertThat(ansProperties.getServerPort()).isEqualTo("8080");
assertThat(ansProperties.getClientDomains()).isEqualTo("");
assertThat(ansProperties.getClientWeight()).isEqualTo(1.0F);
assertThat(ansProperties.getClientWeights().size()).isEqualTo(0);
assertThat(ansProperties.getClientTokens().size()).isEqualTo(0);
assertThat(ansProperties.getClientMetadata().size()).isEqualTo(0);
assertThat(ansProperties.getClientToken()).isNull();
assertThat(ansProperties.getClientCluster()).isEqualTo("DEFAULT");
assertThat(ansProperties.isRegisterEnabled()).isTrue();
assertThat(ansProperties.getClientInterfaceName()).isNull();
assertThat(ansProperties.getClientPort()).isEqualTo(-1);
assertThat(ansProperties.getEnv()).isEqualTo("DEFAULT");
assertThat(ansProperties.isSecure()).isFalse();
assertThat(ansProperties.getTags().size()).isEqualTo(1);
assertThat(ansProperties.getTags().keySet().iterator().next())
.isEqualTo("ANS_SERVICE_TYPE");
assertThat(config.getTags().get("ANS_SERVICE_TYPE"))
assertThat(ansProperties.getTags().get("ANS_SERVICE_TYPE"))
.isEqualTo("SPRING_CLOUD");
});
}
@ -74,26 +74,27 @@ public class AnsPropertiesTests {
"spring.cloud.alicloud.ans.client-weight=0.9",
"spring.cloud.alicloud.ans.client-weights.testDomain=0.9")
.run(context -> {
AnsProperties config = context.getBean(AnsProperties.class);
assertThat(config.getServerMode()).isEqualTo(AliCloudServerMode.EDAS);
assertThat(config.getServerList()).isEqualTo("10.10.10.10");
assertThat(config.getServerPort()).isEqualTo("11111");
assertThat(config.getClientDomains()).isEqualTo("testDomain");
assertThat(config.getClientWeight()).isEqualTo(0.9F);
assertThat(config.getClientWeights().size()).isEqualTo(1);
assertThat(config.getClientTokens().size()).isEqualTo(0);
assertThat(config.getClientMetadata().size()).isEqualTo(0);
assertThat(config.getClientToken()).isNull();
assertThat(config.getClientCluster()).isEqualTo("DEFAULT");
assertThat(config.isRegisterEnabled()).isTrue();
assertThat(config.getClientInterfaceName()).isNull();
assertThat(config.getClientPort()).isEqualTo(-1);
assertThat(config.getEnv()).isEqualTo("DEFAULT");
assertThat(config.isSecure()).isFalse();
assertThat(config.getTags().size()).isEqualTo(1);
assertThat(config.getTags().keySet().iterator().next())
AnsProperties ansProperties = context.getBean(AnsProperties.class);
assertThat(ansProperties.getServerMode())
.isEqualTo(AliCloudServerMode.EDAS);
assertThat(ansProperties.getServerList()).isEqualTo("10.10.10.10");
assertThat(ansProperties.getServerPort()).isEqualTo("11111");
assertThat(ansProperties.getClientDomains()).isEqualTo("testDomain");
assertThat(ansProperties.getClientWeight()).isEqualTo(0.9F);
assertThat(ansProperties.getClientWeights().size()).isEqualTo(1);
assertThat(ansProperties.getClientTokens().size()).isEqualTo(0);
assertThat(ansProperties.getClientMetadata().size()).isEqualTo(0);
assertThat(ansProperties.getClientToken()).isNull();
assertThat(ansProperties.getClientCluster()).isEqualTo("DEFAULT");
assertThat(ansProperties.isRegisterEnabled()).isTrue();
assertThat(ansProperties.getClientInterfaceName()).isNull();
assertThat(ansProperties.getClientPort()).isEqualTo(-1);
assertThat(ansProperties.getEnv()).isEqualTo("DEFAULT");
assertThat(ansProperties.isSecure()).isFalse();
assertThat(ansProperties.getTags().size()).isEqualTo(1);
assertThat(ansProperties.getTags().keySet().iterator().next())
.isEqualTo("ANS_SERVICE_TYPE");
assertThat(config.getTags().get("ANS_SERVICE_TYPE"))
assertThat(ansProperties.getTags().get("ANS_SERVICE_TYPE"))
.isEqualTo("SPRING_CLOUD");
});
}

@ -35,9 +35,9 @@ public class EdasPropertiesTests {
@Test
public void testConfigurationValueDefaultsAreAsExpected() {
this.contextRunner.withPropertyValues().run(context -> {
EdasProperties config = context.getBean(EdasProperties.class);
assertThat(config.getNamespace()).isNull();
assertThat(config.isApplicationNameValid()).isFalse();
EdasProperties edasProperties = context.getBean(EdasProperties.class);
assertThat(edasProperties.getNamespace()).isNull();
assertThat(edasProperties.isApplicationNameValid()).isFalse();
});
}
@ -47,9 +47,9 @@ public class EdasPropertiesTests {
.withPropertyValues("spring.cloud.alicloud.edas.namespace=testns",
"spring.application.name=myapps")
.run(context -> {
EdasProperties config = context.getBean(EdasProperties.class);
assertThat(config.getNamespace()).isEqualTo("testns");
assertThat(config.getApplicationName()).isEqualTo("myapps");
EdasProperties edasProperties = context.getBean(EdasProperties.class);
assertThat(edasProperties.getNamespace()).isEqualTo("testns");
assertThat(edasProperties.getApplicationName()).isEqualTo("myapps");
});
}
@ -59,9 +59,9 @@ public class EdasPropertiesTests {
.withPropertyValues("spring.cloud.alicloud.edas.namespace=testns",
"spring.cloud.alicloud.edas.application.name=myapps")
.run(context -> {
EdasProperties config = context.getBean(EdasProperties.class);
assertThat(config.getNamespace()).isEqualTo("testns");
assertThat(config.getApplicationName()).isEqualTo("myapps");
EdasProperties edasProperties = context.getBean(EdasProperties.class);
assertThat(edasProperties.getNamespace()).isEqualTo("testns");
assertThat(edasProperties.getApplicationName()).isEqualTo("myapps");
});
}

Loading…
Cancel
Save