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;
|
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.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.cloud.alicloud.acm.diagnostics.analyzer.DiamondConnectionFailureException;
|
import org.springframework.cloud.alicloud.context.acm.AcmIntegrationProperties;
|
||||||
import org.springframework.cloud.alicloud.context.acm.AcmProperties;
|
|
||||||
import org.springframework.cloud.bootstrap.config.PropertySourceLocator;
|
import org.springframework.cloud.bootstrap.config.PropertySourceLocator;
|
||||||
import org.springframework.core.env.CompositePropertySource;
|
import org.springframework.core.env.CompositePropertySource;
|
||||||
import org.springframework.core.env.Environment;
|
import org.springframework.core.env.Environment;
|
||||||
import org.springframework.core.env.PropertySource;
|
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
|
* @author juven.xuxb
|
||||||
@ -37,8 +29,6 @@ import static com.taobao.diamond.client.impl.ServerHttpAgent.domainName;
|
|||||||
*/
|
*/
|
||||||
public class AcmPropertySourceLocator implements PropertySourceLocator {
|
public class AcmPropertySourceLocator implements PropertySourceLocator {
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(AcmPropertySourceLocator.class);
|
|
||||||
|
|
||||||
private static final String DIAMOND_PROPERTY_SOURCE_NAME = "diamond";
|
private static final String DIAMOND_PROPERTY_SOURCE_NAME = "diamond";
|
||||||
|
|
||||||
private static String defaultDiamondGroup = "DEFAULT_GROUP";
|
private static String defaultDiamondGroup = "DEFAULT_GROUP";
|
||||||
@ -46,87 +36,26 @@ public class AcmPropertySourceLocator implements PropertySourceLocator {
|
|||||||
private AcmPropertySourceBuilder acmPropertySourceBuilder = new AcmPropertySourceBuilder();
|
private AcmPropertySourceBuilder acmPropertySourceBuilder = new AcmPropertySourceBuilder();
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private AcmProperties acmProperties;
|
private AcmIntegrationProperties acmIntegrationProperties;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PropertySource<?> locate(Environment environment) {
|
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(
|
CompositePropertySource compositePropertySource = new CompositePropertySource(
|
||||||
DIAMOND_PROPERTY_SOURCE_NAME);
|
DIAMOND_PROPERTY_SOURCE_NAME);
|
||||||
|
|
||||||
loadGroupConfigurationRecursively(compositePropertySource, applicationGroup);
|
for (String dataId : acmIntegrationProperties.getGroupConfigurationDataIds()) {
|
||||||
|
|
||||||
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();
|
|
||||||
loadDiamondDataIfPresent(compositePropertySource, dataId, defaultDiamondGroup,
|
loadDiamondDataIfPresent(compositePropertySource, dataId, defaultDiamondGroup,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private void loadApplicationConfiguration(
|
for (String dataId : acmIntegrationProperties
|
||||||
CompositePropertySource compositePropertySource, Environment environment,
|
.getApplicationConfigurationDataIds()) {
|
||||||
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();
|
|
||||||
loadDiamondDataIfPresent(compositePropertySource, dataId, defaultDiamondGroup,
|
loadDiamondDataIfPresent(compositePropertySource, dataId, defaultDiamondGroup,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return compositePropertySource;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadDiamondDataIfPresent(final CompositePropertySource composite,
|
private void loadDiamondDataIfPresent(final CompositePropertySource composite,
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package org.springframework.cloud.alicloud.context.acm;
|
package org.springframework.cloud.alicloud.context.acm;
|
||||||
|
|
||||||
|
import static org.springframework.core.env.AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
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.AliCloudProperties;
|
||||||
import org.springframework.cloud.alicloud.context.edas.EdasContextAutoConfiguration;
|
import org.springframework.cloud.alicloud.context.edas.EdasContextAutoConfiguration;
|
||||||
import org.springframework.cloud.alicloud.context.edas.EdasProperties;
|
import org.springframework.cloud.alicloud.context.edas.EdasProperties;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
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;
|
import com.alibaba.cloud.context.acm.AliCloudAcmInitializer;
|
||||||
|
|
||||||
@ -47,10 +53,32 @@ public class AcmContextBootstrapConfiguration {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private AliCloudProperties aliCloudProperties;
|
private AliCloudProperties aliCloudProperties;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Environment environment;
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void initAcmProperties() {
|
public void initAcmProperties() {
|
||||||
AliCloudAcmInitializer.initialize(aliCloudProperties, edasProperties,
|
AliCloudAcmInitializer.initialize(aliCloudProperties, edasProperties,
|
||||||
acmProperties);
|
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
|
@Test
|
||||||
public void testConfigurationValueDefaultsAreAsExpected() {
|
public void testConfigurationValueDefaultsAreAsExpected() {
|
||||||
this.contextRunner.withPropertyValues().run(context -> {
|
this.contextRunner.withPropertyValues("spring.application.name=myapp")
|
||||||
AcmProperties config = context.getBean(AcmProperties.class);
|
.run(context -> {
|
||||||
assertThat(config.getServerMode()).isEqualTo(AliCloudServerMode.LOCAL);
|
AcmProperties config = context.getBean(AcmProperties.class);
|
||||||
assertThat(config.getServerList()).isEqualTo("127.0.0.1");
|
assertThat(config.getServerMode())
|
||||||
assertThat(config.getServerPort()).isEqualTo("8080");
|
.isEqualTo(AliCloudServerMode.LOCAL);
|
||||||
assertThat(config.getEndpoint()).isNull();
|
assertThat(config.getServerList()).isEqualTo("127.0.0.1");
|
||||||
assertThat(config.getFileExtension()).isEqualTo("properties");
|
assertThat(config.getServerPort()).isEqualTo("8080");
|
||||||
assertThat(config.getGroup()).isEqualTo("DEFAULT_GROUP");
|
assertThat(config.getEndpoint()).isNull();
|
||||||
assertThat(config.getNamespace()).isNull();
|
assertThat(config.getFileExtension()).isEqualTo("properties");
|
||||||
assertThat(config.getRamRoleName()).isNull();
|
assertThat(config.getGroup()).isEqualTo("DEFAULT_GROUP");
|
||||||
assertThat(config.getTimeout()).isEqualTo(3000);
|
assertThat(config.getNamespace()).isNull();
|
||||||
});
|
assertThat(config.getRamRoleName()).isNull();
|
||||||
|
assertThat(config.getTimeout()).isEqualTo(3000);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testConfigurationValuesAreCorrectlyLoaded() {
|
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.secret-key=sk",
|
||||||
"spring.cloud.alicloud.acm.server-mode=EDAS",
|
"spring.cloud.alicloud.acm.server-mode=EDAS",
|
||||||
"spring.cloud.alicloud.acm.server-port=11111",
|
"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