mirror of
https://gitee.com/mirrors/Spring-Cloud-Alibaba.git
synced 2021-06-26 13:25:11 +08:00
fixes #71.
This commit is contained in:
parent
bf7aec2fbc
commit
e74d54604d
@ -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…
x
Reference in New Issue
Block a user