diff --git a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/bootstrap/AcmPropertySourceLocator.java b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/bootstrap/AcmPropertySourceLocator.java index 9d5eb472f..a7c167619 100644 --- a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/bootstrap/AcmPropertySourceLocator.java +++ b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/bootstrap/AcmPropertySourceLocator.java @@ -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, diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmContextBootstrapConfiguration.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmContextBootstrapConfiguration.java index 772724420..32fd47da9 100644 --- a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmContextBootstrapConfiguration.java +++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmContextBootstrapConfiguration.java @@ -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; + } + } 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 new file mode 100644 index 000000000..0ad6a6b4c --- /dev/null +++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java @@ -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 getGroupConfigurationDataIds() { + List 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 getApplicationConfigurationDataIds() { + List 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; + } + +} diff --git a/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/acm/AnsPropertiesTests.java b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/acm/AnsPropertiesTests.java index 9e278aca9..8a1f473ab 100644 --- a/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/acm/AnsPropertiesTests.java +++ b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/acm/AnsPropertiesTests.java @@ -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); + }); + } + }