Merge pull request #72 from xiaolongzuo/master

fixes #71.
pull/898/head
xiaojing 6 years ago committed by GitHub
commit bd0f7fb497

@ -16,20 +16,12 @@
package org.springframework.cloud.alicloud.acm.bootstrap;
import com.taobao.diamond.maintenance.DiamondHealth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.alicloud.acm.diagnostics.analyzer.DiamondConnectionFailureException;
import org.springframework.cloud.alicloud.context.acm.AcmProperties;
import org.springframework.cloud.alicloud.context.acm.AcmIntegrationProperties;
import org.springframework.cloud.bootstrap.config.PropertySourceLocator;
import org.springframework.core.env.CompositePropertySource;
import org.springframework.core.env.Environment;
import org.springframework.core.env.PropertySource;
import org.springframework.util.StringUtils;
import static com.taobao.diamond.client.impl.ServerHttpAgent.addressPort;
import static com.taobao.diamond.client.impl.ServerHttpAgent.domainName;
/**
* @author juven.xuxb
@ -37,8 +29,6 @@ import static com.taobao.diamond.client.impl.ServerHttpAgent.domainName;
*/
public class AcmPropertySourceLocator implements PropertySourceLocator {
private final Logger logger = LoggerFactory.getLogger(AcmPropertySourceLocator.class);
private static final String DIAMOND_PROPERTY_SOURCE_NAME = "diamond";
private static String defaultDiamondGroup = "DEFAULT_GROUP";
@ -46,87 +36,26 @@ public class AcmPropertySourceLocator implements PropertySourceLocator {
private AcmPropertySourceBuilder acmPropertySourceBuilder = new AcmPropertySourceBuilder();
@Autowired
private AcmProperties acmProperties;
private AcmIntegrationProperties acmIntegrationProperties;
@Override
public PropertySource<?> locate(Environment environment) {
String applicationName = environment.getProperty("spring.application.name");
logger.info("Initialize spring.application.name '" + applicationName + "'.");
String applicationGroup = environment.getProperty("spring.application.group");
if (StringUtils.isEmpty(applicationName)) {
throw new IllegalStateException(
"'spring.application.name' must be configured.");
}
CompositePropertySource compositePropertySource = new CompositePropertySource(
DIAMOND_PROPERTY_SOURCE_NAME);
loadGroupConfigurationRecursively(compositePropertySource, applicationGroup);
loadApplicationConfiguration(compositePropertySource, environment,
applicationGroup, applicationName);
return compositePropertySource;
}
private void checkDiamondHealth() {
logger.info("Checking ACM health");
try {
if (!"UP".equals(DiamondHealth.getHealth())) {
throw new DiamondConnectionFailureException(domainName, addressPort,
DiamondHealth.getHealth());
}
}
catch (Throwable t) {
throw new DiamondConnectionFailureException(domainName, addressPort,
"ACM Health error", t);
}
}
private void loadGroupConfigurationRecursively(
CompositePropertySource compositePropertySource, String applicationGroup) {
if (StringUtils.isEmpty(applicationGroup)) {
return;
}
String[] parts = applicationGroup.split("\\.");
for (int i = 1; i < parts.length; i++) {
String subGroup = parts[0];
for (int j = 1; j <= i; j++) {
subGroup = subGroup + "." + parts[j];
}
String dataId = subGroup + ":application." + acmProperties.getFileExtension();
for (String dataId : acmIntegrationProperties.getGroupConfigurationDataIds()) {
loadDiamondDataIfPresent(compositePropertySource, dataId, defaultDiamondGroup,
true);
}
}
private void loadApplicationConfiguration(
CompositePropertySource compositePropertySource, Environment environment,
String applicationGroup, String applicationName) {
if (!StringUtils.isEmpty(applicationGroup)) {
String dataId = applicationGroup + ":" + applicationName + "."
+ acmProperties.getFileExtension();
loadDiamondDataIfPresent(compositePropertySource, dataId, defaultDiamondGroup,
false);
for (String profile : environment.getActiveProfiles()) {
dataId = applicationGroup + ":" + applicationName + "-" + profile + "."
+ acmProperties.getFileExtension();
loadDiamondDataIfPresent(compositePropertySource, dataId,
defaultDiamondGroup, false);
}
}
String dataId = applicationName + "." + acmProperties.getFileExtension();
loadDiamondDataIfPresent(compositePropertySource, dataId, defaultDiamondGroup,
false);
for (String profile : environment.getActiveProfiles()) {
dataId = applicationName + "-" + profile + "."
+ acmProperties.getFileExtension();
for (String dataId : acmIntegrationProperties
.getApplicationConfigurationDataIds()) {
loadDiamondDataIfPresent(compositePropertySource, dataId, defaultDiamondGroup,
false);
}
return compositePropertySource;
}
private void loadDiamondDataIfPresent(final CompositePropertySource composite,

@ -16,6 +16,8 @@
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;
@ -25,7 +27,11 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.cloud.alicloud.context.AliCloudProperties;
import org.springframework.cloud.alicloud.context.edas.EdasContextAutoConfiguration;
import org.springframework.cloud.alicloud.context.edas.EdasProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import com.alibaba.cloud.context.acm.AliCloudAcmInitializer;
@ -47,10 +53,32 @@ public class AcmContextBootstrapConfiguration {
@Autowired
private AliCloudProperties aliCloudProperties;
@Autowired
private Environment environment;
@PostConstruct
public void initAcmProperties() {
AliCloudAcmInitializer.initialize(aliCloudProperties, edasProperties,
acmProperties);
}
@Bean
public AcmIntegrationProperties acmIntegrationProperties() {
AcmIntegrationProperties acmIntegrationProperties = new AcmIntegrationProperties();
String applicationName = environment.getProperty("spring.application.name");
String applicationGroup = environment.getProperty("spring.application.group");
String activeProfiles = environment.getProperty(ACTIVE_PROFILES_PROPERTY_NAME);
Assert.isTrue(!StringUtils.isEmpty(applicationName),
"'spring.application.name' must be configured..");
acmIntegrationProperties.setApplicationName(applicationName);
acmIntegrationProperties.setApplicationGroup(applicationGroup);
if (StringUtils.hasText(activeProfiles)) {
acmIntegrationProperties
.setActiveProfiles(StringUtils.commaDelimitedListToStringArray(
StringUtils.trimAllWhitespace(activeProfiles)));
}
acmIntegrationProperties.setAcmProperties(acmProperties);
return acmIntegrationProperties;
}
}

@ -0,0 +1,91 @@
/*
* Copyright (C) 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
*
* http://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 org.springframework.cloud.alicloud.context.acm;
import java.util.ArrayList;
import java.util.List;
import org.springframework.util.StringUtils;
/**
* @author xiaolongzuo
*/
public class AcmIntegrationProperties {
private String applicationName;
private String applicationGroup;
private String[] activeProfiles = new String[0];
private AcmProperties acmProperties;
public List<String> getGroupConfigurationDataIds() {
List<String> groupConfigurationDataIds = new ArrayList<>();
if (StringUtils.isEmpty(applicationGroup)) {
return groupConfigurationDataIds;
}
String[] parts = applicationGroup.split("\\.");
for (int i = 1; i < parts.length; i++) {
StringBuilder subGroup = new StringBuilder(parts[0]);
for (int j = 1; j <= i; j++) {
subGroup.append(".").append(parts[j]);
}
groupConfigurationDataIds
.add(subGroup + ":application." + acmProperties.getFileExtension());
}
return groupConfigurationDataIds;
}
public List<String> getApplicationConfigurationDataIds() {
List<String> applicationConfigurationDataIds = new ArrayList<>();
if (!StringUtils.isEmpty(applicationGroup)) {
applicationConfigurationDataIds.add(applicationGroup + ":" + applicationName
+ "." + acmProperties.getFileExtension());
for (String profile : activeProfiles) {
applicationConfigurationDataIds
.add(applicationGroup + ":" + applicationName + "-" + profile
+ "." + acmProperties.getFileExtension());
}
}
applicationConfigurationDataIds
.add(applicationName + "." + acmProperties.getFileExtension());
for (String profile : activeProfiles) {
applicationConfigurationDataIds.add(applicationName + "-" + profile + "."
+ acmProperties.getFileExtension());
}
return applicationConfigurationDataIds;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
public void setApplicationGroup(String applicationGroup) {
this.applicationGroup = applicationGroup;
}
public void setActiveProfiles(String[] activeProfiles) {
this.activeProfiles = activeProfiles;
}
public void setAcmProperties(AcmProperties acmProperties) {
this.acmProperties = acmProperties;
}
}

@ -39,23 +39,26 @@ public class AnsPropertiesTests {
@Test
public void testConfigurationValueDefaultsAreAsExpected() {
this.contextRunner.withPropertyValues().run(context -> {
AcmProperties config = context.getBean(AcmProperties.class);
assertThat(config.getServerMode()).isEqualTo(AliCloudServerMode.LOCAL);
assertThat(config.getServerList()).isEqualTo("127.0.0.1");
assertThat(config.getServerPort()).isEqualTo("8080");
assertThat(config.getEndpoint()).isNull();
assertThat(config.getFileExtension()).isEqualTo("properties");
assertThat(config.getGroup()).isEqualTo("DEFAULT_GROUP");
assertThat(config.getNamespace()).isNull();
assertThat(config.getRamRoleName()).isNull();
assertThat(config.getTimeout()).isEqualTo(3000);
});
this.contextRunner.withPropertyValues("spring.application.name=myapp")
.run(context -> {
AcmProperties config = context.getBean(AcmProperties.class);
assertThat(config.getServerMode())
.isEqualTo(AliCloudServerMode.LOCAL);
assertThat(config.getServerList()).isEqualTo("127.0.0.1");
assertThat(config.getServerPort()).isEqualTo("8080");
assertThat(config.getEndpoint()).isNull();
assertThat(config.getFileExtension()).isEqualTo("properties");
assertThat(config.getGroup()).isEqualTo("DEFAULT_GROUP");
assertThat(config.getNamespace()).isNull();
assertThat(config.getRamRoleName()).isNull();
assertThat(config.getTimeout()).isEqualTo(3000);
});
}
@Test
public void testConfigurationValuesAreCorrectlyLoaded() {
this.contextRunner.withPropertyValues("spring.cloud.alicloud.access-key=ak",
this.contextRunner.withPropertyValues("spring.application.name=myapp",
"spring.cloud.alicloud.access-key=ak",
"spring.cloud.alicloud.secret-key=sk",
"spring.cloud.alicloud.acm.server-mode=EDAS",
"spring.cloud.alicloud.acm.server-port=11111",
@ -75,4 +78,53 @@ public class AnsPropertiesTests {
});
}
@Test
public void testAcmIntegrationConfigurationValuesAreCorrectlyLoaded() {
this.contextRunner.withPropertyValues("spring.application.name=myapp",
"spring.application.group=com.alicloud.test",
"spring.cloud.alicloud.access-key=ak",
"spring.cloud.alicloud.secret-key=sk",
"spring.cloud.alicloud.acm.server-mode=EDAS",
"spring.cloud.alicloud.acm.server-port=11111",
"spring.cloud.alicloud.acm.server-list=10.10.10.10",
"spring.cloud.alicloud.acm.namespace=testNamespace",
"spring.cloud.alicloud.acm.endpoint=testDomain",
"spring.cloud.alicloud.acm.group=testGroup",
"spring.cloud.alicloud.acm.file-extension=yaml").run(context -> {
AcmIntegrationProperties acmIntegrationProperties = context
.getBean(AcmIntegrationProperties.class);
assertThat(acmIntegrationProperties.getGroupConfigurationDataIds()
.size()).isEqualTo(2);
assertThat(acmIntegrationProperties
.getApplicationConfigurationDataIds().size()).isEqualTo(2);
System.out.println("-----"
+ acmIntegrationProperties.getGroupConfigurationDataIds());
System.out.println(acmIntegrationProperties
.getApplicationConfigurationDataIds());
});
}
@Test
public void testAcmIntegrationConfigurationValuesAreCorrectlyLoaded2() {
this.contextRunner.withPropertyValues("spring.application.name=myapp",
"spring.application.group=com.alicloud.test",
"spring.profiles.active=profile1,profile2",
"spring.cloud.alicloud.access-key=ak",
"spring.cloud.alicloud.secret-key=sk",
"spring.cloud.alicloud.acm.server-mode=EDAS",
"spring.cloud.alicloud.acm.server-port=11111",
"spring.cloud.alicloud.acm.server-list=10.10.10.10",
"spring.cloud.alicloud.acm.namespace=testNamespace",
"spring.cloud.alicloud.acm.endpoint=testDomain",
"spring.cloud.alicloud.acm.group=testGroup",
"spring.cloud.alicloud.acm.file-extension=yaml").run(context -> {
AcmIntegrationProperties acmIntegrationProperties = context
.getBean(AcmIntegrationProperties.class);
assertThat(acmIntegrationProperties.getGroupConfigurationDataIds()
.size()).isEqualTo(2);
assertThat(acmIntegrationProperties
.getApplicationConfigurationDataIds().size()).isEqualTo(6);
});
}
}

Loading…
Cancel
Save