diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/NacosDataSourceWithAuthorization.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/NacosDataSourceWithAuthorization.java
new file mode 100644
index 000000000..6d63c401b
--- /dev/null
+++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/NacosDataSourceWithAuthorization.java
@@ -0,0 +1,135 @@
+/*
+ * 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.alibaba.sentinel.datasource;
+
+import java.util.Properties;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import com.alibaba.csp.sentinel.concurrent.NamedThreadFactory;
+import com.alibaba.csp.sentinel.datasource.AbstractDataSource;
+import com.alibaba.csp.sentinel.datasource.Converter;
+import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
+import com.alibaba.csp.sentinel.log.RecordLog;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import com.alibaba.nacos.api.NacosFactory;
+import com.alibaba.nacos.api.config.ConfigService;
+import com.alibaba.nacos.api.config.listener.Listener;
+
+/**
+ * {@link NacosDataSource} now is not support ak、sk,namespace and endpoint. This class may
+ * be delete when {@link NacosDataSource} support commercialized
+ *
+ * @author Jim
+ */
+public class NacosDataSourceWithAuthorization extends AbstractDataSource {
+
+ private static final int DEFAULT_TIMEOUT = 3000;
+
+ private final ExecutorService pool = new ThreadPoolExecutor(1, 1, 0,
+ TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1),
+ new NamedThreadFactory("sentinel-nacos-auth-ds-update"),
+ new ThreadPoolExecutor.DiscardOldestPolicy());
+
+ private final Listener configListener;
+ private final Properties properties;
+ private final String dataId;
+ private final String groupId;
+
+ private ConfigService configService = null;
+
+ public NacosDataSourceWithAuthorization(final Properties properties,
+ final String groupId, final String dataId, Converter parser) {
+ super(parser);
+ if (StringUtil.isBlank(groupId) || StringUtil.isBlank(dataId)) {
+ throw new IllegalArgumentException(String
+ .format("Bad argument: groupId=[%s], dataId=[%s]", groupId, dataId));
+ }
+ this.groupId = groupId;
+ this.dataId = dataId;
+ this.properties = properties;
+ this.configListener = new Listener() {
+ @Override
+ public Executor getExecutor() {
+ return pool;
+ }
+
+ @Override
+ public void receiveConfigInfo(final String configInfo) {
+ RecordLog.info(String.format(
+ "[NacosDataSourceWithAuthorization] New property value received for %s",
+ properties.toString()));
+ T newValue = NacosDataSourceWithAuthorization.this.parser
+ .convert(configInfo);
+ // Update the new value to the property.
+ getProperty().updateValue(newValue);
+ }
+ };
+ initNacosListener();
+ loadInitialConfig();
+ }
+
+ private void loadInitialConfig() {
+ try {
+ T newValue = loadConfig();
+ if (newValue == null) {
+ RecordLog.warn(
+ "[NacosDataSourceWithAuthorization] WARN: initial config is null, you may have to check your data source");
+ }
+ getProperty().updateValue(newValue);
+ }
+ catch (Exception ex) {
+ RecordLog.warn(
+ "[NacosDataSourceWithAuthorization] Error when loading initial config",
+ ex);
+ }
+ }
+
+ private void initNacosListener() {
+ try {
+ this.configService = NacosFactory.createConfigService(properties);
+ // Add config listener.
+ configService.addListener(dataId, groupId, configListener);
+ }
+ catch (Exception e) {
+ RecordLog.warn(
+ "[NacosDataSourceWithAuthorization] Error occurred when initializing Nacos data source",
+ e);
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public String readSource() throws Exception {
+ if (configService == null) {
+ throw new IllegalStateException(
+ "Nacos config service has not been initialized or error occurred");
+ }
+ return configService.getConfig(dataId, groupId, DEFAULT_TIMEOUT);
+ }
+
+ @Override
+ public void close() {
+ if (configService != null) {
+ configService.removeListener(dataId, groupId, configListener);
+ }
+ pool.shutdownNow();
+ }
+}
diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/SentinelDataSourceConstants.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/SentinelDataSourceConstants.java
index 49549399f..c0b150784 100644
--- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/SentinelDataSourceConstants.java
+++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/SentinelDataSourceConstants.java
@@ -21,13 +21,14 @@ package org.springframework.cloud.alibaba.sentinel.datasource;
*/
public interface SentinelDataSourceConstants {
- String PROPERTY_PREFIX = "spring.cloud.sentinel";
+ String PROPERTY_PREFIX = "spring.cloud.sentinel";
- String PROPERTY_ITEM_SEPARATOR = ".";
+ String NACOS_DATASOURCE_AK = PROPERTY_PREFIX + ".nacos.config.access-key";
- String PROPERTY_DATASOURCE_NAME = "datasource";
+ String NACOS_DATASOURCE_SK = PROPERTY_PREFIX + ".nacos.config.secret-key";
- String PROPERTY_DATASOURCE_PREFIX = PROPERTY_PREFIX + PROPERTY_ITEM_SEPARATOR
- + PROPERTY_DATASOURCE_NAME;
+ String NACOS_DATASOURCE_NAMESPACE = PROPERTY_PREFIX + ".nacos.config.namespace";
+
+ String NACOS_DATASOURCE_ENDPOINT = PROPERTY_PREFIX + ".nacos.config.endpoint";
}
diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/AbstractDataSourceProperties.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/AbstractDataSourceProperties.java
index 6e879b21d..b8843537d 100644
--- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/AbstractDataSourceProperties.java
+++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/AbstractDataSourceProperties.java
@@ -12,7 +12,7 @@ public class AbstractDataSourceProperties {
private String dataType = "json";
private String converterClass;
@JsonIgnore
- private final String factoryBeanName;
+ protected String factoryBeanName;
public AbstractDataSourceProperties(String factoryBeanName) {
this.factoryBeanName = factoryBeanName;
@@ -38,4 +38,12 @@ public class AbstractDataSourceProperties {
return factoryBeanName;
}
+ public void setFactoryBeanName(String factoryBeanName) {
+ this.factoryBeanName = factoryBeanName;
+ }
+
+ public void preCheck() {
+
+ }
+
}
diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/DataSourcePropertiesConfiguration.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/DataSourcePropertiesConfiguration.java
index 16485872f..0e7d47b4a 100644
--- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/DataSourcePropertiesConfiguration.java
+++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/DataSourcePropertiesConfiguration.java
@@ -61,7 +61,7 @@ public class DataSourcePropertiesConfiguration {
}
@JsonIgnore
- public List getInvalidField() {
+ public List getValidField() {
return Arrays.stream(this.getClass().getDeclaredFields()).map(field -> {
try {
if (!ObjectUtils.isEmpty(field.get(this))) {
@@ -76,4 +76,24 @@ public class DataSourcePropertiesConfiguration {
}).filter(Objects::nonNull).collect(Collectors.toList());
}
+ @JsonIgnore
+ public AbstractDataSourceProperties getValidDataSourceProperties() {
+ List invalidFields = getValidField();
+ if (invalidFields.size() == 1) {
+ try {
+ this.getClass().getDeclaredField(invalidFields.get(0))
+ .setAccessible(true);
+ return (AbstractDataSourceProperties) this.getClass()
+ .getDeclaredField(invalidFields.get(0)).get(this);
+ }
+ catch (IllegalAccessException e) {
+ // won't happen
+ }
+ catch (NoSuchFieldException e) {
+ // won't happen
+ }
+ }
+ return null;
+ }
+
}
diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/FileDataSourceProperties.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/FileDataSourceProperties.java
index ab70b8164..d6594c2bc 100644
--- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/FileDataSourceProperties.java
+++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/FileDataSourceProperties.java
@@ -1,6 +1,10 @@
package org.springframework.cloud.alibaba.sentinel.datasource.config;
+import java.io.IOException;
+
import org.springframework.cloud.alibaba.sentinel.datasource.factorybean.FileRefreshableDataSourceFactoryBean;
+import org.springframework.util.ResourceUtils;
+import org.springframework.util.StringUtils;
/**
* File Properties class Using by {@link DataSourcePropertiesConfiguration} and
@@ -50,4 +54,19 @@ public class FileDataSourceProperties extends AbstractDataSourceProperties {
public void setBufSize(int bufSize) {
this.bufSize = bufSize;
}
+
+ @Override
+ public void preCheck() {
+ super.preCheck();
+ try {
+ this.setFile(
+ ResourceUtils.getFile(StringUtils.trimAllWhitespace(this.getFile()))
+ .getAbsolutePath());
+ }
+ catch (IOException e) {
+ throw new RuntimeException("[Sentinel Starter] " + " handle file ["
+ + this.getFile() + "] error: " + e.getMessage(), e);
+ }
+
+ }
}
diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/NacosDataSourceProperties.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/NacosDataSourceProperties.java
index 3448b410f..3ccb65b6d 100644
--- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/NacosDataSourceProperties.java
+++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/config/NacosDataSourceProperties.java
@@ -1,6 +1,9 @@
package org.springframework.cloud.alibaba.sentinel.datasource.config;
+import org.springframework.cloud.alibaba.sentinel.datasource.SentinelDataSourceConstants;
import org.springframework.cloud.alibaba.sentinel.datasource.factorybean.NacosDataSourceFactoryBean;
+import org.springframework.cloud.alibaba.sentinel.datasource.factorybean.NacosDataSourceWithAuthorizationFactoryBean;
+import org.springframework.util.StringUtils;
/**
* Nacos Properties class Using by {@link DataSourcePropertiesConfiguration} and
@@ -14,10 +17,35 @@ public class NacosDataSourceProperties extends AbstractDataSourceProperties {
private String groupId;
private String dataId;
+ // commercialized usage
+
+ private String endpoint;
+ private String namespace;
+ private String accessKey;
+ private String secretKey;
+
public NacosDataSourceProperties() {
super(NacosDataSourceFactoryBean.class.getName());
}
+ @Override
+ public void preCheck() {
+ if (!StringUtils.isEmpty(System.getProperties()
+ .getProperty(SentinelDataSourceConstants.NACOS_DATASOURCE_ENDPOINT))) {
+ this.setServerAddr(null);
+ this.setFactoryBeanName(
+ NacosDataSourceWithAuthorizationFactoryBean.class.getName());
+ this.setEndpoint(System.getProperties()
+ .getProperty(SentinelDataSourceConstants.NACOS_DATASOURCE_ENDPOINT));
+ this.setNamespace(System.getProperties()
+ .getProperty(SentinelDataSourceConstants.NACOS_DATASOURCE_NAMESPACE));
+ this.setAccessKey(System.getProperties()
+ .getProperty(SentinelDataSourceConstants.NACOS_DATASOURCE_AK));
+ this.setSecretKey(System.getProperties()
+ .getProperty(SentinelDataSourceConstants.NACOS_DATASOURCE_SK));
+ }
+ }
+
public String getServerAddr() {
return serverAddr;
}
@@ -41,4 +69,36 @@ public class NacosDataSourceProperties extends AbstractDataSourceProperties {
public void setDataId(String dataId) {
this.dataId = dataId;
}
+
+ public String getEndpoint() {
+ return endpoint;
+ }
+
+ public void setEndpoint(String endpoint) {
+ this.endpoint = endpoint;
+ }
+
+ public String getNamespace() {
+ return namespace;
+ }
+
+ public void setNamespace(String namespace) {
+ this.namespace = namespace;
+ }
+
+ public String getAccessKey() {
+ return accessKey;
+ }
+
+ public void setAccessKey(String accessKey) {
+ this.accessKey = accessKey;
+ }
+
+ public String getSecretKey() {
+ return secretKey;
+ }
+
+ public void setSecretKey(String secretKey) {
+ this.secretKey = secretKey;
+ }
}
diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/factorybean/NacosDataSourceWithAuthorizationFactoryBean.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/factorybean/NacosDataSourceWithAuthorizationFactoryBean.java
new file mode 100644
index 000000000..27f0de868
--- /dev/null
+++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/factorybean/NacosDataSourceWithAuthorizationFactoryBean.java
@@ -0,0 +1,101 @@
+package org.springframework.cloud.alibaba.sentinel.datasource.factorybean;
+
+import java.util.Properties;
+
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.cloud.alibaba.sentinel.datasource.NacosDataSourceWithAuthorization;
+
+import com.alibaba.csp.sentinel.datasource.Converter;
+import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
+import com.alibaba.nacos.api.PropertyKeyConst;
+
+/**
+ * A {@link FactoryBean} for creating {@link NacosDataSource} instance.
+ *
+ * @author Jim
+ * @see NacosDataSource
+ */
+public class NacosDataSourceWithAuthorizationFactoryBean
+ implements FactoryBean {
+
+ private String endpoint;
+ private String namespace;
+ private String accessKey;
+ private String secretKey;
+
+ private String groupId;
+ private String dataId;
+ private Converter converter;
+
+ @Override
+ public NacosDataSourceWithAuthorization getObject() throws Exception {
+ Properties properties = new Properties();
+ properties.put(PropertyKeyConst.ACCESS_KEY, accessKey);
+ properties.put(PropertyKeyConst.SECRET_KEY, secretKey);
+ properties.put(PropertyKeyConst.NAMESPACE, namespace);
+ properties.put(PropertyKeyConst.ENDPOINT, endpoint);
+ return new NacosDataSourceWithAuthorization(properties, groupId, dataId,
+ converter);
+ }
+
+ @Override
+ public Class> getObjectType() {
+ return NacosDataSourceWithAuthorization.class;
+ }
+
+ public String getEndpoint() {
+ return endpoint;
+ }
+
+ public void setEndpoint(String endpoint) {
+ this.endpoint = endpoint;
+ }
+
+ public String getNamespace() {
+ return namespace;
+ }
+
+ public void setNamespace(String namespace) {
+ this.namespace = namespace;
+ }
+
+ public String getAccessKey() {
+ return accessKey;
+ }
+
+ public void setAccessKey(String accessKey) {
+ this.accessKey = accessKey;
+ }
+
+ public String getSecretKey() {
+ return secretKey;
+ }
+
+ public void setSecretKey(String secretKey) {
+ this.secretKey = secretKey;
+ }
+
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+
+ public String getDataId() {
+ return dataId;
+ }
+
+ public void setDataId(String dataId) {
+ this.dataId = dataId;
+ }
+
+ public Converter getConverter() {
+ return converter;
+ }
+
+ public void setConverter(Converter converter) {
+ this.converter = converter;
+ }
+}
diff --git a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelDataSourceHandler.java b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelDataSourceHandler.java
index f93d889d4..88f07db40 100644
--- a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelDataSourceHandler.java
+++ b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelDataSourceHandler.java
@@ -1,6 +1,5 @@
package org.springframework.cloud.alibaba.sentinel.custom;
-import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
@@ -24,7 +23,6 @@ import org.springframework.cloud.alibaba.sentinel.datasource.converter.XmlConver
import org.springframework.context.event.EventListener;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ReflectionUtils;
-import org.springframework.util.ResourceUtils;
import org.springframework.util.StringUtils;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
@@ -77,49 +75,19 @@ public class SentinelDataSourceHandler {
sentinelProperties.getDatasource()
.forEach((dataSourceName, dataSourceProperties) -> {
- if (dataSourceProperties.getInvalidField().size() != 1) {
+ List validFields = dataSourceProperties.getValidField();
+ if (validFields.size() != 1) {
logger.error("[Sentinel Starter] DataSource " + dataSourceName
+ " multi datasource active and won't loaded: "
- + dataSourceProperties.getInvalidField());
+ + dataSourceProperties.getValidField());
return;
}
- Optional.ofNullable(dataSourceProperties.getFile())
- .ifPresent(file -> {
- try {
- dataSourceProperties.getFile().setFile(ResourceUtils
- .getFile(StringUtils.trimAllWhitespace(
- dataSourceProperties.getFile()
- .getFile()))
- .getAbsolutePath());
- }
- catch (IOException e) {
- logger.error("[Sentinel Starter] DataSource "
- + dataSourceName + " handle file error: "
- + e.getMessage());
- throw new RuntimeException(
- "[Sentinel Starter] DataSource "
- + dataSourceName
- + " handle file error: "
- + e.getMessage(),
- e);
- }
- registerBean(beanFactory, file,
- dataSourceName + "-sentinel-file-datasource");
- });
- Optional.ofNullable(dataSourceProperties.getNacos())
- .ifPresent(nacos -> {
- registerBean(beanFactory, nacos,
- dataSourceName + "-sentinel-nacos-datasource");
- });
- Optional.ofNullable(dataSourceProperties.getApollo())
- .ifPresent(apollo -> {
- registerBean(beanFactory, apollo,
- dataSourceName + "-sentinel-apollo-datasource");
- });
- Optional.ofNullable(dataSourceProperties.getZk()).ifPresent(zk -> {
- registerBean(beanFactory, zk,
- dataSourceName + "-sentinel-zk-datasource");
- });
+
+ AbstractDataSourceProperties abstractDataSourceProperties = dataSourceProperties
+ .getValidDataSourceProperties();
+ abstractDataSourceProperties.preCheck();
+ registerBean(beanFactory, abstractDataSourceProperties, dataSourceName
+ + "-sentinel-" + validFields.get(0) + "-datasource");
});
dataSourceBeanNameList.forEach(beanName -> {
@@ -251,7 +219,8 @@ public class SentinelDataSourceHandler {
}
else {
// wired properties
- builder.addPropertyValue(propertyName, propertyValue);
+ Optional.ofNullable(propertyValue)
+ .ifPresent(v -> builder.addPropertyValue(propertyName, v));
}
}
});
diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/Constants.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/Constants.java
new file mode 100644
index 000000000..365c4fb1a
--- /dev/null
+++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/Constants.java
@@ -0,0 +1,32 @@
+/*
+ * 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;
+
+/**
+ * @author Jim
+ */
+public interface Constants {
+
+ interface Sentinel {
+ String PROPERTY_PREFIX = "spring.cloud.sentinel";
+ String NACOS_DATASOURCE_AK = PROPERTY_PREFIX + ".nacos.config.access-key";
+ String NACOS_DATASOURCE_SK = PROPERTY_PREFIX + ".nacos.config.secret-key";
+ String NACOS_DATASOURCE_NAMESPACE = PROPERTY_PREFIX + ".nacos.config.namespace";
+ String NACOS_DATASOURCE_ENDPOINT = PROPERTY_PREFIX + ".nacos.config.endpoint";
+ }
+
+}
diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/sentinel/SentinelAliCloudListener.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/sentinel/SentinelAliCloudListener.java
new file mode 100644
index 000000000..21c13d26d
--- /dev/null
+++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/sentinel/SentinelAliCloudListener.java
@@ -0,0 +1,62 @@
+/*
+ * 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.sentinel;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
+import org.springframework.cloud.alicloud.context.Constants;
+import org.springframework.cloud.alicloud.context.listener.AbstractOnceApplicationListener;
+
+import com.alibaba.cloud.context.edas.EdasChangeOrderConfiguration;
+import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory;
+
+/**
+ * @author Jim
+ */
+public class SentinelAliCloudListener
+ extends AbstractOnceApplicationListener {
+
+ private static final Logger logger = LoggerFactory
+ .getLogger(SentinelAliCloudListener.class);
+
+ @Override
+ protected void handleEvent(ApplicationEnvironmentPreparedEvent event) {
+ EdasChangeOrderConfiguration edasChangeOrderConfiguration = EdasChangeOrderConfigurationFactory
+ .getEdasChangeOrderConfiguration();
+ logger.info("Sentinel Nacos datasource will"
+ + (edasChangeOrderConfiguration.isEdasManaged() ? " be " : " not be ")
+ + "changed by edas change order.");
+ if (!edasChangeOrderConfiguration.isEdasManaged()) {
+ return;
+ }
+ System.getProperties().setProperty(Constants.Sentinel.NACOS_DATASOURCE_ENDPOINT,
+ edasChangeOrderConfiguration.getAddressServerDomain());
+ System.getProperties().setProperty(Constants.Sentinel.NACOS_DATASOURCE_NAMESPACE,
+ edasChangeOrderConfiguration.getTenantId());
+ System.getProperties().setProperty(Constants.Sentinel.NACOS_DATASOURCE_AK,
+ edasChangeOrderConfiguration.getDauthAccessKey());
+ System.getProperties().setProperty(Constants.Sentinel.NACOS_DATASOURCE_SK,
+ edasChangeOrderConfiguration.getDauthSecretKey());
+ }
+
+ @Override
+ protected String conditionalOnClass() {
+ return "com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource";
+ }
+
+}
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 fb9957b36..a14c70778 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
@@ -9,4 +9,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.alicloud.context.statistics.StatisticsTaskStarter
org.springframework.context.ApplicationListener=\
org.springframework.cloud.alicloud.context.ans.AnsContextApplicationListener,\
- org.springframework.cloud.alicloud.context.nacos.NacosParameterInitListener
\ No newline at end of file
+ org.springframework.cloud.alicloud.context.nacos.NacosParameterInitListener,\
+ org.springframework.cloud.alicloud.context.sentinel.SentinelAliCloudListener
\ No newline at end of file