diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml
index ed51123ab..0b45f8065 100644
--- a/spring-cloud-alibaba-dependencies/pom.xml
+++ b/spring-cloud-alibaba-dependencies/pom.xml
@@ -31,6 +31,21 @@
sentinel-datasource-extension
${sentinel.version}
+
+ com.alibaba.csp
+ sentinel-datasource-apollo
+ ${sentinel.version}
+
+
+ com.alibaba.csp
+ sentinel-datasource-zookeeper
+ ${sentinel.version}
+
+
+ com.alibaba.csp
+ sentinel-datasource-nacos
+ ${sentinel.version}
+
com.alibaba.csp
sentinel-web-servlet
@@ -67,6 +82,13 @@
${project.version}
+
+
+ org.springframework.cloud
+ sentinel-dubbo-api
+ ${project.version}
+
+
diff --git a/spring-cloud-alibaba-sentinel-autoconfigure/pom.xml b/spring-cloud-alibaba-sentinel-autoconfigure/pom.xml
index 7b10ee91d..486d320e6 100644
--- a/spring-cloud-alibaba-sentinel-autoconfigure/pom.xml
+++ b/spring-cloud-alibaba-sentinel-autoconfigure/pom.xml
@@ -25,6 +25,29 @@
sentinel-transport-simple-http
+
+ com.alibaba.csp
+ sentinel-datasource-extension
+
+
+
+ com.alibaba.csp
+ sentinel-datasource-nacos
+ true
+
+
+
+ com.alibaba.csp
+ sentinel-datasource-zookeeper
+ true
+
+
+
+ com.alibaba.csp
+ sentinel-datasource-apollo
+ true
+
+
com.alibaba.csp
sentinel-annotation-aspectj
diff --git a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelConstants.java b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelConstants.java
new file mode 100644
index 000000000..747044a50
--- /dev/null
+++ b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelConstants.java
@@ -0,0 +1,33 @@
+/*
+ * 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;
+
+/**
+ * @author fangjian
+ */
+public interface SentinelConstants {
+
+ String PROPERTY_PREFIX = "spring.cloud.sentinel";
+
+ String PROPERTY_ITEM_SEPARATOR = ".";
+
+ String PROPERTY_DATASOURCE_NAME = "datasource";
+
+ String PROPERTY_DATASOURCE_PREFIX = PROPERTY_PREFIX + PROPERTY_ITEM_SEPARATOR
+ + PROPERTY_DATASOURCE_NAME;
+
+}
diff --git a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelProperties.java b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelProperties.java
index 283ea0705..eb1f2be77 100644
--- a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelProperties.java
+++ b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelProperties.java
@@ -26,7 +26,7 @@ import org.springframework.core.Ordered;
* @author xiaojing
* @author hengyunabc
*/
-@ConfigurationProperties(prefix = "spring.cloud.sentinel")
+@ConfigurationProperties(prefix = SentinelConstants.PROPERTY_PREFIX)
public class SentinelProperties {
/**
diff --git a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelWebAutoConfiguration.java b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelWebAutoConfiguration.java
index 0f4fb4fee..f982e8ceb 100644
--- a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelWebAutoConfiguration.java
+++ b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelWebAutoConfiguration.java
@@ -19,59 +19,37 @@ package org.springframework.cloud.alibaba.sentinel;
import java.util.ArrayList;
import java.util.List;
-import javax.annotation.PostConstruct;
import javax.servlet.Filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.util.StringUtils;
import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
-import com.alibaba.csp.sentinel.transport.config.TransportConfig;
/**
* @author xiaojing
*/
@Configuration
+@ConditionalOnWebApplication
@ConditionalOnProperty(name = "spring.cloud.sentinel.enabled", matchIfMissing = true)
@EnableConfigurationProperties(SentinelProperties.class)
public class SentinelWebAutoConfiguration {
+
private static final Logger logger = LoggerFactory
.getLogger(SentinelWebAutoConfiguration.class);
- @Value("${project.name:${spring.application.name:}}")
- private String projectName;
-
@Autowired
private SentinelProperties properties;
- public static final String APP_NAME = "project.name";
-
- @PostConstruct
- private void init() {
- if (StringUtils.isEmpty(System.getProperty(APP_NAME))) {
- System.setProperty(APP_NAME, projectName);
- }
- if (StringUtils.isEmpty(System.getProperty(TransportConfig.SERVER_PORT))) {
- System.setProperty(TransportConfig.SERVER_PORT, properties.getPort());
- }
- if (StringUtils.isEmpty(System.getProperty(TransportConfig.CONSOLE_SERVER))) {
- System.setProperty(TransportConfig.CONSOLE_SERVER, properties.getDashboard());
- }
-
- }
-
@Bean
- @ConditionalOnWebApplication
- public FilterRegistrationBean servletRequestListener() {
+ public FilterRegistrationBean servletRequestListener() {
FilterRegistrationBean registration = new FilterRegistrationBean<>();
SentinelProperties.Filter filterConfig = properties.getFilter();
diff --git a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/annotation/SentinelDataSource.java b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/annotation/SentinelDataSource.java
new file mode 100644
index 000000000..ef09eb0ef
--- /dev/null
+++ b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/annotation/SentinelDataSource.java
@@ -0,0 +1,44 @@
+/*
+ * 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.annotation;
+
+import java.lang.annotation.*;
+
+import org.springframework.core.annotation.AliasFor;
+
+/**
+ * An annotation to inject {@link com.alibaba.csp.sentinel.datasource.DataSource} instance
+ * into a Spring Bean. The Properties of DataSource bean get from config files with
+ * specific prefix.
+ *
+ * @author fangjian
+ * @see com.alibaba.csp.sentinel.datasource.DataSource
+ */
+@Target({ ElementType.FIELD })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface SentinelDataSource {
+
+ @AliasFor("prefix")
+ String value() default "";
+
+ @AliasFor("value")
+ String prefix() default "";
+
+ String name() default ""; // spring bean name
+
+}
diff --git a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java
index 7d2a2e10a..623422926 100644
--- a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java
+++ b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java
@@ -16,20 +16,52 @@
package org.springframework.cloud.alibaba.sentinel.custom;
+import com.alibaba.csp.sentinel.transport.config.TransportConfig;
+import com.alibaba.csp.sentinel.util.AppNameUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.alibaba.sentinel.SentinelProperties;
+import org.springframework.cloud.alibaba.sentinel.datasource.SentinelDataSourcePostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;
+import javax.annotation.PostConstruct;
+
/**
* @author xiaojing
*/
@Configuration
+@ConditionalOnProperty(name = "spring.cloud.sentinel.enabled", matchIfMissing = true)
+@EnableConfigurationProperties(SentinelProperties.class)
public class SentinelAutoConfiguration {
+ @Value("${project.name:${spring.application.name:}}")
+ private String projectName;
+
+ @Autowired
+ private SentinelProperties properties;
+
+ @PostConstruct
+ private void init() {
+ if (StringUtils.isEmpty(System.getProperty(AppNameUtil.APP_NAME))) {
+ System.setProperty(AppNameUtil.APP_NAME, projectName);
+ }
+ if (StringUtils.isEmpty(System.getProperty(TransportConfig.SERVER_PORT))) {
+ System.setProperty(TransportConfig.SERVER_PORT, properties.getPort());
+ }
+ if (StringUtils.isEmpty(System.getProperty(TransportConfig.CONSOLE_SERVER))) {
+ System.setProperty(TransportConfig.CONSOLE_SERVER, properties.getDashboard());
+ }
+ }
+
@Bean
@ConditionalOnMissingBean
public SentinelResourceAspect sentinelResourceAspect() {
@@ -38,9 +70,15 @@ public class SentinelAutoConfiguration {
@Bean
@ConditionalOnMissingBean
- @ConditionalOnClass(value = RestTemplate.class)
+ @ConditionalOnClass(name = "org.springframework.web.client.RestTemplate")
public SentinelBeanPostProcessor sentinelBeanPostProcessor() {
return new SentinelBeanPostProcessor();
}
+ @Bean
+ @ConditionalOnMissingBean
+ public SentinelDataSourcePostProcessor sentinelDataSourcePostProcessor() {
+ return new SentinelDataSourcePostProcessor();
+ }
+
}
diff --git a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelProtectInterceptor.java b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelProtectInterceptor.java
index 2d2c9ba45..844a5416f 100644
--- a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelProtectInterceptor.java
+++ b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelProtectInterceptor.java
@@ -43,7 +43,7 @@ import com.alibaba.csp.sentinel.util.StringUtil;
*/
public class SentinelProtectInterceptor implements ClientHttpRequestInterceptor {
- private static final Logger LOGGER = LoggerFactory
+ private static final Logger logger = LoggerFactory
.getLogger(SentinelProtectInterceptor.class);
private SentinelProtect sentinelProtect;
@@ -68,12 +68,12 @@ public class SentinelProtectInterceptor implements ClientHttpRequestInterceptor
response = execution.execute(request, body);
}
catch (BlockException e) {
- LOGGER.error("RestTemplate block", e);
+ logger.error("RestTemplate block", e);
try {
handleBlockException(e);
}
catch (Exception ex) {
- LOGGER.error("sentinel handle BlockException error.", e);
+ logger.error("sentinel handle BlockException error.", e);
}
}
finally {
diff --git a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/DataSourceLoader.java b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/DataSourceLoader.java
new file mode 100644
index 000000000..7ac89dfc9
--- /dev/null
+++ b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/datasource/DataSourceLoader.java
@@ -0,0 +1,151 @@
+/*
+ * 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 static org.springframework.core.io.support.ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.PropertiesLoaderUtils;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
+
+import com.alibaba.csp.sentinel.datasource.DataSource;
+
+/**
+ * {@link DataSource} Loader
+ *
+ * @author fangjian
+ */
+public class DataSourceLoader {
+
+ private static final Logger logger = LoggerFactory.getLogger(DataSourceLoader.class);
+
+ private final static String PROPERTIES_RESOURCE_LOCATION = "META-INF/sentinel-datasource.properties";
+
+ private final static String ALL_PROPERTIES_RESOURCES_LOCATION = CLASSPATH_ALL_URL_PREFIX
+ + PROPERTIES_RESOURCE_LOCATION;
+
+ private final static ConcurrentMap> dataSourceClassesCache = new ConcurrentHashMap>(
+ 4);
+
+ static void loadAllDataSourceClassesCache() {
+ Map> dataSourceClassesMap = loadAllDataSourceClassesCache(
+ ALL_PROPERTIES_RESOURCES_LOCATION);
+
+ dataSourceClassesCache.putAll(dataSourceClassesMap);
+ }
+
+ static Map> loadAllDataSourceClassesCache(
+ String resourcesLocation) {
+
+ Map> dataSourcesMap = new HashMap>(
+ 4);
+
+ ClassLoader classLoader = DataSourceLoader.class.getClassLoader();
+
+ ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+
+ try {
+
+ Resource[] resources = resolver.getResources(resourcesLocation);
+
+ for (Resource resource : resources) {
+ if (resource.exists()) {
+ Properties properties = PropertiesLoaderUtils
+ .loadProperties(resource);
+ for (Map.Entry
+
+ com.alibaba.csp
+ sentinel-datasource-nacos
+
+
+ com.alibaba.csp
+ sentinel-datasource-zookeeper
+
+
+ com.alibaba.csp
+ sentinel-datasource-apollo
+