From ba909528804edcabd46b54d193a281076baef2ab Mon Sep 17 00:00:00 2001 From: pbting <314226532@qq.com> Date: Tue, 4 Dec 2018 09:59:55 +0800 Subject: [PATCH 1/2] =?UTF-8?q?nacos=20starter=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=8F=AF=E8=87=AA=E5=AE=9A=E4=B9=89dataid=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BB=A5=E5=8F=8ANacos=20=E5=95=86=E4=B8=9A=E5=8C=96=E5=92=8C?= =?UTF-8?q?=E4=BA=91=E4=B8=8AACM=20=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-cloud-alibaba-dependencies/pom.xml | 2 +- .../alibaba/nacos/NacosConfigProperties.java | 95 +++++++++++++++--- .../nacos/client/NacosPropertySource.java | 24 ++++- .../client/NacosPropertySourceBuilder.java | 15 +-- .../client/NacosPropertySourceLocator.java | 98 +++++++++++++++++-- .../nacos/refresh/NacosContextRefresher.java | 33 ++++--- .../alibaba/nacos/NacosDiscoveryClient.java | 7 +- .../nacos/NacosDiscoveryProperties.java | 41 ++++---- .../nacos/registry/NacosServiceRegistry.java | 8 +- .../alibaba/nacos/ribbon/NacosServer.java | 7 +- ...itional-spring-configuration-metadata.json | 6 ++ .../nacos/NacosParameterInitListener.java | 32 ++++++ .../main/resources/META-INF/spring.factories | 3 +- 13 files changed, 287 insertions(+), 84 deletions(-) create mode 100644 spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/nacos/NacosParameterInitListener.java diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 07dd5644..320cb599 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -18,7 +18,7 @@ 1.3.0-GA 3.1.0 - 0.4.0 + 0.5.0 1.0.8 0.1.1 4.0.1 diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/NacosConfigProperties.java b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/NacosConfigProperties.java index e279d9cb..244834c8 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/NacosConfigProperties.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/NacosConfigProperties.java @@ -16,15 +16,8 @@ package org.springframework.cloud.alibaba.nacos; -import java.util.Arrays; -import java.util.Objects; -import java.util.Properties; - -import javax.annotation.PostConstruct; - import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -32,14 +25,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.core.env.Environment; -import static com.alibaba.nacos.api.PropertyKeyConst.ACCESS_KEY; -import static com.alibaba.nacos.api.PropertyKeyConst.CLUSTER_NAME; -import static com.alibaba.nacos.api.PropertyKeyConst.CONTEXT_PATH; -import static com.alibaba.nacos.api.PropertyKeyConst.ENCODE; -import static com.alibaba.nacos.api.PropertyKeyConst.ENDPOINT; -import static com.alibaba.nacos.api.PropertyKeyConst.NAMESPACE; -import static com.alibaba.nacos.api.PropertyKeyConst.SECRET_KEY; -import static com.alibaba.nacos.api.PropertyKeyConst.SERVER_ADDR; +import javax.annotation.PostConstruct; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Properties; + +import static com.alibaba.nacos.api.PropertyKeyConst.*; /** * nacos properties @@ -118,6 +110,21 @@ public class NacosConfigProperties { private String[] activeProfiles; + /** + * the dataids for configurable multiple shared configurations , multiple separated by commas . + */ + private String sharedDataids ; + + /** + * refreshable dataids , multiple separated by commas . + */ + private String refreshableDataids ; + + /** + * a set of extended configurations . + */ + private List extConfig ; + private ConfigService configService; @Autowired @@ -234,10 +241,66 @@ public class NacosConfigProperties { return activeProfiles; } + public String getSharedDataids() { + return sharedDataids; + } + + public void setSharedDataids(String sharedDataids) { + this.sharedDataids = sharedDataids; + } + + public String getRefreshableDataids() { + return refreshableDataids; + } + + public void setRefreshableDataids(String refreshableDataids) { + this.refreshableDataids = refreshableDataids; + } + + public List getExtConfig() { + return extConfig; + } + + public void setExtConfig(List extConfig) { + this.extConfig = extConfig; + } + + public static class Config{ + private String dataId; + private String group = "DEFAULT_GROUP"; + private boolean refresh = false; + + public String getDataId() { + return dataId; + } + + public void setDataId(String dataId) { + this.dataId = dataId; + } + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + public boolean isRefresh() { + return refresh; + } + + public void setRefresh(boolean refresh) { + this.refresh = refresh; + } + } + @Override public String toString() { return "NacosConfigProperties{" + "serverAddr='" + serverAddr + '\'' - + ", encode='" + encode + '\'' + ", group='" + group + '\'' + ", prefix='" + + ", encode='" + encode + '\'' + ", group='" + group + '\'' + + ", sharedDataids='" + this.sharedDataids + '\'' + + ", refreshableDataids='" + this.refreshableDataids + '\'' + ", prefix='" + prefix + '\'' + ", fileExtension='" + fileExtension + '\'' + ", timeout=" + timeout + ", endpoint='" + endpoint + '\'' + ", namespace='" + namespace + '\'' + ", accessKey='" + accessKey + '\'' diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySource.java b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySource.java index 7d9d9a0d..a47f8182 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySource.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySource.java @@ -16,16 +16,21 @@ package org.springframework.cloud.alibaba.nacos.client; +import org.springframework.core.env.MapPropertySource; + import java.util.Date; import java.util.Map; -import org.springframework.core.env.MapPropertySource; - /** * @author xiaojing */ public class NacosPropertySource extends MapPropertySource { + /** + * Nacos Group + */ + private final String group; + /** * Nacos dataID */ @@ -36,11 +41,21 @@ public class NacosPropertySource extends MapPropertySource { */ private final Date timestamp; + /** + * Whether to support dynamic refresh for this Property Source + */ + private final boolean isRefreshable ; - NacosPropertySource(String dataId, Map source, Date timestamp) { + NacosPropertySource(String group,String dataId, Map source, Date timestamp,boolean isRefreshable) { super(dataId, source); + this.group = group; this.dataId = dataId; this.timestamp = timestamp; + this.isRefreshable = isRefreshable ; + } + + public String getGroup(){ + return this.group; } public String getDataId() { @@ -51,4 +66,7 @@ public class NacosPropertySource extends MapPropertySource { return timestamp; } + public boolean isRefreshable(){ + return isRefreshable; + } } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceBuilder.java b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceBuilder.java index 16bf97d0..93a7440a 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceBuilder.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceBuilder.java @@ -16,22 +16,17 @@ package org.springframework.cloud.alibaba.nacos.client; -import java.io.StringReader; -import java.util.Date; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.exception.NacosException; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.core.io.ByteArrayResource; import org.springframework.util.StringUtils; +import java.io.StringReader; +import java.util.*; + /** * @author xiaojing */ @@ -71,12 +66,12 @@ public class NacosPropertySourceBuilder { * @param dataId Nacos dataId * @param group Nacos group */ - NacosPropertySource build(String dataId, String group, String fileExtension) { + NacosPropertySource build(String dataId, String group, String fileExtension, boolean isRefreshable) { Properties p = loadNacosData(dataId, group, fileExtension); if (p == null) { return null; } - return new NacosPropertySource(dataId, propertiesToMap(p), new Date()); + return new NacosPropertySource(group,dataId, propertiesToMap(p), new Date(), isRefreshable); } private Properties loadNacosData(String dataId, String group, String fileExtension) { diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceLocator.java b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceLocator.java index 304fc567..598a35e9 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceLocator.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceLocator.java @@ -16,6 +16,7 @@ package org.springframework.cloud.alibaba.nacos.client; +import com.alibaba.nacos.api.config.ConfigService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -26,8 +27,8 @@ import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.Environment; import org.springframework.core.env.PropertySource; import org.springframework.util.StringUtils; - -import com.alibaba.nacos.api.config.ConfigService; +import java.util.Arrays; +import java.util.List; /** * @author xiaojing @@ -40,6 +41,8 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { private static final String NACOS_PROPERTY_SOURCE_NAME = "NACOS"; private static final String SEP1 = "-"; private static final String DOT = "."; + private static final String SHARED_CONFIG_SEPRATOR_CHAR = "[,]"; + private static final List SUPPORT_FILE_EXTENSION = Arrays.asList("properties","yaml","yml"); @Autowired private NacosConfigProperties nacosConfigProperties; @@ -73,29 +76,112 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { CompositePropertySource composite = new CompositePropertySource( NACOS_PROPERTY_SOURCE_NAME); + + loadSharedConfiguration(composite); + loadExtConfiguration(composite); loadApplicationConfiguration(composite, nacosGroup, dataIdPrefix, fileExtension); return composite; } + private void loadSharedConfiguration(CompositePropertySource compositePropertySource){ + String sharedDataIds = nacosConfigProperties.getSharedDataids(); + String refreshDataIds = nacosConfigProperties.getRefreshableDataids(); + + if (sharedDataIds == null || sharedDataIds.trim().length() == 0){ + return ; + } + + String[] sharedDataIdArry = sharedDataIds.split(SHARED_CONFIG_SEPRATOR_CHAR) ; + checkDataIdFileExtension(sharedDataIdArry); + + for (int i =0;i < sharedDataIdArry.length; i++){ + String dataId = sharedDataIdArry[i]; + String fileExtension = dataId.substring(dataId.lastIndexOf(".")+1); + boolean isRefreshable = checkDataIdIsRefreshbable(refreshDataIds,sharedDataIdArry[i]); + + loadNacosDataIfPresent(compositePropertySource,dataId,"DEFAULT_GROUP",fileExtension, isRefreshable); + } + } + + private void loadExtConfiguration(CompositePropertySource compositePropertySource){ + if (nacosConfigProperties.getExtConfig() == null || nacosConfigProperties.getExtConfig().isEmpty()){ + return; + } + + List extConfigs = nacosConfigProperties.getExtConfig(); + checkExtConfiguration(extConfigs); + + for (NacosConfigProperties.Config config : extConfigs){ + String dataId = config.getDataId(); + String fileExtension = dataId.substring(dataId.lastIndexOf(".")+1); + loadNacosDataIfPresent(compositePropertySource,dataId,config.getGroup(),fileExtension,config.isRefresh()); + } + } + + private void checkExtConfiguration(List extConfigs) { + String[] dataIds = new String[extConfigs.size()]; + for (int i=0;i 0){ + continue outline; + } + } + stringBuilder.append(sharedDataIdArry[i]+","); + } + + if (stringBuilder.length() > 0){ + String result = stringBuilder.substring(0,stringBuilder.length()-1); + throw new IllegalStateException(String.format("[%s] must contains file extension with properties|yaml|yml", result)); + } + } + + private boolean checkDataIdIsRefreshbable(String refreshDataIds,String sharedDataId){ + if (refreshDataIds == null || "".equals(refreshDataIds)){ + return false ; + } + + String[] refreshDataIdArry = refreshDataIds.split(SHARED_CONFIG_SEPRATOR_CHAR); + for (String refreshDataId : refreshDataIdArry){ + if (refreshDataId.equals(sharedDataId)){ + return true ; + } + } + + return false ; + } + } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/refresh/NacosContextRefresher.java b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/refresh/NacosContextRefresher.java index 88d237a0..3f8f048e 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/refresh/NacosContextRefresher.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/refresh/NacosContextRefresher.java @@ -16,14 +16,9 @@ package org.springframework.cloud.alibaba.nacos.refresh; -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 java.util.concurrent.Executor; - +import com.alibaba.nacos.api.config.ConfigService; +import com.alibaba.nacos.api.config.listener.Listener; +import com.alibaba.nacos.api.exception.NacosException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.event.ApplicationReadyEvent; @@ -34,9 +29,13 @@ import org.springframework.cloud.context.refresh.ContextRefresher; import org.springframework.context.ApplicationListener; import org.springframework.util.StringUtils; -import com.alibaba.nacos.api.config.ConfigService; -import com.alibaba.nacos.api.config.listener.Listener; -import com.alibaba.nacos.api.exception.NacosException; +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 java.util.concurrent.Executor; /** * On application start up, NacosContextRefresher add nacos listeners to all application @@ -85,13 +84,17 @@ public class NacosContextRefresher implements ApplicationListener new Listener() { @Override @@ -103,7 +106,7 @@ public class NacosContextRefresher implements ApplicationListener instance.setIp(registration.getHost()); instance.setPort(registration.getPort()); instance.setWeight(registration.getRegisterWeight()); - instance.setCluster(new Cluster(registration.getCluster())); + instance.setClusterName(registration.getCluster()); instance.setMetadata(registration.getMetadata()); try { diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosServer.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosServer.java index 9fbaf231..ba64dbda 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosServer.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosServer.java @@ -16,12 +16,11 @@ package org.springframework.cloud.alibaba.nacos.ribbon; -import java.util.Map; - import com.alibaba.nacos.api.naming.pojo.Instance; - import com.netflix.loadbalancer.Server; +import java.util.Map; + /** * @author xiaojing */ @@ -37,7 +36,7 @@ public class NacosServer extends Server { this.metaInfo = new MetaInfo() { @Override public String getAppName() { - return instance.serviceName(); + return instance.getServiceName(); } @Override diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 2ea041b0..d0e82a51 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -4,5 +4,11 @@ "type": "java.lang.String", "defaultValue": "${spring.application.name}", "description": "the service name to register, default value is ${spring.application.name}." + }, + { + "name": "spring.cloud.nacos.discovery.namingLoadCacheAtStart", + "type": "java.lang.Boolean", + "defaultValue": "false", + "description": "naming load from local cache at application start ." } ]} diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/nacos/NacosParameterInitListener.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/nacos/NacosParameterInitListener.java new file mode 100644 index 00000000..c893c97a --- /dev/null +++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/nacos/NacosParameterInitListener.java @@ -0,0 +1,32 @@ +package org.springframework.cloud.alicloud.context.nacos; + +import com.alibaba.cloud.context.edas.EdasChangeOrderConfiguration; +import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; +import org.springframework.context.ApplicationListener; + +public class NacosParameterInitListener implements ApplicationListener { + private static final Logger log = LoggerFactory.getLogger(NacosParameterInitListener.class); + @Override + public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) { + + preparedNacosConfiguration(); + } + + private void preparedNacosConfiguration(){ + EdasChangeOrderConfiguration edasChangeOrderConfiguration = EdasChangeOrderConfigurationFactory + .buildEdasChangeOrderConfiguration(); + log.info("Initialize Nacos Parameter from edas change order,is edas managed {}.",edasChangeOrderConfiguration.isEdasManaged()); + if (!edasChangeOrderConfiguration.isEdasManaged()) { + return ; + } + //initialize nacos configuration + System.getProperties().setProperty("spring.cloud.nacos.config.server-addr",""); + System.getProperties().setProperty("spring.cloud.nacos.config.endpoint", edasChangeOrderConfiguration.getAddressServerDomain()); + System.getProperties().setProperty("spring.cloud.nacos.config.namespace", edasChangeOrderConfiguration.getTenantId()); + System.getProperties().setProperty("spring.cloud.nacos.config.access-key", edasChangeOrderConfiguration.getDauthAccessKey()); + System.getProperties().setProperty("spring.cloud.nacos.config.secret-key", edasChangeOrderConfiguration.getDauthSecretKey()); + } +} \ No newline at end of file diff --git a/spring-cloud-alicloud-context/src/main/resources/META-INF/spring.factories b/spring-cloud-alicloud-context/src/main/resources/META-INF/spring.factories index e10dcb95..b5ed9c32 100644 --- a/spring-cloud-alicloud-context/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alicloud-context/src/main/resources/META-INF/spring.factories @@ -6,4 +6,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.alicloud.context.ans.AnsContextAutoConfiguration,\ org.springframework.cloud.alicloud.context.oss.OssContextAutoConfiguration org.springframework.context.ApplicationListener=\ - org.springframework.cloud.alicloud.context.ans.AnsContextApplicationListener \ No newline at end of file + org.springframework.cloud.alicloud.context.ans.AnsContextApplicationListener,\ + org.springframework.cloud.alicloud.context.nacos.NacosParameterInitListener \ No newline at end of file From 356ce112a9ea65d53704922499f1712b4e3b6ff3 Mon Sep 17 00:00:00 2001 From: pbting <314226532@qq.com> Date: Tue, 4 Dec 2018 10:37:57 +0800 Subject: [PATCH 2/2] code format --- .../alibaba/nacos/NacosConfigProperties.java | 12 ++- .../nacos/client/NacosPropertySource.java | 12 ++- .../client/NacosPropertySourceBuilder.java | 7 +- .../client/NacosPropertySourceLocator.java | 102 ++++++++++-------- .../nacos/refresh/NacosContextRefresher.java | 15 +-- .../nacos/NacosParameterInitListener.java | 48 +++++---- 6 files changed, 113 insertions(+), 83 deletions(-) diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/NacosConfigProperties.java b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/NacosConfigProperties.java index 244834c8..37f9ce96 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/NacosConfigProperties.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/NacosConfigProperties.java @@ -38,6 +38,7 @@ import static com.alibaba.nacos.api.PropertyKeyConst.*; * * @author leijuan * @author xiaojing + * @author pbting */ @ConfigurationProperties("spring.cloud.nacos.config") public class NacosConfigProperties { @@ -111,19 +112,20 @@ public class NacosConfigProperties { private String[] activeProfiles; /** - * the dataids for configurable multiple shared configurations , multiple separated by commas . + * the dataids for configurable multiple shared configurations , multiple separated by + * commas . */ - private String sharedDataids ; + private String sharedDataids; /** * refreshable dataids , multiple separated by commas . */ - private String refreshableDataids ; + private String refreshableDataids; /** * a set of extended configurations . */ - private List extConfig ; + private List extConfig; private ConfigService configService; @@ -265,7 +267,7 @@ public class NacosConfigProperties { this.extConfig = extConfig; } - public static class Config{ + public static class Config { private String dataId; private String group = "DEFAULT_GROUP"; private boolean refresh = false; diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySource.java b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySource.java index a47f8182..0066d17e 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySource.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySource.java @@ -23,6 +23,7 @@ import java.util.Map; /** * @author xiaojing + * @author pbting */ public class NacosPropertySource extends MapPropertySource { @@ -44,17 +45,18 @@ public class NacosPropertySource extends MapPropertySource { /** * Whether to support dynamic refresh for this Property Source */ - private final boolean isRefreshable ; + private final boolean isRefreshable; - NacosPropertySource(String group,String dataId, Map source, Date timestamp,boolean isRefreshable) { + NacosPropertySource(String group, String dataId, Map source, + Date timestamp, boolean isRefreshable) { super(dataId, source); this.group = group; this.dataId = dataId; this.timestamp = timestamp; - this.isRefreshable = isRefreshable ; + this.isRefreshable = isRefreshable; } - public String getGroup(){ + public String getGroup() { return this.group; } @@ -66,7 +68,7 @@ public class NacosPropertySource extends MapPropertySource { return timestamp; } - public boolean isRefreshable(){ + public boolean isRefreshable() { return isRefreshable; } } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceBuilder.java b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceBuilder.java index 93a7440a..589a3bac 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceBuilder.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceBuilder.java @@ -29,6 +29,7 @@ import java.util.*; /** * @author xiaojing + * @author pbting */ public class NacosPropertySourceBuilder { @@ -66,12 +67,14 @@ public class NacosPropertySourceBuilder { * @param dataId Nacos dataId * @param group Nacos group */ - NacosPropertySource build(String dataId, String group, String fileExtension, boolean isRefreshable) { + NacosPropertySource build(String dataId, String group, String fileExtension, + boolean isRefreshable) { Properties p = loadNacosData(dataId, group, fileExtension); if (p == null) { return null; } - return new NacosPropertySource(group,dataId, propertiesToMap(p), new Date(), isRefreshable); + return new NacosPropertySource(group, dataId, propertiesToMap(p), new Date(), + isRefreshable); } private Properties loadNacosData(String dataId, String group, String fileExtension) { diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceLocator.java b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceLocator.java index 598a35e9..a6d69783 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceLocator.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/client/NacosPropertySourceLocator.java @@ -42,7 +42,8 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { private static final String SEP1 = "-"; private static final String DOT = "."; private static final String SHARED_CONFIG_SEPRATOR_CHAR = "[,]"; - private static final List SUPPORT_FILE_EXTENSION = Arrays.asList("properties","yaml","yml"); + private static final List SUPPORT_FILE_EXTENSION = Arrays.asList("properties", + "yaml", "yml"); @Autowired private NacosConfigProperties nacosConfigProperties; @@ -76,7 +77,6 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { CompositePropertySource composite = new CompositePropertySource( NACOS_PROPERTY_SOURCE_NAME); - loadSharedConfiguration(composite); loadExtConfiguration(composite); loadApplicationConfiguration(composite, nacosGroup, dataIdPrefix, fileExtension); @@ -84,47 +84,55 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { return composite; } - private void loadSharedConfiguration(CompositePropertySource compositePropertySource){ + private void loadSharedConfiguration( + CompositePropertySource compositePropertySource) { String sharedDataIds = nacosConfigProperties.getSharedDataids(); String refreshDataIds = nacosConfigProperties.getRefreshableDataids(); - if (sharedDataIds == null || sharedDataIds.trim().length() == 0){ - return ; - } - - String[] sharedDataIdArry = sharedDataIds.split(SHARED_CONFIG_SEPRATOR_CHAR) ; - checkDataIdFileExtension(sharedDataIdArry); - - for (int i =0;i < sharedDataIdArry.length; i++){ - String dataId = sharedDataIdArry[i]; - String fileExtension = dataId.substring(dataId.lastIndexOf(".")+1); - boolean isRefreshable = checkDataIdIsRefreshbable(refreshDataIds,sharedDataIdArry[i]); - - loadNacosDataIfPresent(compositePropertySource,dataId,"DEFAULT_GROUP",fileExtension, isRefreshable); - } - } - - private void loadExtConfiguration(CompositePropertySource compositePropertySource){ - if (nacosConfigProperties.getExtConfig() == null || nacosConfigProperties.getExtConfig().isEmpty()){ + if (sharedDataIds == null || sharedDataIds.trim().length() == 0) { return; } - List extConfigs = nacosConfigProperties.getExtConfig(); + String[] sharedDataIdArry = sharedDataIds.split(SHARED_CONFIG_SEPRATOR_CHAR); + checkDataIdFileExtension(sharedDataIdArry); + + for (int i = 0; i < sharedDataIdArry.length; i++) { + String dataId = sharedDataIdArry[i]; + String fileExtension = dataId.substring(dataId.lastIndexOf(".") + 1); + boolean isRefreshable = checkDataIdIsRefreshbable(refreshDataIds, + sharedDataIdArry[i]); + + loadNacosDataIfPresent(compositePropertySource, dataId, "DEFAULT_GROUP", + fileExtension, isRefreshable); + } + } + + private void loadExtConfiguration(CompositePropertySource compositePropertySource) { + if (nacosConfigProperties.getExtConfig() == null + || nacosConfigProperties.getExtConfig().isEmpty()) { + return; + } + + List extConfigs = nacosConfigProperties + .getExtConfig(); checkExtConfiguration(extConfigs); - for (NacosConfigProperties.Config config : extConfigs){ + for (NacosConfigProperties.Config config : extConfigs) { String dataId = config.getDataId(); - String fileExtension = dataId.substring(dataId.lastIndexOf(".")+1); - loadNacosDataIfPresent(compositePropertySource,dataId,config.getGroup(),fileExtension,config.isRefresh()); + String fileExtension = dataId.substring(dataId.lastIndexOf(".") + 1); + loadNacosDataIfPresent(compositePropertySource, dataId, config.getGroup(), + fileExtension, config.isRefresh()); } } private void checkExtConfiguration(List extConfigs) { String[] dataIds = new String[extConfigs.size()]; - for (int i=0;i 0){ - continue outline; + outline: for (int i = 0; i < sharedDataIdArry.length; i++) { + for (String fileExtension : SUPPORT_FILE_EXTENSION) { + if (sharedDataIdArry[i].indexOf(fileExtension) > 0) { + continue outline; } } - stringBuilder.append(sharedDataIdArry[i]+","); + stringBuilder.append(sharedDataIdArry[i] + ","); } - if (stringBuilder.length() > 0){ - String result = stringBuilder.substring(0,stringBuilder.length()-1); - throw new IllegalStateException(String.format("[%s] must contains file extension with properties|yaml|yml", result)); + if (stringBuilder.length() > 0) { + String result = stringBuilder.substring(0, stringBuilder.length() - 1); + throw new IllegalStateException(String.format( + "[%s] must contains file extension with properties|yaml|yml", + result)); } } - private boolean checkDataIdIsRefreshbable(String refreshDataIds,String sharedDataId){ - if (refreshDataIds == null || "".equals(refreshDataIds)){ - return false ; + private boolean checkDataIdIsRefreshbable(String refreshDataIds, + String sharedDataId) { + if (refreshDataIds == null || "".equals(refreshDataIds)) { + return false; } String[] refreshDataIdArry = refreshDataIds.split(SHARED_CONFIG_SEPRATOR_CHAR); - for (String refreshDataId : refreshDataIdArry){ - if (refreshDataId.equals(sharedDataId)){ - return true ; + for (String refreshDataId : refreshDataIdArry) { + if (refreshDataId.equals(sharedDataId)) { + return true; } } - return false ; + return false; } } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/refresh/NacosContextRefresher.java b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/refresh/NacosContextRefresher.java index 3f8f048e..448f6dd1 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/refresh/NacosContextRefresher.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/org/springframework/cloud/alibaba/nacos/refresh/NacosContextRefresher.java @@ -43,6 +43,7 @@ import java.util.concurrent.Executor; * configurations. * * @author juven.xuxb + * @author pbting */ public class NacosContextRefresher implements ApplicationListener { @@ -60,7 +61,7 @@ public class NacosContextRefresher implements ApplicationListener listenerMap = new ConcurrentHashMap<>(16); + private Map listenerMap = new ConcurrentHashMap<>(16); public NacosContextRefresher(ContextRefresher contextRefresher, NacosConfigProperties properties, NacosRefreshProperties refreshProperties, @@ -84,12 +85,12 @@ public class NacosContextRefresher implements ApplicationListener { - private static final Logger log = LoggerFactory.getLogger(NacosParameterInitListener.class); - @Override - public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) { +public class NacosParameterInitListener + implements ApplicationListener { + private static final Logger log = LoggerFactory + .getLogger(NacosParameterInitListener.class); - preparedNacosConfiguration(); - } + @Override + public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) { - private void preparedNacosConfiguration(){ - EdasChangeOrderConfiguration edasChangeOrderConfiguration = EdasChangeOrderConfigurationFactory - .buildEdasChangeOrderConfiguration(); - log.info("Initialize Nacos Parameter from edas change order,is edas managed {}.",edasChangeOrderConfiguration.isEdasManaged()); - if (!edasChangeOrderConfiguration.isEdasManaged()) { - return ; - } - //initialize nacos configuration - System.getProperties().setProperty("spring.cloud.nacos.config.server-addr",""); - System.getProperties().setProperty("spring.cloud.nacos.config.endpoint", edasChangeOrderConfiguration.getAddressServerDomain()); - System.getProperties().setProperty("spring.cloud.nacos.config.namespace", edasChangeOrderConfiguration.getTenantId()); - System.getProperties().setProperty("spring.cloud.nacos.config.access-key", edasChangeOrderConfiguration.getDauthAccessKey()); - System.getProperties().setProperty("spring.cloud.nacos.config.secret-key", edasChangeOrderConfiguration.getDauthSecretKey()); - } + preparedNacosConfiguration(); + } + + private void preparedNacosConfiguration() { + EdasChangeOrderConfiguration edasChangeOrderConfiguration = EdasChangeOrderConfigurationFactory + .buildEdasChangeOrderConfiguration(); + log.info("Initialize Nacos Parameter from edas change order,is edas managed {}.", + edasChangeOrderConfiguration.isEdasManaged()); + if (!edasChangeOrderConfiguration.isEdasManaged()) { + return; + } + // initialize nacos configuration + System.getProperties().setProperty("spring.cloud.nacos.config.server-addr", ""); + System.getProperties().setProperty("spring.cloud.nacos.config.endpoint", + edasChangeOrderConfiguration.getAddressServerDomain()); + System.getProperties().setProperty("spring.cloud.nacos.config.namespace", + edasChangeOrderConfiguration.getTenantId()); + System.getProperties().setProperty("spring.cloud.nacos.config.access-key", + edasChangeOrderConfiguration.getDauthAccessKey()); + System.getProperties().setProperty("spring.cloud.nacos.config.secret-key", + edasChangeOrderConfiguration.getDauthSecretKey()); + } } \ No newline at end of file