From ed598ba427036351027eaad55543e2968dcdcbb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A5=81=E6=99=93=E6=B3=A2?= Date: Fri, 22 Nov 2019 17:49:26 +0800 Subject: [PATCH 1/4] add some warnings for classpath file datasource You could use absolute path when you use File datasource & fat jar. --- .../sentinel-core-example/readme.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md index 8cc2f53e..01fcf7b2 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md @@ -193,6 +193,18 @@ Now ReadableDataSource type support 5 categories: `file`, `nacos`, `zk`, `apollo If you want to use `nacos`, `zk`, `apollo` or `redis` ReadableDataSource, you could add `sentinel-datasource-nacos`, `sentinel-datasource-zookeeper`,`sentinel-datasource-apollo` or `sentinel-datasource-redis` dependency. +## warning +You should use `file` ReadableDataSource in a fatjar carefully or you may get error like this below + +``` +java.lang.RuntimeException: [Sentinel Starter] DataSource ds1 handle file [classpath: flowrule.json] error: class path resource [flowrule.json] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:xxx/xxx.jar!/BOOT-INF/classes!/flowrule.jso +``` +You could use absolute path when you use File datasource & fat jar. +It is recommended to use Nacos/Apollo/Zookeeper/Redis datasource to store rules. +https://github.com/alibaba/spring-cloud-alibaba/issues/428 + + + When ReadableDataSource load rule data successfully, console will print some logs: ``` @@ -203,4 +215,4 @@ When ReadableDataSource load rule data successfully, console will print some log ## More For more information about Sentinel, see [Sentinel Project](https://github.com/alibaba/Sentinel). -If you have any ideas or suggestions for Spring Cloud Sentinel starter, please don't hesitate to tell us by submitting github issues. \ No newline at end of file +If you have any ideas or suggestions for Spring Cloud Sentinel starter, please don't hesitate to tell us by submitting github issues. From 460daaf1d8976743971bd4dc6036fb06182fa96e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A5=81=E6=99=93=E6=B3=A2?= Date: Fri, 22 Nov 2019 17:58:45 +0800 Subject: [PATCH 2/4] Update readme.md --- .../sentinel-core-example/readme.md | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md index 01fcf7b2..1856a4a0 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md @@ -193,16 +193,6 @@ Now ReadableDataSource type support 5 categories: `file`, `nacos`, `zk`, `apollo If you want to use `nacos`, `zk`, `apollo` or `redis` ReadableDataSource, you could add `sentinel-datasource-nacos`, `sentinel-datasource-zookeeper`,`sentinel-datasource-apollo` or `sentinel-datasource-redis` dependency. -## warning -You should use `file` ReadableDataSource in a fatjar carefully or you may get error like this below - -``` -java.lang.RuntimeException: [Sentinel Starter] DataSource ds1 handle file [classpath: flowrule.json] error: class path resource [flowrule.json] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:xxx/xxx.jar!/BOOT-INF/classes!/flowrule.jso -``` -You could use absolute path when you use File datasource & fat jar. -It is recommended to use Nacos/Apollo/Zookeeper/Redis datasource to store rules. -https://github.com/alibaba/spring-cloud-alibaba/issues/428 - When ReadableDataSource load rule data successfully, console will print some logs: @@ -211,6 +201,17 @@ When ReadableDataSource load rule data successfully, console will print some log [Sentinel Starter] DataSource ds1-sentinel-file-datasource load 3 DegradeRule [Sentinel Starter] DataSource ds2-sentinel-nacos-datasource load 2 FlowRule ``` +## Warning +You should use `file` ReadableDataSource in a fatjar carefully or you may get error like this below + +``` +java.lang.RuntimeException: [Sentinel Starter] DataSource ds1 handle file [classpath: flowrule.json] error: class path resource [flowrule.json] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:xxx/xxx.jar!/BOOT-INF/classes!/flowrule.jso +``` + +You could use absolute path when you use File datasource & fat jar. +It is recommended to use Nacos/Apollo/Zookeeper/Redis datasource to store rules. + +https://github.com/alibaba/spring-cloud-alibaba/issues/428 ## More For more information about Sentinel, see [Sentinel Project](https://github.com/alibaba/Sentinel). From 859753976be7b742d65e3bab7bf68f3c017596a4 Mon Sep 17 00:00:00 2001 From: luhggit <342521162@qq.com> Date: Wed, 27 Nov 2019 18:29:27 +0800 Subject: [PATCH 3/4] Fixes #1156, handle the scenario where the registed bean name is null --- .../cloud/sentinel/custom/SentinelBeanPostProcessor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelBeanPostProcessor.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelBeanPostProcessor.java index 0a0fcd23..79eff6ce 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelBeanPostProcessor.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelBeanPostProcessor.java @@ -66,7 +66,7 @@ public class SentinelBeanPostProcessor implements MergedBeanDefinitionPostProces @Override public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName) { - if (checkSentinelProtect(beanDefinition, beanType)) { + if (checkSentinelProtect(beanDefinition, beanType, beanName)) { SentinelRestTemplate sentinelRestTemplate; if (beanDefinition.getSource() instanceof StandardMethodMetadata) { sentinelRestTemplate = ((StandardMethodMetadata) beanDefinition @@ -166,8 +166,8 @@ public class SentinelBeanPostProcessor implements MergedBeanDefinitionPostProces } private boolean checkSentinelProtect(RootBeanDefinition beanDefinition, - Class beanType) { - return beanType == RestTemplate.class + Class beanType, String beanName) { + return beanName != null && beanType == RestTemplate.class && checkMethodMetadataReadingVisitor(beanDefinition); } @@ -180,7 +180,7 @@ public class SentinelBeanPostProcessor implements MergedBeanDefinitionPostProces @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - if (cache.containsKey(beanName)) { + if (beanName != null && cache.containsKey(beanName)) { // add interceptor for each RestTemplate with @SentinelRestTemplate annotation StringBuilder interceptorBeanNamePrefix = new StringBuilder(); SentinelRestTemplate sentinelRestTemplate = cache.get(beanName); From cef87972d70c62329911880a31b83edb12c3c6f9 Mon Sep 17 00:00:00 2001 From: fangjian0423 Date: Sun, 1 Dec 2019 17:13:21 +0800 Subject: [PATCH 4/4] do some refactor --- .../java/com/alibaba/cloud/nacos/NacosConfigProperties.java | 5 +++-- .../alibaba/cloud/nacos/parser/AbstractNacosDataParser.java | 4 ++-- .../com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java | 3 ++- .../com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java | 3 ++- .../com/alibaba/cloud/nacos/NacosDiscoveryProperties.java | 1 - 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigProperties.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigProperties.java index cd7461e4..0478ac88 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigProperties.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigProperties.java @@ -22,6 +22,7 @@ import java.util.Properties; import javax.annotation.PostConstruct; +import com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureException; import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.exception.NacosException; @@ -367,8 +368,8 @@ public class NacosConfigProperties { .createConfigService(getConfigServiceProperties()); } catch (NacosException e) { - log.error("create naming service error!properties={},e=,", this, e); - return null; + throw new NacosConnectionFailureException(this.getServerAddr(), + e.getMessage(), e); } } return configService; diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractNacosDataParser.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractNacosDataParser.java index 5f83c0b2..38896118 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractNacosDataParser.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractNacosDataParser.java @@ -21,7 +21,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Properties; -import com.alibaba.nacos.client.utils.StringUtils; +import org.springframework.util.StringUtils; /** * @author zkz @@ -118,7 +118,7 @@ public abstract class AbstractNacosDataParser { Properties properties = new Properties(); for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); - if (StringUtils.isBlank(key)) { + if (StringUtils.isEmpty(key)) { continue; } key = key.startsWith(DOT) ? key.replaceFirst("\\.", "") : key; diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java index 89137992..437661a3 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java @@ -22,10 +22,11 @@ import java.util.Iterator; import java.util.Map; import java.util.Properties; -import com.alibaba.nacos.client.utils.StringUtils; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.util.StringUtils; + /** * @author zkz */ diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java index 5e298718..8a43ad9c 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java @@ -25,13 +25,14 @@ import java.util.Properties; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; -import com.alibaba.nacos.client.utils.StringUtils; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; +import org.springframework.util.StringUtils; + /** * With relatively few usage scenarios, only simple parsing is performed to reduce jar * dependencies. diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java index 1b2488d7..7e419ec6 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java @@ -465,7 +465,6 @@ public class NacosDiscoveryProperties { } } - @Deprecated public NamingService namingServiceInstance() { if (null != namingService) {