diff --git a/.circleci/config.yml b/.circleci/config.yml index 3f260a24..3beeaa62 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,7 +24,7 @@ jobs: - ~/.m2 - run: name: "Running build" - command: ./mvnw -Pdocs clean install -U -nsu --batch-mode -Dmaven.test.redirectTestOutputToFile=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -Dgpg.skip + command: ./mvnw clean install -U -nsu --batch-mode -Dmaven.test.redirectTestOutputToFile=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -Dgpg.skip - run: name: "Aggregate test results" when: always diff --git a/.gitignore b/.gitignore index 15395b04..e4b59732 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,11 @@ target .DS_Store .flattened-pom.xml +# temp ignore +*.cache +*.diff +*.patch +*.tmp + +# Maven ignore +.flattened-pom.xml diff --git a/.mvn/maven.config b/.mvn/maven.config index 3b8cf46e..e69de29b 100644 --- a/.mvn/maven.config +++ b/.mvn/maven.config @@ -1 +0,0 @@ --DaltSnapshotDeploymentRepository=repo.spring.io::default::https://repo.spring.io/libs-snapshot-local -P spring diff --git a/README-zh.md b/README-zh.md index 7d09c536..dd96ca7b 100644 --- a/README-zh.md +++ b/README-zh.md @@ -39,8 +39,6 @@ Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。 **[Seata](https://github.com/seata/seata)**:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。 -**[Alibaba Cloud ACM](https://www.aliyun.com/product/acm)**:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。 - **[Alibaba Cloud OSS](https://www.aliyun.com/product/oss)**: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。 **[Alibaba Cloud SchedulerX](https://help.aliyun.com/document_detail/43136.html)**: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。 @@ -72,7 +70,7 @@ Spring Cloud 使用 Maven 来构建,最快的使用方式是将本项目 clone com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.1.0.RELEASE + 2.1.4.RELEASE pom import @@ -97,13 +95,11 @@ Example 列表: [Seata Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/seata-example/readme-zh.md) -[Alibaba Cloud OSS Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/oss-example/readme-zh.md) +[Alibaba Cloud OSS Example](https://github.com/alibaba/aliyun-spring-boot/tree/master/aliyun-spring-boot-samples/aliyun-oss-spring-boot-sample) -[Alibaba Cloud ANS Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/ans-example/ans-provider-example/readme-zh.md) +[Alibaba Cloud SMS Example](https://github.com/alibaba/aliyun-spring-boot/tree/master/aliyun-spring-boot-samples/aliyun-sms-spring-boot-sample) -[Alibaba Cloud ACM Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/acm-example/acm-local-example/readme-zh.md) - -[Alibaba Cloud SchedulerX Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/readme-zh.md) +[Alibaba Cloud SchedulerX Example](https://github.com/alibaba/aliyun-spring-boot) ## 版本管理规范 @@ -114,6 +110,7 @@ Example 列表: * 1.5.x 版本适用于 Spring Boot 1.5.x * 2.0.x 版本适用于 Spring Boot 2.0.x * 2.1.x 版本适用于 Spring Boot 2.1.x +* 2.2.x 版本适用于 Spring Boot 2.2.x ## 社区交流 @@ -124,7 +121,9 @@ spring-cloud-alibaba@googlegroups.com,欢迎通过此邮件列表讨论与 spr ### 钉钉群 -![DingQR](https://img.alicdn.com/tfs/TB1zrRie4v1gK0jSZFFXXb0sXXa-7862-3570.png) +![DingQR](https://img.alicdn.com/tfs/TB1jXikzAL0gK0jSZFtXXXQCXXa-1002-323.png) + +如图片有问题,访问 https://img.alicdn.com/tfs/TB1jXikzAL0gK0jSZFtXXXQCXXa-1002-323.png ## 社区相关开源 diff --git a/README.md b/README.md index 6f69e3dc..af71f00c 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ For more features, please refer to [Roadmap](https://github.com/alibaba/spring-c **[Alibaba Cloud SMS](https://www.aliyun.com/product/sms)**: A messaging service that covers the globe, Alibaba SMS provides convenient, efficient, and intelligent communication capabilities that help businesses quickly contact their customers. -**[Alibaba Cloud SchedulerX](https://www.aliyun.com/product/SchedulerX)**:accurate, highly reliable, and highly available scheduled job scheduling services with response time within seconds.. +**[Alibaba Cloud SchedulerX](https://www.aliyun.com/aliware/schedulerx?spm=5176.10695662.784137.1.4b07363dej23L3)**:accurate, highly reliable, and highly available scheduled job scheduling services with response time within seconds.. For more features please refer to [Roadmap](https://github.com/alibaba/spring-cloud-alibaba/blob/master/Roadmap.md). @@ -71,7 +71,7 @@ These artifacts are available from Maven Central and Spring Release repository v com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.1.0.RELEASE + 2.2.4.RELEASE pom import @@ -89,8 +89,6 @@ add the module in `dependencies`. [Nacos Discovery](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-discovery.adoc) -[ACM](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/acm.adoc) - ## Examples @@ -106,9 +104,9 @@ Examples: [RocketMQ Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/rocketmq-example/readme.md) -[Alibaba Cloud OSS Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/oss-example/readme.md) +[Alibaba Cloud OSS Example](https://github.com/alibaba/aliyun-spring-boot/tree/master/aliyun-spring-boot-samples/aliyun-oss-spring-boot-sample) -[Duboo Spring Cloud Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/README_CN.md) +[Dubbo Spring Cloud Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/README_CN.md) ## Version control guidelines The version number of the project is in the form of x.x.x, where x is a number, starting from 0, and is not limited to the range 0~9. When the project is in the incubator phase, the version number is 0.x.x. @@ -118,6 +116,7 @@ As the interfaces and annotations of Spring Boot 1 and Spring Boot 2 have been c * 1.5.x for Spring Boot 1.5.x * 2.0.x for Spring Boot 2.0.x * 2.1.x for Spring Boot 2.1.x +* 2.2.x for Spring Boot 2.2.x ## Code of Conduct This project is a sub-project of Spring Cloud, it adheres to the Contributor Covenant [code of conduct](https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc). By participating, you are expected to uphold this code. Please report unacceptable behavior to spring-code-of-conduct@pivotal.io. diff --git a/mvnw b/mvnw index 84073fa2..761189a9 100755 --- a/mvnw +++ b/mvnw @@ -249,5 +249,6 @@ fi exec "$JAVACMD" \ $MAVEN_OPTS \ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Drevision=${VERSION}" \ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ ${WRAPPER_LAUNCHER} ${MAVEN_ARGS} "$@" \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8f5af7ff..08791cb4 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ - 2.1.3.RELEASE + 2.1.4.RELEASE 2.1.6.RELEASE @@ -98,7 +98,7 @@ 1.7.25 - 2.7.6 + 2.7.8 4.0.1 @@ -108,12 +108,12 @@ 3.7.0 2.8.2 2.21.0 - 1.6 - 0.8.3 2.2.1 3.1.1 1.6 1.1.0 + 1.6 + 0.8.3 @@ -349,6 +349,31 @@ false + + org.codehaus.mojo + flatten-maven-plugin + ${flatten-maven-plugin.version} + + true + resolveCiFriendliesOnly + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + @@ -362,69 +387,6 @@ - - - spring - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/libs-snapshot-local - - true - - - false - - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone-local - - false - - - - spring-releases - Spring Releases - https://repo.spring.io/release - - false - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/libs-snapshot-local - - true - - - false - - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone-local - - false - - - - spring-releases - Spring Releases - https://repo.spring.io/libs-release-local - - false - - - - - release @@ -469,32 +431,6 @@ - - - org.codehaus.mojo - flatten-maven-plugin - ${flatten-maven-plugin.version} - - true - resolveCiFriendliesOnly - - - - flatten - process-resources - - flatten - - - - flatten.clean - clean - - clean - - - - @@ -511,9 +447,6 @@ - - - \ No newline at end of file diff --git a/spring-cloud-alibaba-coverage/pom.xml b/spring-cloud-alibaba-coverage/pom.xml index d854a71a..5f6a520e 100644 --- a/spring-cloud-alibaba-coverage/pom.xml +++ b/spring-cloud-alibaba-coverage/pom.xml @@ -19,60 +19,60 @@ com.alibaba.cloud spring-cloud-alibaba-sentinel-datasource - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-alibaba-sentinel - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-alibaba-seata - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config-server - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-stream-rocketmq - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-bus-rocketmq - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-alibaba-sidecar - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-dubbo - ${project.version} + ${revision} diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index ad5887bb..d2f1c022 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -19,11 +19,11 @@ - 2.1.3.RELEASE + 2.1.4.RELEASE 1.8.0 1.3.0 - 1.3.3 + 1.4.1 0.8.0 1.0.10 @@ -185,67 +185,74 @@ com.alibaba.cloud spring-cloud-alibaba-sentinel-datasource - ${project.version} + ${revision} + com.alibaba.cloud spring-cloud-alibaba-sentinel-gateway - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-alibaba-sentinel - ${project.version} + ${revision} + + + + com.alibaba.cloud + spring-cloud-circuitbreaker-sentinel + ${revision} com.alibaba.cloud spring-cloud-starter-alibaba-seata - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config-server - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-stream-rocketmq - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-bus-rocketmq - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-alibaba-sidecar - ${project.version} + ${revision} com.alibaba.cloud spring-cloud-starter-dubbo - ${project.version} + ${revision} @@ -260,69 +267,6 @@ - - - spring - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/libs-snapshot-local - - true - - - false - - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone-local - - false - - - - spring-releases - Spring Releases - https://repo.spring.io/release - - false - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/libs-snapshot-local - - true - - - false - - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone-local - - false - - - - spring-releases - Spring Releases - https://repo.spring.io/libs-release-local - - false - - - - - release @@ -409,5 +353,6 @@ + diff --git a/spring-cloud-alibaba-docs/pom.xml b/spring-cloud-alibaba-docs/pom.xml index 8fa73ba7..1c03ca68 100644 --- a/spring-cloud-alibaba-docs/pom.xml +++ b/spring-cloud-alibaba-docs/pom.xml @@ -6,7 +6,9 @@ com.alibaba.cloud spring-cloud-alibaba ${revision} + ../pom.xml + 4.0.0 spring-cloud-alibaba-docs diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/dependency-management.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/dependency-management.adoc index 0528f3c8..627b6e64 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/dependency-management.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/dependency-management.adoc @@ -10,7 +10,7 @@ Spring Cloud Alibaba BOM 包含了它所使用的所有依赖的版本。 com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.1.3.RELEASE + 2.1.4.RELEASE pom import diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc index 4827d751..4f7de312 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc @@ -229,7 +229,7 @@ in develop-env enviroment; user name :nacos-config-yaml-update; age: 68 spring.profiles.active=product ---- -同时生产环境上 Nacos 需要添加对应 DataId 的基础配置。例如,在生成环境下的 Naocs 添加了DataId为:nacos-config-product.yaml的配置: +同时生产环境上 Nacos 需要添加对应 DataId 的基础配置。例如,在生产环境下的 Naocs 添加了DataId为:nacos-config-product.yaml的配置: [source,subs="normal"] ---- @@ -415,8 +415,8 @@ Endpoint 暴露的 json 中包含了三种属性: |=== |配置项 |Key |默认值 |说明 |服务端地址|`spring.cloud.nacos.config.server-addr`|| Nacos Server 启动监听的ip地址和端口 -|配置对应的 DataId|`spring.cloud.nacos.config.name`|| 先取 prefix,再去 name,最后取 spring.application.name -|配置对应的 DataId|`spring.cloud.nacos.config.prefix`|| 先取 prefix,再去 name,最后取 spring.application.name +|配置对应的 DataId|`spring.cloud.nacos.config.name`|| 先取 prefix,再取 name,最后取 spring.application.name +|配置对应的 DataId|`spring.cloud.nacos.config.prefix`|| 先取 prefix,再取 name,最后取 spring.application.name |配置内容编码|`spring.cloud.nacos.config.encode`||读取的配置内容对应的编码 |GROUP|`spring.cloud.nacos.config.group`|`DEFAULT_GROUP`|配置对应的组 |文件扩展名|`spring.cloud.nacos.config.fileExtension`|`properties`|配置项对应的文件扩展名,目前支持 properties 和 yaml(yml) diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sidecar.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sidecar.adoc index 74ad66ce..2a8832f5 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sidecar.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sidecar.adoc @@ -1,10 +1,11 @@ == Spring Cloud Alibaba Sidecar -`Spring Cloud Alibaba Sidecar` 是一个用来快速**完美整合** Spring Cloud 与 *异构微服务* 的框架,灵感来自 -https://github.com/spring-cloud/spring-cloud-netflix/tree/master/spring-cloud-netflix-sidecar[Spring Cloud Netflix Sidecar] 。目前支持的服务发现组件: +`Spring Cloud Alibaba Sidecar` 是一个用来快速**完美整合** Spring Cloud +与 *异构微服务* 的框架,灵感来自 +https://github.com/spring-cloud/spring-cloud-netflix/tree/master/spring-cloud-netflix-sidecar[Spring +Cloud Netflix Sidecar] 。目前支持的服务发现组件: * Nacos - * Consul === 术语 @@ -25,26 +26,42 @@ https://github.com/spring-cloud/spring-cloud-netflix/tree/master/spring-cloud-ne 原因有两点: -* Spring Cloud子项目 `Spring Cloud Netflix Sidecar` 是可以快速整合异构微服务的。然而,Sidecar只支持使用Eureka作为服务发现,*如果使用其他服务发现组件就抓瞎了*。 -* *Sidecar是基于Zuul 1.x的*,Spring Cloud官方明确声明,未来将会逐步淘汰Zuul。今年早些时候,我有给Spring Cloud官方提出需求,希望官方实现一个基于Spring Cloud Gateway的新一代Sidecar,然而官方表示并没有该计划。详见:https://github.com/spring-cloud/spring-cloud-gateway/issues/735 +* Spring Cloud子项目 `Spring Cloud Netflix Sidecar` +是可以快速整合异构微服务的。然而,Sidecar只支持使用Eureka作为服务发现,*如果使用其他服务发现组件就抓瞎了*。 +* *Sidecar是基于Zuul 1.x的*,Spring +Cloud官方明确声明,未来将会逐步淘汰Zuul。今年早些时候,我有给Spring +Cloud官方提出需求,希望官方实现一个基于Spring Cloud +Gateway的新一代Sidecar,然而官方表示并没有该计划。详见:https://github.com/spring-cloud/spring-cloud-gateway/issues/735 既然没有,索性自己写了。 ==== 为什么不用Service Mesh? -* 目前Mesh主要使用场景在Kubernetes领域(Istio、Linkerd)等,大多将Kubernetes作为First Class支持,虽然Istio也可部署在非Kubernetes环境),而目前业界,Spring Cloud应用未必有试试Mesh的环境; -* 使用Alibaba Sidecar一个小组件就能解决问题了(核心代码不超过200行),引入整套Mesh方案,颇有点屠龙刀杀黄鳝的意思。 +* 目前Mesh主要使用场景在Kubernetes领域(Istio、Linkerd +2等,大多将Kubernetes作为First +Class支持,虽然Istio也可部署在非Kubernetes环境),而目前业界,Spring +Cloud应用未必有试试Mesh的环境; +* 使用Alibaba +Sidecar一个小组件就能解决问题了(核心代码不超过200行),引入整套Mesh方案,颇有点屠龙刀杀黄鳝的意思。 === 原理 * Alibaba -Sidecar根据配置的异构微服务的IP、端口等信息,*将异构微服务的IP/端口注册到服务发现组件上*。 -* Alibaba Sidecar实现了 *健康检查* ,Alibaba Sidecar会定时检测异构微服务是否健康。如果发现异构微服务不健康,Alibaba Sidecar会自动将代表异构微服务的Alibaba Sidecar实例下线;如果异构微服务恢复正常,则会自动上线。最长延迟是30秒,详见 `Alibaba SidecarChecker#check` 。 +Sidecar根据配置的异构微服务的IP、端口等信息,*将异构微服务的IP/端口注册到服务发现组件上* +。 +* Alibaba Sidecar实现了 *健康检查* ,Alibaba +Sidecar会定时检测异构微服务是否健康。如果发现异构微服务不健康,Alibaba +Sidecar会自动将代表异构微服务的Alibaba +Sidecar实例下线;如果异构微服务恢复正常,则会自动上线。最长延迟是30秒,详见 +`Alibaba SidecarChecker#check` 。 === 要求 -* 【必须】你的异构微服务需使用HTTP通信。这一点严格来说不算要求,因为Spring Cloud本身就是基于HTTP的; -* 【可选】如果微服务配置了 `sidecar.health-check-url`,则表示开启健康检查,此时,你的异构微服务需实现健康检查(可以是空实现,只要暴露一个端点,返回类似 `{"status": "UP"}` 的字符串即可)。 +* 【必须】你的异构微服务需使用HTTP通信。这一点严格来说不算要求,因为Spring +Cloud本身就是基于HTTP的; +* 【可选】如果微服务配置了 `sidecar.health-check-url` +,则表示开启健康检查,此时,你的异构微服务需实现健康检查(可以是空实现,只要暴露一个端点,返回类似 +`{"status": "UP"}` 的字符串即可)。 === 使用示例 @@ -92,7 +109,8 @@ endpoint: show-details: always ---- + -配置比较简单,就是把Alibaba Sidecar注册到Nacos上,然后添加了几行Alibaba Sidecar的配置。 +配置比较简单,就是把Alibaba Sidecar注册到Nacos上,然后添加了几行Alibaba +Sidecar的配置。 ==== 异构微服务 @@ -132,13 +150,16 @@ server.listen(8060, function() { ===== 测试1:Spring Cloud微服务完美调用异构微服务 -为你的Spring Cloud微服务整合Ribbon,然后构建 `http://node-service/\\**`,就可以请求到异构微服务的 `/**` 了。 +为你的Spring Cloud微服务整合Ribbon,然后构建 `http://node-service/**` +,就可以请求到异构微服务的 `/**` 了。 示例: -Ribbon请求 `http://node-service/` 会请求到 `http://localhost:8060/`,以此类推。 +Ribbon请求 `http://node-service/` 会请求到 `http://localhost:8060/` +,以此类推。 -至于断路器,正常为你的Spring Cloud微服务整合Sentinel或者Hystirx、Resilience4J即可 。 +至于断路器,正常为你的Spring +Cloud微服务整合Sentinel或者Hystirx、Resilience4J即可 。 ===== 测试2:异构微服务完美调用Spring Cloud微服务 @@ -146,13 +167,18 @@ Ribbon请求 `http://node-service/` 会请求到 `http://localhost:8060/`,以 示例: -如果你有一个Spring Cloud微服务叫做 `spring-cloud-microservice`,那么NodeJS应用只需构建 `http://localhost:8070/spring-cloud-microservice/\\**` ,Alibaba Sidecar就会把请求转发到 `spring-cloud-microservice` 的 `/**` 。 +如果你有一个Spring Cloud微服务叫做 `spring-cloud-microservice` +,那么NodeJS应用只需构建 +`http://localhost:8070/spring-cloud-microservice/**` ,Alibaba +Sidecar就会把请求转发到 `spring-cloud-microservice` 的 `/**` 。 -而Spring Cloud Gateway是整合了Ribbon的,所以实现了负载均衡;Spring Cloud Gateway还可以整合Sentinel或者Hystirx、Resilience4J,所以也带有了断路器。 +而Spring Cloud Gateway是整合了Ribbon的,所以实现了负载均衡;Spring Cloud +Gateway还可以整合Sentinel或者Hystirx、Resilience4J,所以也带有了断路器。 === Alibaba Sidecar优缺点分析 -Alibaba Sidecar的设计和Sidecar基本一致,优缺点和Sidecar的优缺点也是一样的。 +Alibaba +Sidecar的设计和Sidecar基本一致,优缺点和Sidecar的优缺点也是一样的。 优点: @@ -161,5 +187,8 @@ Alibaba Sidecar的设计和Sidecar基本一致,优缺点和Sidecar的优缺点 缺点: -* 每接入一个异构微服务实例,都需要额外部署一个Alibaba Sidecar实例,增加了部署成本(虽然这个成本在Kubernetes环境中几乎可以忽略不计(只需将Alibaba Sidecar实例和异构微服务作为一个Pod部署即可)); -* 异构微服务调用Spring Cloud微服务时,本质是把Alibaba Sidecar当网关在使用,经过了一层转发,性能有一定下降。 +* 每接入一个异构微服务实例,都需要额外部署一个Alibaba +Sidecar实例,增加了部署成本(虽然这个成本在Kubernetes环境中几乎可以忽略不计(只需将Alibaba +Sidecar实例和异构微服务作为一个Pod部署即可)); +* 异构微服务调用Spring Cloud微服务时,本质是把Alibaba +Sidecar当网关在使用,经过了一层转发,性能有一定下降。 diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/dependency-management.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/dependency-management.adoc index fd1b3173..3149935e 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/dependency-management.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/dependency-management.adoc @@ -8,7 +8,7 @@ If you’re a Maven Central user, add our BOM to your pom.xml com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.1.3.RELEASE + 2.1.4.RELEASE pom import diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/introduction.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/introduction.adoc index f4c88314..84a83c1f 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/introduction.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/introduction.adoc @@ -1,6 +1,6 @@ == Introduction -Spring Cloud Alibaba aims to provide a one-stop solution for microservices development. This prjoect includes the required components for developing distributed applications and services, so that developers can develop distributed applications easily with the Spring Cloud programming models. +Spring Cloud Alibaba aims to provide a one-stop solution for microservices development. This project includes the required components for developing distributed applications and services, so that developers can develop distributed applications easily with the Spring Cloud programming models. With Spring Cloud Alibaba, you only need to add a few annotations and configurations, and you will be able to use the distributed solutions of Alibaba for your applications, and build a distributed system of your own with Alibaba middleware. @@ -16,4 +16,4 @@ The features of Spring Cloud Alibaba: 8. **Alibaba Cloud SchedulerX**:accurate, highly reliable, and highly available scheduled job scheduling services with response time within seconds. 9. **Alibaba Cloud SMS**: A messaging service that covers the globe, Alibaba SMS provides convenient, efficient, and intelligent communication capabilities that help businesses quickly contact their customers. -Spring Cloud Alibaba also provide rich https://github.com/alibaba/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples[examples]. \ No newline at end of file +Spring Cloud Alibaba also provide rich https://github.com/alibaba/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples[examples]. diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-discovery.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-discovery.adoc index f7f833d3..8937bb7b 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-discovery.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-discovery.adoc @@ -159,7 +159,7 @@ NOTE: Before you start the provider application, please start Nacos first. Refer ==== Start a Consumer Application It might not be as easy as starting a provider application, because the consumer needs to call the RESTful service of the provider. In this example, we will use the most primitive way, that is, -combining the LoadBalanceClient and RestTemolate explicitly to access the RESTful service. +combining the LoadBalanceClient and RestTemplate explicitly to access the RESTful service. You can refer to section 1.2 for pom.xml and application.properties configurations. The following is the sample code for starting a consumer application. NOTE: You can also access the service by using RestTemplate and FeignClient with load balancing. diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/pom.xml b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/pom.xml index aec944a5..cf5e5ada 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/pom.xml +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/pom.xml @@ -15,6 +15,7 @@ Example demonstrating how to use nacos config jar + org.springframework.boot diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md index 2c9441f3..c58f6783 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md @@ -175,7 +175,7 @@ AccessKey|spring.cloud.nacos.config.access-key|| SecretKey|spring.cloud.nacos.config.secret-key|| 相对路径|spring.cloud.nacos.config.context-path||服务端 API 的相对路径 接入点|spring.cloud.nacos.config.endpoint|UTF-8|地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 -是否开启监听和自动刷新|spring.cloud.nacos.config.refresh.enabled|true| +是否开启监听和自动刷新|spring.cloud.nacos.config.refresh-enabled|true| diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme.md b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme.md index b415bf8c..797c09cc 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme.md +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme.md @@ -25,6 +25,7 @@ Before we start the demo, let's learn how to connect Nacos Config to a Spring Cl spring.cloud.nacos.config.server-addr=127.0.0.1:8848 3. After completing the above two steps, the application will get the externalized configuration from Nacos Server and put it in the Spring Environment's PropertySources.We use the @Value annotation to inject the corresponding configuration into the userName and age fields of the SampleController, and add @RefreshScope to turn on dynamic refresh . + @RefreshScope class SampleController { diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/src/main/java/com/alibaba/cloud/examples/Application.java b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/src/main/java/com/alibaba/cloud/examples/Application.java index ce693054..69a5d427 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/src/main/java/com/alibaba/cloud/examples/Application.java +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/src/main/java/com/alibaba/cloud/examples/Application.java @@ -18,6 +18,7 @@ package com.alibaba.cloud.examples; import java.io.IOException; import java.io.StringReader; +import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.Executor; @@ -34,7 +35,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.annotation.Bean; +import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -62,8 +65,12 @@ class UserConfig { private String name; + private String hr; + private Map map; + private List users; + public int getAge() { return age; } @@ -88,10 +95,65 @@ class UserConfig { this.map = map; } + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + public String getHr() { + return hr; + } + + public void setHr(String hr) { + this.hr = hr; + } + @Override public String toString() { return "UserConfig{" + "age=" + age + ", name='" + name + '\'' + ", map=" + map - + '}'; + + ", hr='" + hr + '\'' + ", users=" + users + '}'; + } + + public static class User { + + private String name; + + private String hr; + + private String avg; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHr() { + return hr; + } + + public void setHr(String hr) { + this.hr = hr; + } + + public String getAvg() { + return avg; + } + + public void setAvg(String avg) { + this.avg = avg; + } + + @Override + public String toString() { + return "User{" + "name='" + name + '\'' + ", hr=" + hr + ", avg=" + avg + '}'; + } + } } @@ -99,7 +161,7 @@ class UserConfig { @Component class SampleRunner implements ApplicationRunner { - @Value("${user.name}") + @Value("${user.name:zz}") String userName; @Value("${user.age:25}") @@ -156,7 +218,10 @@ class SampleController { @Autowired private NacosConfigManager nacosConfigManager; - @Value("${user.name}") + @Autowired + private Environment environment; + + @Value("${user.name:zz}") String userName; @Value("${user.age:25}") @@ -168,6 +233,11 @@ class SampleController { + userConfig + "!" + nacosConfigManager.getConfigService(); } + @RequestMapping("/get/{name}") + public String getValue(@PathVariable String name) { + return String.valueOf(environment.getProperty(name)); + } + @RequestMapping("/bool") public boolean bool() { return (Boolean) (userConfig.getMap().get("2")); diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/src/main/resources/bootstrap.properties b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/src/main/resources/bootstrap.properties index cea78476..9e500a4e 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/src/main/resources/bootstrap.properties +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/src/main/resources/bootstrap.properties @@ -5,19 +5,26 @@ spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.username=nacos spring.cloud.nacos.password=nacos +#spring.cloud.nacos.config.namespace=public +spring.cloud.nacos.config.name=test-aaa +spring.cloud.nacos.config.file-extension=yaml + #spring.cloud.nacos.config.refreshable-dataids=common.properties #spring.cloud.nacos.config.shared-data-ids=common.properties,base-common.properties -spring.cloud.nacos.config.shared-configs[0]= common333.properties -spring.cloud.nacos.config.shared-configs[1].data-id= common111.properties -spring.cloud.nacos.config.shared-configs[1].group= GROUP_APP1 -spring.cloud.nacos.config.shared-configs[1].refresh= true -spring.cloud.nacos.config.shared-configs[2]= common222.properties +#spring.cloud.nacos.config.shared-configs[0]= common333.properties +#spring.cloud.nacos.config.shared-configs[1].data-id= common111.properties +#spring.cloud.nacos.config.shared-configs[1].group= GROUP_APP1 +#spring.cloud.nacos.config.shared-configs[1].refresh= true +#spring.cloud.nacos.config.shared-configs[2]= common222.properties +spring.cloud.nacos.config.shared-configs[0].data-id= test2.yaml +spring.cloud.nacos.config.shared-configs[0].refresh=true #spring.cloud.nacos.config.ext-config[0]=ext.properties spring.cloud.nacos.config.extension-configs[0].data-id= extension1.properties -spring.cloud.nacos.config.extension-configs[0].refresh= true -spring.cloud.nacos.config.extension-configs[1]= extension2.properties -spring.cloud.nacos.config.extension-configs[2].data-id= extension3.json +spring.cloud.nacos.config.extension-configs[0].refresh=true +spring.cloud.nacos.config.extension-configs[1].data-id= test1.yml +spring.cloud.nacos.config.extension-configs[1].refresh= true + diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/pom.xml b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/pom.xml index 43c829bb..4b0e61f1 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/pom.xml +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/pom.xml @@ -15,6 +15,7 @@ Example demonstrating how to use nacos discovery jar + org.springframework.boot diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/pom.xml b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/pom.xml index ac906701..6e9b11d1 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/pom.xml +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/pom.xml @@ -9,11 +9,13 @@ 4.0.0 + nacos-discovery-provider-example Spring Cloud Starter Alibaba Nacos Discovery Provider Example Example demonstrating how to use nacos discovery jar + org.springframework.boot diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/src/main/resources/application.properties b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/src/main/resources/application.properties index 9732f8d5..16c0acc9 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/src/main/resources/application.properties +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/src/main/resources/application.properties @@ -1,6 +1,7 @@ server.port=18082 spring.application.name=service-provider spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 +#spring.cloud.nacos.discovery.instance-enabled=true spring.cloud.nacos.username=nacos spring.cloud.nacos.password=nacos diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-client-example/pom.xml b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-client-example/pom.xml index f9047bcd..82cdbcd4 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-client-example/pom.xml +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-client-example/pom.xml @@ -9,11 +9,13 @@ 4.0.0 + nacos-discovery-spring-cloud-config-client-example Spring Cloud Starter Alibaba Nacos Discovery x Config Client Example Example demonstrating how to use nacos discovery jar + org.springframework.boot diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-server-example/pom.xml b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-server-example/pom.xml index adecde55..a04990fe 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-server-example/pom.xml +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-server-example/pom.xml @@ -9,11 +9,13 @@ 4.0.0 + nacos-discovery-spring-cloud-config-server-example Spring Cloud Starter Alibaba Nacos Discovery x Config Server Example Example demonstrating how to use nacos discovery jar + org.springframework.boot diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/pom.xml b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/pom.xml index 9c29e19b..ea4cbfff 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/pom.xml +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/pom.xml @@ -15,6 +15,7 @@ Example demonstrating how to use nacos discovery pom + nacos-discovery-consumer-example nacos-discovery-provider-example diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md index 2140c5ea..0ad0d23d 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md @@ -30,7 +30,7 @@ public class ProviderApplication { public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(ProviderApplication.class, args); } @RestController diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md index 86469101..0946cf9a 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md @@ -29,7 +29,7 @@ Before we start the demo, let's learn how to connect Nacos Config to a Spring Cl public class ProviderApplication { public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(ProviderApplication.class, args); } @RestController @@ -207,6 +207,7 @@ Metadata|spring.cloud.nacos.discovery.metadata||Extended data, Configure using M log name|spring.cloud.nacos.discovery.log-name|| endpoint|spring.cloud.nacos.discovery.endpoint||The domain name of a service, through which the server address can be dynamically obtained. Integration Ribbon|ribbon.nacos.enabled|true| +enabled|spring.cloud.nacos.discovery.enabled|true|The switch to enable or disable nacos service discovery diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-gateway-example/nacos-gateway-discovery-example/pom.xml b/spring-cloud-alibaba-examples/nacos-example/nacos-gateway-example/nacos-gateway-discovery-example/pom.xml index 9f321376..97e014c7 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-gateway-example/nacos-gateway-discovery-example/pom.xml +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-gateway-example/nacos-gateway-discovery-example/pom.xml @@ -9,11 +9,13 @@ 4.0.0 + nacos-gateway-discovery-example Spring Cloud Starter Alibaba Nacos Discovery x Gateway Example Example demonstrating how to use gateway with nacos jar + org.springframework.cloud diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-gateway-example/nacos-gateway-provider-example/pom.xml b/spring-cloud-alibaba-examples/nacos-example/nacos-gateway-example/nacos-gateway-provider-example/pom.xml index 7c7bd448..2662ab51 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-gateway-example/nacos-gateway-provider-example/pom.xml +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-gateway-example/nacos-gateway-provider-example/pom.xml @@ -9,11 +9,13 @@ 4.0.0 + nacos-gateway-provider-example Spring Cloud Starter Alibaba Nacos Discovery x Gateway - Provider Example Example demonstrating how to use gateway with nacos jar + org.springframework.boot diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-gateway-example/pom.xml b/spring-cloud-alibaba-examples/nacos-example/nacos-gateway-example/pom.xml index 812c08b3..7c3552a0 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-gateway-example/pom.xml +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-gateway-example/pom.xml @@ -10,11 +10,13 @@ 4.0.0 + nacos-gateway-example Spring Cloud Starter Alibaba Nacos Discovery x Gateway Examples Example demonstrating how to use gateway with nacos pom + nacos-gateway-discovery-example nacos-gateway-provider-example diff --git a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-consume-example/pom.xml b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-consume-example/pom.xml index 19ec9449..00bf7382 100644 --- a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-consume-example/pom.xml +++ b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-consume-example/pom.xml @@ -10,11 +10,13 @@ 4.0.0 + rocketmq-consume-example Spring Cloud Starter Stream Alibaba RocketMQ Consume Example Example demonstrating how to use rocketmq consume jar + com.alibaba.cloud diff --git a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/pom.xml b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/pom.xml index 6702116c..31de576b 100644 --- a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/pom.xml +++ b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/pom.xml @@ -10,11 +10,13 @@ 4.0.0 + rocketmq-produce-example Spring Cloud Starter Stream Alibaba RocketMQ Produce Example Example demonstrating how to use rocketmq produce jar + com.alibaba.cloud diff --git a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/src/main/java/com/alibaba/cloud/examples/RocketMQProduceApplication.java b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/src/main/java/com/alibaba/cloud/examples/RocketMQProduceApplication.java index eaf4b47e..d63349d1 100644 --- a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/src/main/java/com/alibaba/cloud/examples/RocketMQProduceApplication.java +++ b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/src/main/java/com/alibaba/cloud/examples/RocketMQProduceApplication.java @@ -83,7 +83,7 @@ public class RocketMQProduceApplication { @Override public void run(String... args) throws Exception { - if (this.bindingName.equals("output1")) { + if ("output1".equals(this.bindingName)) { int count = 5; for (int index = 1; index <= count; index++) { String msgContent = "msg-" + index; @@ -98,7 +98,7 @@ public class RocketMQProduceApplication { } } } - else if (this.bindingName.equals("output3")) { + else if ("output3".equals(this.bindingName)) { int count = 20; for (int index = 1; index <= count; index++) { String msgContent = "pullMsg-" + index; diff --git a/spring-cloud-alibaba-examples/seata-example/account-service/pom.xml b/spring-cloud-alibaba-examples/seata-example/account-service/pom.xml index 2d10b97c..99aa658f 100644 --- a/spring-cloud-alibaba-examples/seata-example/account-service/pom.xml +++ b/spring-cloud-alibaba-examples/seata-example/account-service/pom.xml @@ -9,8 +9,8 @@ ../../pom.xml 4.0.0 - account-service + account-service Spring Cloud Starter Alibaba Seata Example - Account Service jar diff --git a/spring-cloud-alibaba-examples/seata-example/account-service/src/main/resources/file.conf b/spring-cloud-alibaba-examples/seata-example/account-service/src/main/resources/file.conf deleted file mode 100644 index 0777ae8a..00000000 --- a/spring-cloud-alibaba-examples/seata-example/account-service/src/main/resources/file.conf +++ /dev/null @@ -1,67 +0,0 @@ -transport { - # tcp udt unix-domain-socket - type = "TCP" - #NIO NATIVE - server = "NIO" - #enable heartbeat - heartbeat = false - #thread factory for netty - thread-factory { - boss-thread-prefix = "NettyBoss" - worker-thread-prefix = "NettyServerNIOWorker" - server-executor-thread-prefix = "NettyServerBizHandler" - share-boss-worker = false - client-selector-thread-prefix = "NettyClientSelector" - client-selector-thread-size = 1 - client-worker-thread-prefix = "NettyClientWorkerThread" - # netty boss thread size,will not be used for UDT - boss-thread-size = 1 - #auto default pin or 8 - worker-thread-size = 8 - } - shutdown { - # when destroy server, wait seconds - wait = 3 - } - serialization = "seata" - compressor = "none" -} -service { - #vgroup->rgroup - vgroup_mapping.account-service-seata-service-group = "default" - #only support single node - default.grouplist = "127.0.0.1:8091" - #degrade current not support - enableDegrade = false - #disable - disable = false - #unit ms,s,m,h,d represents milliseconds, seconds, minutes, hours, days, default permanent - max.commit.retry.timeout = "-1" - max.rollback.retry.timeout = "-1" -} -client { - async.commit.buffer.limit = 10000 - lock { - retry.internal = 10 - retry.times = 30 - } - report.retry.count = 5 - tm.commit.retry.count = 1 - tm.rollback.retry.count = 1 -} -transaction { - undo.data.validation = true - undo.log.serialization = "jackson" - undo.log.save.days = 7 - #schedule delete expired undo_log in milliseconds - undo.log.delete.period = 86400000 - undo.log.table = "undo_log" -} - -support { - ## spring - spring { - # auto proxy the DataSource bean - datasource.autoproxy = false - } -} \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/seata-example/account-service/src/main/resources/registry.conf b/spring-cloud-alibaba-examples/seata-example/account-service/src/main/resources/registry.conf deleted file mode 100644 index b98f5704..00000000 --- a/spring-cloud-alibaba-examples/seata-example/account-service/src/main/resources/registry.conf +++ /dev/null @@ -1,73 +0,0 @@ -registry { - # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa - type = "file" - - nacos { - serverAddr = "localhost" - namespace = "" - cluster = "default" - } - eureka { - serviceUrl = "http://localhost:8761/eureka" - application = "default" - weight = "1" - } - redis { - serverAddr = "localhost:6379" - db = "0" - } - zk { - cluster = "default" - serverAddr = "127.0.0.1:2181" - session.timeout = 6000 - connect.timeout = 2000 - } - consul { - cluster = "default" - serverAddr = "127.0.0.1:8500" - } - etcd3 { - cluster = "default" - serverAddr = "http://localhost:2379" - } - sofa { - serverAddr = "127.0.0.1:9603" - application = "default" - region = "DEFAULT_ZONE" - datacenter = "DefaultDataCenter" - cluster = "default" - group = "SEATA_GROUP" - addressWaitTime = "3000" - } - file { - name = "file.conf" - } -} - -config { - # file、nacos 、apollo、zk、consul、etcd3 - type = "file" - - nacos { - serverAddr = "localhost" - namespace = "" - } - consul { - serverAddr = "127.0.0.1:8500" - } - apollo { - app.id = "seata-server" - apollo.meta = "http://192.168.1.204:8801" - } - zk { - serverAddr = "127.0.0.1:2181" - session.timeout = 6000 - connect.timeout = 2000 - } - etcd3 { - serverAddr = "http://localhost:2379" - } - file { - name = "file.conf" - } -} diff --git a/spring-cloud-alibaba-examples/seata-example/business-service/pom.xml b/spring-cloud-alibaba-examples/seata-example/business-service/pom.xml index 72986e4f..5602104e 100644 --- a/spring-cloud-alibaba-examples/seata-example/business-service/pom.xml +++ b/spring-cloud-alibaba-examples/seata-example/business-service/pom.xml @@ -9,8 +9,8 @@ ../../pom.xml 4.0.0 - business-service + business-service Spring Cloud Starter Alibaba Seata Example - Business Service jar @@ -31,6 +31,10 @@ org.springframework.cloud spring-cloud-starter-netflix-hystrix + + + + org.springframework.boot spring-boot-starter-web diff --git a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/application.properties b/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/application.properties index e1fc1c85..bc40bece 100644 --- a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/application.properties +++ b/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/application.properties @@ -5,6 +5,8 @@ spring.cloud.nacos.discovery.server-addr=localhost:8848 #feign.hystrix.enabled=true #feign.sentinel.enabled=true +feign.client.config.default.connectTimeout=10000 +feign.client.config.default.readTimeout=10000 logging.level.io.seata=debug diff --git a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/file.conf b/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/file.conf deleted file mode 100644 index a6e431bc..00000000 --- a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/file.conf +++ /dev/null @@ -1,67 +0,0 @@ -transport { - # tcp udt unix-domain-socket - type = "TCP" - #NIO NATIVE - server = "NIO" - #enable heartbeat - heartbeat = false - #thread factory for netty - thread-factory { - boss-thread-prefix = "NettyBoss" - worker-thread-prefix = "NettyServerNIOWorker" - server-executor-thread-prefix = "NettyServerBizHandler" - share-boss-worker = false - client-selector-thread-prefix = "NettyClientSelector" - client-selector-thread-size = 1 - client-worker-thread-prefix = "NettyClientWorkerThread" - # netty boss thread size,will not be used for UDT - boss-thread-size = 1 - #auto default pin or 8 - worker-thread-size = 8 - } - shutdown { - # when destroy server, wait seconds - wait = 3 - } - serialization = "seata" - compressor = "none" -} -service { - #vgroup->rgroup - vgroup_mapping.business-service-seata-service-group = "default" - #only support single node - default.grouplist = "127.0.0.1:8091" - #degrade current not support - enableDegrade = false - #disable - disable = false - #unit ms,s,m,h,d represents milliseconds, seconds, minutes, hours, days, default permanent - max.commit.retry.timeout = "-1" - max.rollback.retry.timeout = "-1" -} -client { - async.commit.buffer.limit = 10000 - lock { - retry.internal = 10 - retry.times = 30 - } - report.retry.count = 5 - tm.commit.retry.count = 1 - tm.rollback.retry.count = 1 -} -transaction { - undo.data.validation = true - undo.log.serialization = "jackson" - undo.log.save.days = 7 - #schedule delete expired undo_log in milliseconds - undo.log.delete.period = 86400000 - undo.log.table = "undo_log" -} - -support { - ## spring - spring { - # auto proxy the DataSource bean - datasource.autoproxy = false - } -} \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/registry.conf b/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/registry.conf deleted file mode 100644 index b98f5704..00000000 --- a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/registry.conf +++ /dev/null @@ -1,73 +0,0 @@ -registry { - # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa - type = "file" - - nacos { - serverAddr = "localhost" - namespace = "" - cluster = "default" - } - eureka { - serviceUrl = "http://localhost:8761/eureka" - application = "default" - weight = "1" - } - redis { - serverAddr = "localhost:6379" - db = "0" - } - zk { - cluster = "default" - serverAddr = "127.0.0.1:2181" - session.timeout = 6000 - connect.timeout = 2000 - } - consul { - cluster = "default" - serverAddr = "127.0.0.1:8500" - } - etcd3 { - cluster = "default" - serverAddr = "http://localhost:2379" - } - sofa { - serverAddr = "127.0.0.1:9603" - application = "default" - region = "DEFAULT_ZONE" - datacenter = "DefaultDataCenter" - cluster = "default" - group = "SEATA_GROUP" - addressWaitTime = "3000" - } - file { - name = "file.conf" - } -} - -config { - # file、nacos 、apollo、zk、consul、etcd3 - type = "file" - - nacos { - serverAddr = "localhost" - namespace = "" - } - consul { - serverAddr = "127.0.0.1:8500" - } - apollo { - app.id = "seata-server" - apollo.meta = "http://192.168.1.204:8801" - } - zk { - serverAddr = "127.0.0.1:2181" - session.timeout = 6000 - connect.timeout = 2000 - } - etcd3 { - serverAddr = "http://localhost:2379" - } - file { - name = "file.conf" - } -} diff --git a/spring-cloud-alibaba-examples/seata-example/order-service/pom.xml b/spring-cloud-alibaba-examples/seata-example/order-service/pom.xml index 6c9ae704..caa4e29f 100644 --- a/spring-cloud-alibaba-examples/seata-example/order-service/pom.xml +++ b/spring-cloud-alibaba-examples/seata-example/order-service/pom.xml @@ -9,9 +9,9 @@ ../../pom.xml 4.0.0 - order-service - Spring Cloud Starter Alibaba Seata Example - Business Service + order-service + Spring Cloud Starter Alibaba Seata Example - Order Service jar @@ -54,4 +54,4 @@ - \ No newline at end of file + diff --git a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OderApplication.java b/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OrderApplication.java similarity index 92% rename from spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OderApplication.java rename to spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OrderApplication.java index b1233273..33e31a71 100644 --- a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OderApplication.java +++ b/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OrderApplication.java @@ -25,10 +25,10 @@ import org.springframework.web.client.RestTemplate; * @author xiaojing */ @SpringBootApplication -public class OderApplication { +public class OrderApplication { public static void main(String[] args) { - SpringApplication.run(OderApplication.class, args); + SpringApplication.run(OrderApplication.class, args); } @Bean diff --git a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/resources/file.conf b/spring-cloud-alibaba-examples/seata-example/order-service/src/main/resources/file.conf deleted file mode 100644 index 89f55344..00000000 --- a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/resources/file.conf +++ /dev/null @@ -1,67 +0,0 @@ -transport { - # tcp udt unix-domain-socket - type = "TCP" - #NIO NATIVE - server = "NIO" - #enable heartbeat - heartbeat = false - #thread factory for netty - thread-factory { - boss-thread-prefix = "NettyBoss" - worker-thread-prefix = "NettyServerNIOWorker" - server-executor-thread-prefix = "NettyServerBizHandler" - share-boss-worker = false - client-selector-thread-prefix = "NettyClientSelector" - client-selector-thread-size = 1 - client-worker-thread-prefix = "NettyClientWorkerThread" - # netty boss thread size,will not be used for UDT - boss-thread-size = 1 - #auto default pin or 8 - worker-thread-size = 8 - } - shutdown { - # when destroy server, wait seconds - wait = 3 - } - serialization = "seata" - compressor = "none" -} -service { - #vgroup->rgroup - vgroup_mapping.order-service-seata-service-group = "default" - #only support single node - default.grouplist = "127.0.0.1:8091" - #degrade current not support - enableDegrade = false - #disable - disable = false - #unit ms,s,m,h,d represents milliseconds, seconds, minutes, hours, days, default permanent - max.commit.retry.timeout = "-1" - max.rollback.retry.timeout = "-1" -} -client { - async.commit.buffer.limit = 10000 - lock { - retry.internal = 10 - retry.times = 30 - } - report.retry.count = 5 - tm.commit.retry.count = 1 - tm.rollback.retry.count = 1 -} -transaction { - undo.data.validation = true - undo.log.serialization = "jackson" - undo.log.save.days = 7 - #schedule delete expired undo_log in milliseconds - undo.log.delete.period = 86400000 - undo.log.table = "undo_log" -} - -support { - ## spring - spring { - # auto proxy the DataSource bean - datasource.autoproxy = false - } -} \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/resources/registry.conf b/spring-cloud-alibaba-examples/seata-example/order-service/src/main/resources/registry.conf deleted file mode 100644 index b98f5704..00000000 --- a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/resources/registry.conf +++ /dev/null @@ -1,73 +0,0 @@ -registry { - # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa - type = "file" - - nacos { - serverAddr = "localhost" - namespace = "" - cluster = "default" - } - eureka { - serviceUrl = "http://localhost:8761/eureka" - application = "default" - weight = "1" - } - redis { - serverAddr = "localhost:6379" - db = "0" - } - zk { - cluster = "default" - serverAddr = "127.0.0.1:2181" - session.timeout = 6000 - connect.timeout = 2000 - } - consul { - cluster = "default" - serverAddr = "127.0.0.1:8500" - } - etcd3 { - cluster = "default" - serverAddr = "http://localhost:2379" - } - sofa { - serverAddr = "127.0.0.1:9603" - application = "default" - region = "DEFAULT_ZONE" - datacenter = "DefaultDataCenter" - cluster = "default" - group = "SEATA_GROUP" - addressWaitTime = "3000" - } - file { - name = "file.conf" - } -} - -config { - # file、nacos 、apollo、zk、consul、etcd3 - type = "file" - - nacos { - serverAddr = "localhost" - namespace = "" - } - consul { - serverAddr = "127.0.0.1:8500" - } - apollo { - app.id = "seata-server" - apollo.meta = "http://192.168.1.204:8801" - } - zk { - serverAddr = "127.0.0.1:2181" - session.timeout = 6000 - connect.timeout = 2000 - } - etcd3 { - serverAddr = "http://localhost:2379" - } - file { - name = "file.conf" - } -} diff --git a/spring-cloud-alibaba-examples/seata-example/storage-service/pom.xml b/spring-cloud-alibaba-examples/seata-example/storage-service/pom.xml index a2cbdccd..204265a3 100644 --- a/spring-cloud-alibaba-examples/seata-example/storage-service/pom.xml +++ b/spring-cloud-alibaba-examples/seata-example/storage-service/pom.xml @@ -9,6 +9,7 @@ ../../pom.xml 4.0.0 + storage-service Spring Cloud Starter Alibaba Seata Example - Storage Service jar diff --git a/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/resources/file.conf b/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/resources/file.conf deleted file mode 100644 index 2915b99c..00000000 --- a/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/resources/file.conf +++ /dev/null @@ -1,67 +0,0 @@ -transport { - # tcp udt unix-domain-socket - type = "TCP" - #NIO NATIVE - server = "NIO" - #enable heartbeat - heartbeat = false - #thread factory for netty - thread-factory { - boss-thread-prefix = "NettyBoss" - worker-thread-prefix = "NettyServerNIOWorker" - server-executor-thread-prefix = "NettyServerBizHandler" - share-boss-worker = false - client-selector-thread-prefix = "NettyClientSelector" - client-selector-thread-size = 1 - client-worker-thread-prefix = "NettyClientWorkerThread" - # netty boss thread size,will not be used for UDT - boss-thread-size = 1 - #auto default pin or 8 - worker-thread-size = 8 - } - shutdown { - # when destroy server, wait seconds - wait = 3 - } - serialization = "seata" - compressor = "none" -} -service { - #vgroup->rgroup - vgroup_mapping.storage-service-seata-service-group = "default" - #only support single node - default.grouplist = "127.0.0.1:8091" - #degrade current not support - enableDegrade = false - #disable - disable = false - #unit ms,s,m,h,d represents milliseconds, seconds, minutes, hours, days, default permanent - max.commit.retry.timeout = "-1" - max.rollback.retry.timeout = "-1" -} -client { - async.commit.buffer.limit = 10000 - lock { - retry.internal = 10 - retry.times = 30 - } - report.retry.count = 5 - tm.commit.retry.count = 1 - tm.rollback.retry.count = 1 -} -transaction { - undo.data.validation = true - undo.log.serialization = "jackson" - undo.log.save.days = 7 - #schedule delete expired undo_log in milliseconds - undo.log.delete.period = 86400000 - undo.log.table = "undo_log" -} - -support { - ## spring - spring { - # auto proxy the DataSource bean - datasource.autoproxy = false - } -} \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/resources/registry.conf b/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/resources/registry.conf deleted file mode 100644 index b98f5704..00000000 --- a/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/resources/registry.conf +++ /dev/null @@ -1,73 +0,0 @@ -registry { - # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa - type = "file" - - nacos { - serverAddr = "localhost" - namespace = "" - cluster = "default" - } - eureka { - serviceUrl = "http://localhost:8761/eureka" - application = "default" - weight = "1" - } - redis { - serverAddr = "localhost:6379" - db = "0" - } - zk { - cluster = "default" - serverAddr = "127.0.0.1:2181" - session.timeout = 6000 - connect.timeout = 2000 - } - consul { - cluster = "default" - serverAddr = "127.0.0.1:8500" - } - etcd3 { - cluster = "default" - serverAddr = "http://localhost:2379" - } - sofa { - serverAddr = "127.0.0.1:9603" - application = "default" - region = "DEFAULT_ZONE" - datacenter = "DefaultDataCenter" - cluster = "default" - group = "SEATA_GROUP" - addressWaitTime = "3000" - } - file { - name = "file.conf" - } -} - -config { - # file、nacos 、apollo、zk、consul、etcd3 - type = "file" - - nacos { - serverAddr = "localhost" - namespace = "" - } - consul { - serverAddr = "127.0.0.1:8500" - } - apollo { - app.id = "seata-server" - apollo.meta = "http://192.168.1.204:8801" - } - zk { - serverAddr = "127.0.0.1:2181" - session.timeout = 6000 - connect.timeout = 2000 - } - etcd3 { - serverAddr = "http://localhost:2379" - } - file { - name = "file.conf" - } -} diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/pom.xml b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/pom.xml index 15e7634e..028372e5 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/pom.xml +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/pom.xml @@ -22,6 +22,11 @@ spring-cloud-starter-alibaba-sentinel + + com.alibaba.cloud + spring-cloud-alibaba-sentinel-datasource + + org.springframework.boot spring-boot-starter-web @@ -35,10 +40,10 @@ spring-boot-starter-thymeleaf - - - - + + com.alibaba.csp + sentinel-datasource-nacos + diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/resources/application.properties b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/resources/application.properties index 16ee4a26..e9c08593 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/resources/application.properties +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/resources/application.properties @@ -9,11 +9,19 @@ management.health.diskspace.enabled=false spring.cloud.sentinel.transport.dashboard=localhost:8080 spring.cloud.sentinel.eager=true +spring.cloud.sentinel.web-context-unify=true #spring.cloud.sentinel.block-page=/errorPage #spring.cloud.sentinel.filter.enabled=false #spring.cloud.sentinel.http-method-specify=false +#spring.cloud.sentinel.datasource.ds6.nacos.server-addr=127.0.0.1:8848 +#spring.cloud.sentinel.datasource.ds6.nacos.username=nacos +#spring.cloud.sentinel.datasource.ds6.nacos.password=nacos +#spring.cloud.sentinel.datasource.ds6.nacos.dataId=flowrule.json +#spring.cloud.sentinel.datasource.ds6.nacos.data-type=json +#spring.cloud.sentinel.datasource.ds6.nacos.rule-type=flow + spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json spring.cloud.sentinel.datasource.ds1.file.data-type=json spring.cloud.sentinel.datasource.ds1.file.rule-type=flow diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/sentinel-dubbo-consumer-example/pom.xml b/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/sentinel-dubbo-consumer-example/pom.xml index f17a436c..e1f0552b 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/sentinel-dubbo-consumer-example/pom.xml +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/sentinel-dubbo-consumer-example/pom.xml @@ -10,11 +10,13 @@ 4.0.0 + sentinel-dubbo-consumer-example Spring Cloud Starter Alibaba Sentinel x Dubbo - Consumer Example Example demonstrating how to use sentinel with dubbo jar + @@ -30,7 +32,7 @@ com.alibaba.cloud sentinel-dubbo-api - ${revision} + ${project.version} diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/sentinel-dubbo-provider-example/pom.xml b/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/sentinel-dubbo-provider-example/pom.xml index 016acbc9..78c64092 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/sentinel-dubbo-provider-example/pom.xml +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/sentinel-dubbo-provider-example/pom.xml @@ -10,11 +10,13 @@ 4.0.0 + sentinel-dubbo-provider-example Spring Cloud Starter Alibaba Sentinel x Dubbo - Provider Example Example demonstrating how to use sentinel with dubbo jar + @@ -30,7 +32,7 @@ com.alibaba.cloud sentinel-dubbo-api - ${revision} + ${project.version} diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/pom.xml b/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/pom.xml index bf6b8743..2ef10965 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/pom.xml +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/pom.xml @@ -10,11 +10,13 @@ 4.0.0 + sentinel-feign-consumer-example Spring Cloud Starter Alibaba Sentinel x Feign - Consumer Example Example demonstrating how to use sentinel with feign jar + org.springframework.boot diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/fallback/EchoServiceFallback.java b/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/fallback/EchoServiceFallback.java index 30a9de2b..2e6a9aab 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/fallback/EchoServiceFallback.java +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/fallback/EchoServiceFallback.java @@ -20,7 +20,6 @@ import com.alibaba.cloud.examples.service.EchoService; /** * @author lengleng - * @date 2019-08-01 *

* sentinel 降级处理 */ @@ -35,7 +34,7 @@ public class EchoServiceFallback implements EchoService { /** * 调用服务提供方的输出接口. * @param str 用户输入 - * @return + * @return String */ @Override public String echo(String str) { diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/fallback/EchoServiceFallbackFactory.java b/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/fallback/EchoServiceFallbackFactory.java index 94366678..9df335d2 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/fallback/EchoServiceFallbackFactory.java +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/fallback/EchoServiceFallbackFactory.java @@ -22,7 +22,6 @@ import org.springframework.stereotype.Component; /** * @author lengleng - * @date 2019-08-01 */ @Component public class EchoServiceFallbackFactory implements FallbackFactory { diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/service/EchoService.java b/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/service/EchoService.java index 2fac49df..417eff79 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/service/EchoService.java +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-consumer-example/src/main/java/com/alibaba/cloud/examples/service/EchoService.java @@ -24,7 +24,6 @@ import org.springframework.web.bind.annotation.PathVariable; /** * @author lengleng - * @date 2019-08-01 *

* example feign client */ diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-provider-example/src/main/java/com/alibaba/cloud/examples/controller/EchoController.java b/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-provider-example/src/main/java/com/alibaba/cloud/examples/controller/EchoController.java index c74f7b48..ccf36448 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-provider-example/src/main/java/com/alibaba/cloud/examples/controller/EchoController.java +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-feign-example/sentinel-feign-provider-example/src/main/java/com/alibaba/cloud/examples/controller/EchoController.java @@ -22,7 +22,6 @@ import org.springframework.web.bind.annotation.RestController; /** * @author lengleng - * @date 2019-08-01 */ @RestController public class EchoController { diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-webflux-example/pom.xml b/spring-cloud-alibaba-examples/sentinel-example/sentinel-webflux-example/pom.xml index 530f132b..3b3a7c1a 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-webflux-example/pom.xml +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-webflux-example/pom.xml @@ -10,11 +10,13 @@ 4.0.0 + sentinel-webflux-example Spring Cloud Starter Alibaba Sentinel x WebFlux Example Example demonstrating how to use sentinel with webflux jar + diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-zuul-example/src/main/java/com/alibaba/cloud/examples/ZuulConfiguration.java b/spring-cloud-alibaba-examples/sentinel-example/sentinel-zuul-example/src/main/java/com/alibaba/cloud/examples/ZuulConfiguration.java index d3e1ffea..9dccb6b2 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-zuul-example/src/main/java/com/alibaba/cloud/examples/ZuulConfiguration.java +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-zuul-example/src/main/java/com/alibaba/cloud/examples/ZuulConfiguration.java @@ -41,10 +41,10 @@ public class ZuulConfiguration { @Override public BlockResponse fallbackResponse(String route, Throwable cause) { - if (route.equals("my-service3")) { + if ("my-service3".equals(route)) { return new BlockResponse(433, "Sentinel Block3", route); } - else if (route.equals("my-service4")) { + else if ("my-service4".equals(route)) { return new BlockResponse(444, "my-service4", route); } else { diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/pom.xml index 1af3a87e..c37db212 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/pom.xml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/pom.xml @@ -13,14 +13,13 @@ com.alibaba.cloud spring-cloud-dubbo-client-sample Spring Cloud Dubbo Client Sample - ${revision} com.alibaba.cloud spring-cloud-dubbo-sample-api - ${revision} + ${project.version} diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudClientBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudClientBootstrap.java index 5171d48f..ec7f585a 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudClientBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudClientBootstrap.java @@ -17,7 +17,7 @@ package com.alibaba.cloud.dubbo.bootstrap; import com.alibaba.cloud.dubbo.service.EchoService; -import org.apache.dubbo.config.annotation.Reference; +import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -27,13 +27,15 @@ import org.springframework.web.bind.annotation.RestController; /** * Dubbo Spring Cloud Client Bootstrap. + * + * @author Mercy */ @EnableDiscoveryClient @EnableAutoConfiguration @RestController public class DubboSpringCloudClientBootstrap { - @Reference + @DubboReference private EchoService echoService; @GetMapping("/echo") diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/resources/bootstrap.yaml index 5146a6d5..6801b6c4 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/resources/bootstrap.yaml @@ -1,6 +1,9 @@ dubbo: cloud: subscribed-services: spring-cloud-alibaba-dubbo-server + protocols: + dubbo: + port: -1 spring: application: diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java index 000859ca..de9cf76b 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java @@ -23,7 +23,7 @@ import com.alibaba.cloud.dubbo.annotation.DubboTransported; import com.alibaba.cloud.dubbo.service.RestService; import com.alibaba.cloud.dubbo.service.User; import com.alibaba.cloud.dubbo.service.UserService; -import org.apache.dubbo.config.annotation.Reference; +import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -52,6 +52,8 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; /** * Dubbo Spring Cloud Consumer Bootstrap. + * + * @author Mercy */ @EnableDiscoveryClient @EnableAutoConfiguration @@ -60,10 +62,10 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @EnableCaching public class DubboSpringCloudConsumerBootstrap { - @Reference + @DubboReference private UserService userService; - @Reference(version = "1.0.0", protocol = "dubbo") + @DubboReference(version = "1.0.0", protocol = "dubbo") private RestService restService; @Autowired diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml index c46f7a87..ee44526a 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml @@ -1,14 +1,12 @@ dubbo: - registry: - # The Spring Cloud Dubbo's registry extension - ## the default value of dubbo-provider-services is "*", that means to subscribe all providers, - ## thus it's optimized if subscriber specifies the required providers. - address: spring-cloud://localhost -# The traditional Dubbo's registry also is supported -# address: zookeeper://127.0.0.1:2181 cloud: # The subscribed services in consumer side subscribed-services: ${provider.application.name} + protocols: + dubbo: + port: -1 + consumer: + check: false consumer: check: false diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml index e753ea0e..c4b583a8 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml @@ -8,6 +8,8 @@ spring: # default disable all cloud: nacos: + username: nacos + password: nacos discovery: enabled: false register-enabled: false diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java index 286e2d2b..2421c755 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java @@ -23,6 +23,8 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * Dubbo Spring Cloud Provider Bootstrap. + * + * @author Mercy */ @EnableDiscoveryClient @EnableAutoConfiguration diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java index bd11c413..b1acd0a0 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java @@ -20,12 +20,12 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; -import org.apache.dubbo.config.annotation.Service; +import org.apache.dubbo.config.annotation.DubboService; /** * In-Memory {@link UserService} implementation. */ -@Service(protocol = "dubbo") +@DubboService(protocol = "dubbo") public class InMemoryUserService implements UserService { private Map usersRepository = new HashMap<>(); diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/StandardRestService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/StandardRestService.java index a71cc193..24f34f46 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/StandardRestService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/StandardRestService.java @@ -30,7 +30,7 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; -import org.apache.dubbo.config.annotation.Service; +import org.apache.dubbo.config.annotation.DubboService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +42,7 @@ import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON_VALUE; * * @author Mercy */ -@Service(version = "1.0.0", protocol = { "dubbo", "rest" }) +@DubboService(version = "1.0.0", protocol = { "dubbo", "rest" }) @Path("/") public class StandardRestService implements RestService { diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml index 1a7ec7c5..5a855843 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml @@ -9,11 +9,6 @@ dubbo: name: rest port: 9090 server: netty - registry: -# The Spring Cloud Dubbo's registry extension - address: spring-cloud://localhost -# The traditional Dubbo's registry -# address: zookeeper://127.0.0.1:2181 feign: hystrix: enabled: true \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml index 8f56b284..7efde94a 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml @@ -33,6 +33,7 @@ spring: enabled: true register-enabled: true server-addr: 127.0.0.1:8848 + ephemeral: false --- diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudWebProviderBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudWebProviderBootstrap.java index ab456ccc..d13733c3 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudWebProviderBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudWebProviderBootstrap.java @@ -22,6 +22,8 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * Dubbo Spring Cloud Provider Bootstrap. + * + * @author Mercy */ @EnableDiscoveryClient @EnableAutoConfiguration diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java index bd11c413..b1acd0a0 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java @@ -20,12 +20,12 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; -import org.apache.dubbo.config.annotation.Service; +import org.apache.dubbo.config.annotation.DubboService; /** * In-Memory {@link UserService} implementation. */ -@Service(protocol = "dubbo") +@DubboService(protocol = "dubbo") public class InMemoryUserService implements UserService { private Map usersRepository = new HashMap<>(); diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/SpringRestService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/SpringRestService.java index c0af9bfc..269a6bf4 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/SpringRestService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/SpringRestService.java @@ -19,7 +19,7 @@ package com.alibaba.cloud.dubbo.service; import java.util.HashMap; import java.util.Map; -import org.apache.dubbo.config.annotation.Service; +import org.apache.dubbo.config.annotation.DubboService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,7 +39,7 @@ import static com.alibaba.cloud.dubbo.util.LoggerUtils.log; * * @author Mercy */ -@Service(version = "1.0.0") +@DubboService(version = "1.0.0") @RestController public class SpringRestService implements RestService { diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/application.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/application.yaml index b6858c74..2bc346c8 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/application.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/application.yaml @@ -3,16 +3,7 @@ dubbo: base-packages: com.alibaba.cloud.dubbo.service protocols: dubbo: - name: dubbo port: -1 - registries: - new: - address: spring-cloud://localhost -# registry: -# The Spring Cloud Dubbo's registry extension -# address: spring-cloud://localhost -# The traditional Dubbo's registry -# address: nacos://127.0.0.1:8848 feign: hystrix: diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/bootstrap.yaml index 8f56b284..057185f9 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/bootstrap.yaml @@ -8,6 +8,8 @@ spring: # default disable all cloud: nacos: + username: nacos + password: nacos discovery: enabled: false register-enabled: false diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServerBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServerBootstrap.java index bd7e1784..d54597cc 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServerBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServerBootstrap.java @@ -17,7 +17,7 @@ package com.alibaba.cloud.dubbo.bootstrap; import com.alibaba.cloud.dubbo.service.EchoService; -import org.apache.dubbo.config.annotation.Service; +import org.apache.dubbo.config.annotation.DubboService; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -25,6 +25,8 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * Dubbo Spring Cloud Server Bootstrap. + * + * @author Mercy */ @EnableDiscoveryClient @EnableAutoConfiguration @@ -36,7 +38,7 @@ public class DubboSpringCloudServerBootstrap { } -@Service +@DubboService class EchoServiceImpl implements EchoService { @Override diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-servlet-gateway-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServletGatewayBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-servlet-gateway-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServletGatewayBootstrap.java index face2b41..9aaab1fe 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-servlet-gateway-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServletGatewayBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-servlet-gateway-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServletGatewayBootstrap.java @@ -24,6 +24,8 @@ import org.springframework.cloud.openfeign.EnableFeignClients; /** * Dubbo Spring Cloud Servlet Gateway Bootstrap. + * + * @author Mercy */ @EnableDiscoveryClient @EnableAutoConfiguration diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-servlet-gateway-sample/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboGatewayServlet.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-servlet-gateway-sample/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboGatewayServlet.java index 8fe7f25d..c5ef1539 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-servlet-gateway-sample/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboGatewayServlet.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-servlet-gateway-sample/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboGatewayServlet.java @@ -52,8 +52,8 @@ import org.springframework.util.StreamUtils; import org.springframework.web.servlet.HttpServletBean; import org.springframework.web.util.UriComponents; -import static org.apache.commons.lang3.StringUtils.substringAfter; -import static org.apache.commons.lang3.StringUtils.substringBetween; +import static org.apache.commons.lang.StringUtils.substringAfter; +import static org.apache.commons.lang.StringUtils.substringBetween; import static org.springframework.web.util.UriComponentsBuilder.fromUriString; @WebServlet(urlPatterns = "/dsc/*") diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-sidecar-examples/spring-cloud-alibaba-sidecar-nacos-example/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-sidecar-examples/spring-cloud-alibaba-sidecar-nacos-example/pom.xml index 690d2031..c6c66a83 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-sidecar-examples/spring-cloud-alibaba-sidecar-nacos-example/pom.xml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-sidecar-examples/spring-cloud-alibaba-sidecar-nacos-example/pom.xml @@ -20,9 +20,10 @@ org.springframework.boot spring-boot-starter-actuator + - org.springframework.boot - spring-boot-starter-web + org.springframework.cloud + spring-cloud-starter-gateway @@ -33,10 +34,6 @@ com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery - - io.projectreactor - reactor-core - org.springframework.boot diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-sidecar-examples/spring-cloud-alibaba-sidecar-nacos-example/src/main/resources/application.yml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-sidecar-examples/spring-cloud-alibaba-sidecar-nacos-example/src/main/resources/application.yml index 51550341..22642a71 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-sidecar-examples/spring-cloud-alibaba-sidecar-nacos-example/src/main/resources/application.yml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-sidecar-examples/spring-cloud-alibaba-sidecar-nacos-example/src/main/resources/application.yml @@ -6,11 +6,13 @@ spring: username: nacos password: nacos discovery: - server-addr: localhost:8848 + server-addr: 127.0.0.1:8848 + group: test gateway: discovery: locator: enabled: true + application: name: node-service sidecar: @@ -18,8 +20,9 @@ sidecar: ip: 127.0.0.1 # 异构微服务的端口 port: 8060 + # 异构微服务的健康检查URL - health-check-url: http://localhost:8060/health.json + #health-check-url: http://localhost:8060/health.json management: endpoint: health: diff --git a/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/pom.xml index 0d586b60..c0bbf98a 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/pom.xml +++ b/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/pom.xml @@ -13,8 +13,7 @@ spring-cloud-bus-rocketmq-example Spring Cloud Starter Bus Alibaba RocketMQ Example Example demonstrating how to use Spring Cloud Bus RocketMQ - jar - + jar diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/pom.xml index 3316d7bd..7f2550c2 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/pom.xml @@ -101,6 +101,12 @@ true + + org.apache.commons + commons-lang3 + true + + diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/DataSourcePropertiesConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/DataSourcePropertiesConfiguration.java index 784d12dc..a0a5526f 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/DataSourcePropertiesConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/DataSourcePropertiesConfiguration.java @@ -34,6 +34,7 @@ import org.springframework.util.ObjectUtils; * @see ZookeeperDataSourceProperties * @see FileDataSourceProperties * @see RedisDataSourceProperties + * @see ConsulDataSourceProperties */ public class DataSourcePropertiesConfiguration { diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/pom.xml index 2461c672..49283a18 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/pom.xml @@ -59,6 +59,7 @@ spring-cloud-starter-gateway true + com.fasterxml.jackson.dataformat jackson-dataformat-xml diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/ConfigConstants.java b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/ConfigConstants.java index 9cf27331..8158fdef 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/ConfigConstants.java +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/ConfigConstants.java @@ -37,7 +37,7 @@ public final class ConfigConstants { /** * ConfigurationProperties for {@link SentinelZuulProperties}. */ - public static final String ZUUl_PREFIX = "spring.cloud.sentinel.zuul"; + public static final String ZUUL_PREFIX = "spring.cloud.sentinel.zuul"; /** * ConfigurationProperties for {@link SentinelGatewayProperties}. diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/zuul/SentinelZuulAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/zuul/SentinelZuulAutoConfiguration.java index feeed96c..2ab4c05a 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/zuul/SentinelZuulAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/zuul/SentinelZuulAutoConfiguration.java @@ -47,7 +47,7 @@ import org.springframework.context.annotation.Configuration; */ @Configuration @ConditionalOnClass(ZuulServlet.class) -@ConditionalOnProperty(prefix = ConfigConstants.ZUUl_PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnProperty(prefix = ConfigConstants.ZUUL_PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true) @EnableConfigurationProperties(SentinelZuulProperties.class) public class SentinelZuulAutoConfiguration { diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/zuul/SentinelZuulProperties.java b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/zuul/SentinelZuulProperties.java index cd7bade8..f1ab8da7 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/zuul/SentinelZuulProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/zuul/SentinelZuulProperties.java @@ -28,7 +28,7 @@ import org.springframework.boot.context.properties.NestedConfigurationProperty; /** * @author Jim */ -@ConfigurationProperties(prefix = ConfigConstants.ZUUl_PREFIX) +@ConfigurationProperties(prefix = ConfigConstants.ZUUL_PREFIX) public class SentinelZuulProperties { @NestedConfigurationProperty diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigManager.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigManager.java index e27b3e06..e8199832 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigManager.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigManager.java @@ -18,6 +18,8 @@ package com.alibaba.cloud.nacos; import java.util.Objects; +import javax.annotation.PreDestroy; + import com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureException; import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; @@ -73,6 +75,14 @@ public class NacosConfigManager { return service; } + @PreDestroy + public void destroy() throws NacosException { + if (service != null) { + service.shutDown(); + service = null; + } + } + public NacosConfigProperties getNacosConfigProperties() { return nacosConfigProperties; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySource.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySource.java index 2d83fa5d..2abdc349 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySource.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySource.java @@ -16,12 +16,16 @@ package com.alibaba.cloud.nacos.client; +import java.util.Collections; import java.util.Date; +import java.util.List; import java.util.Map; import com.alibaba.cloud.nacos.NacosConfigProperties; import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.PropertySource; +import org.springframework.util.CollectionUtils; /** * @author xiaojing @@ -58,6 +62,32 @@ public class NacosPropertySource extends MapPropertySource { this.isRefreshable = isRefreshable; } + NacosPropertySource(List> propertySources, String group, + String dataId, Date timestamp, boolean isRefreshable) { + this(group, dataId, getSourceMap(group, dataId, propertySources), timestamp, + isRefreshable); + } + + private static Map getSourceMap(String group, String dataId, + List> propertySources) { + if (CollectionUtils.isEmpty(propertySources)) { + return Collections.emptyMap(); + } + // If only one, return the internal element, otherwise wrap it. + if (propertySources.size() == 1) { + PropertySource propertySource = propertySources.get(0); + if (propertySource != null && propertySource.getSource() instanceof Map) { + return (Map) propertySource.getSource(); + } + } + // If it is multiple, it will be returned as it is, and the internal elements + // cannot be directly retrieved, so the user needs to implement the retrieval + // logic by himself + return Collections.singletonMap( + String.join(NacosConfigProperties.COMMAS, dataId, group), + propertySources); + } + public String getGroup() { return this.group; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceBuilder.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceBuilder.java index 7c3dbaa7..c30c52a8 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceBuilder.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceBuilder.java @@ -16,8 +16,9 @@ package com.alibaba.cloud.nacos.client; +import java.util.Collections; import java.util.Date; -import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import com.alibaba.cloud.nacos.NacosPropertySourceRepository; @@ -27,6 +28,7 @@ import com.alibaba.nacos.api.exception.NacosException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.core.env.PropertySource; import org.springframework.util.StringUtils; /** @@ -38,7 +40,7 @@ public class NacosPropertySourceBuilder { private static final Logger log = LoggerFactory .getLogger(NacosPropertySourceBuilder.class); - private static final Map EMPTY_MAP = new LinkedHashMap(); + private static final Map EMPTY_MAP = Collections.emptyMap(); private ConfigService configService; @@ -71,14 +73,15 @@ public class NacosPropertySourceBuilder { */ NacosPropertySource build(String dataId, String group, String fileExtension, boolean isRefreshable) { - Map p = loadNacosData(dataId, group, fileExtension); - NacosPropertySource nacosPropertySource = new NacosPropertySource(group, dataId, - p, new Date(), isRefreshable); + List> propertySources = loadNacosData(dataId, group, + fileExtension); + NacosPropertySource nacosPropertySource = new NacosPropertySource(propertySources, + group, dataId, new Date(), isRefreshable); NacosPropertySourceRepository.collectNacosPropertySource(nacosPropertySource); return nacosPropertySource; } - private Map loadNacosData(String dataId, String group, + private List> loadNacosData(String dataId, String group, String fileExtension) { String data = null; try { @@ -87,24 +90,23 @@ public class NacosPropertySourceBuilder { log.warn( "Ignore the empty nacos configuration and get it based on dataId[{}] & group[{}]", dataId, group); - return EMPTY_MAP; + return Collections.emptyList(); } if (log.isDebugEnabled()) { log.debug(String.format( "Loading nacos data, dataId: '%s', group: '%s', data: %s", dataId, group, data)); } - Map dataMap = NacosDataParserHandler.getInstance() - .parseNacosData(data, fileExtension); - return dataMap == null ? EMPTY_MAP : dataMap; + return NacosDataParserHandler.getInstance().parseNacosData(dataId, data, + fileExtension); } catch (NacosException e) { - log.error("get data from Nacos error,dataId:{}, ", dataId, e); + log.error("get data from Nacos error,dataId:{} ", dataId, e); } catch (Exception e) { - log.error("parse data from Nacos error,dataId:{},data:{},", dataId, data, e); + log.error("parse data from Nacos error,dataId:{},data:{}", dataId, data, e); } - return EMPTY_MAP; + return Collections.emptyList(); } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceLocator.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceLocator.java index ef075bcb..2712d15d 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceLocator.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceLocator.java @@ -21,7 +21,6 @@ import java.util.List; import com.alibaba.cloud.nacos.NacosConfigManager; import com.alibaba.cloud.nacos.NacosConfigProperties; import com.alibaba.cloud.nacos.NacosPropertySourceRepository; -import com.alibaba.cloud.nacos.parser.NacosDataParserHandler; import com.alibaba.cloud.nacos.refresh.NacosContextRefresher; import com.alibaba.nacos.api.config.ConfigService; import org.slf4j.Logger; @@ -101,7 +100,6 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { loadSharedConfiguration(composite); loadExtConfiguration(composite); loadApplicationConfiguration(composite, dataIdPrefix, nacosConfigProperties, env); - return composite; } @@ -165,7 +163,6 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { private void checkConfiguration(List configs, String tips) { - String[] dataIds = new String[configs.size()]; for (int i = 0; i < configs.size(); i++) { String dataId = configs.get(i).getDataId(); if (dataId == null || dataId.trim().length() == 0) { @@ -173,10 +170,7 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { "the [ spring.cloud.nacos.config.%s[%s] ] must give a dataId", tips, i)); } - dataIds[i] = dataId; } - // Just decide that the current dataId must have a suffix - NacosDataParserHandler.getInstance().checkDataId(dataIds); } private void loadNacosDataIfPresent(final CompositePropertySource composite, diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java index d5b51660..d00dfe63 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java @@ -36,7 +36,7 @@ import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; * * @author xiaojing */ -@Endpoint(id = "nacos-config") +@Endpoint(id = "nacosconfig") public class NacosConfigEndpoint { private final NacosConfigProperties properties; diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractPropertySourceLoader.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractPropertySourceLoader.java new file mode 100644 index 00000000..0e4cdeb0 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractPropertySourceLoader.java @@ -0,0 +1,129 @@ +/* + * Copyright 2013-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 + * + * https://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 com.alibaba.cloud.nacos.parser; + +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.springframework.boot.env.PropertySourceLoader; +import org.springframework.core.env.PropertySource; +import org.springframework.core.io.Resource; +import org.springframework.util.StringUtils; + +import static com.alibaba.cloud.nacos.parser.AbstractNacosDataParser.DOT; + +/** + * Nacos-specific loader, If need to support other methods of parsing,you need to do the + * following steps: + *

+ * 1.inherit {@link AbstractPropertySourceLoader} ;
+ * 2. define the file{@code spring.factories} and append + * {@code org.springframework.boot.env.PropertySourceLoader=..};
+ * 3.the last step validate. + *

+ * Notice the use of {@link NacosByteArrayResource} . + * + * @author zkz + */ +public abstract class AbstractPropertySourceLoader implements PropertySourceLoader { + + /** + * Prevent interference with other loaders.Nacos-specific loader, unless the reload + * changes it. + * @param name the root name of the property source. If multiple documents are loaded + * an additional suffix should be added to the name for each source loaded. + * @param resource the resource to load + * @return if the resource can be loaded + */ + protected boolean canLoad(String name, Resource resource) { + return resource instanceof NacosByteArrayResource; + } + + /** + * Load the resource into one or more property sources. Implementations may either + * return a list containing a single source, or in the case of a multi-document format + * such as yaml a source for each document in the resource. + * @param name the root name of the property source. If multiple documents are loaded + * an additional suffix should be added to the name for each source loaded. + * @param resource the resource to load + * @return a list property sources + * @throws IOException if the source cannot be loaded + */ + @Override + public List> load(String name, Resource resource) + throws IOException { + if (!canLoad(name, resource)) { + return Collections.emptyList(); + } + return this.doLoad(name, resource); + } + + /** + * Load the resource into one or more property sources. Implementations may either + * return a list containing a single source, or in the case of a multi-document format + * such as yaml a source for each document in the resource. + * @param name the root name of the property source. If multiple documents are loaded + * an additional suffix should be added to the name for each source loaded. + * @param resource the resource to load + * @return a list property sources + * @throws IOException if the source cannot be loaded + */ + protected abstract List> doLoad(String name, Resource resource) + throws IOException; + + protected void flattenedMap(Map result, Map dataMap, + String parentKey) { + if (dataMap == null || dataMap.isEmpty()) { + return; + } + Set> entries = dataMap.entrySet(); + for (Iterator> iterator = entries.iterator(); iterator + .hasNext();) { + Map.Entry entry = iterator.next(); + String key = entry.getKey(); + Object value = entry.getValue(); + + String fullKey = StringUtils.isEmpty(parentKey) ? key : key.startsWith("[") + ? parentKey.concat(key) : parentKey.concat(DOT).concat(key); + + if (value instanceof Map) { + Map map = (Map) value; + flattenedMap(result, map, fullKey); + continue; + } + else if (value instanceof Collection) { + int count = 0; + Collection collection = (Collection) value; + for (Object object : collection) { + flattenedMap(result, + Collections.singletonMap("[" + (count++) + "]", object), + fullKey); + } + continue; + } + + result.put(fullKey, value); + } + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosByteArrayResource.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosByteArrayResource.java new file mode 100644 index 00000000..37ff9a59 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosByteArrayResource.java @@ -0,0 +1,60 @@ +/* + * Copyright 2013-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 + * + * https://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 com.alibaba.cloud.nacos.parser; + +import org.springframework.core.io.ByteArrayResource; + +/** + * Nacos-specific resource. + * + * @author zkz + */ +public class NacosByteArrayResource extends ByteArrayResource { + + private String filename; + + /** + * Create a new {@code ByteArrayResource}. + * @param byteArray the byte array to wrap + */ + public NacosByteArrayResource(byte[] byteArray) { + super(byteArray); + } + + /** + * Create a new {@code ByteArrayResource} with a description. + * @param byteArray the byte array to wrap + * @param description where the byte array comes from + */ + public NacosByteArrayResource(byte[] byteArray, String description) { + super(byteArray, description); + } + + public void setFilename(String filename) { + this.filename = filename; + } + + /** + * This implementation always returns {@code null}, assuming that this resource type + * does not have a filename. + */ + @Override + public String getFilename() { + return null == this.filename ? this.getDescription() : this.filename; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java deleted file mode 100644 index d33cf62f..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2013-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 - * - * https://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 com.alibaba.cloud.nacos.parser; - -import java.io.IOException; -import java.util.LinkedHashMap; -import java.util.Map; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; - -/** - * @author zkz - * @author yuhuangbin - */ -public class NacosDataJsonParser extends AbstractNacosDataParser { - - protected NacosDataJsonParser() { - super("json"); - } - - @Override - protected Map doParse(String data) throws IOException { - if (StringUtils.isEmpty(data)) { - return null; - } - Map map = parseJSON2Map(data); - return this.reloadMap(map); - } - - /** - * JSON to Map. - * @param json json data - * @return the map convert by json string - * @throws IOException thrown if there is a problem parsing config. - */ - private Map parseJSON2Map(String json) throws IOException { - Map result = new LinkedHashMap<>(32); - - ObjectMapper mapper = new ObjectMapper(); - Map nacosDataMap = mapper.readValue(json, LinkedHashMap.class); - - if (CollectionUtils.isEmpty(nacosDataMap)) { - return result; - } - flattenedMap(result, nacosDataMap, EMPTY_STRING); - return result; - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataParserHandler.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataParserHandler.java index f5787e79..efc3f391 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataParserHandler.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataParserHandler.java @@ -17,63 +17,139 @@ package com.alibaba.cloud.nacos.parser; import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import org.springframework.boot.env.OriginTrackedMapPropertySource; +import org.springframework.boot.env.PropertySourceLoader; +import org.springframework.core.env.EnumerablePropertySource; +import org.springframework.core.env.PropertySource; +import org.springframework.core.io.support.SpringFactoriesLoader; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; /** * @author zkz */ public final class NacosDataParserHandler { - private AbstractNacosDataParser parser; + /** + * symbol: dot. + */ + public static final String DOT = "."; + + /** + * constant. + */ + public static final String VALUE = "value"; + + /** + * default extension. + */ + public static final String DEFAULT_EXTENSION = "properties"; + + private static List propertySourceLoaders; private NacosDataParserHandler() { - parser = this.createParser(); + propertySourceLoaders = SpringFactoriesLoader + .loadFactories(PropertySourceLoader.class, getClass().getClassLoader()); } /** * Parsing nacos configuration content. - * @param data config from Nacos - * @param extension file extension. json or xml or yml or yaml or properties - * @return result of LinkedHashMap + * @param configName name of nacos-config + * @param configValue value from nacos-config + * @param extension identifies the type of configValue + * @return result of Map * @throws IOException thrown if there is a problem parsing config. */ - public Map parseNacosData(String data, String extension) - throws IOException { - if (null == parser) { - parser = this.createParser(); + public List> parseNacosData(String configName, String configValue, + String extension) throws IOException { + if (StringUtils.isEmpty(configValue)) { + return Collections.emptyList(); } - return parser.parseNacosData(data, extension); + if (StringUtils.isEmpty(extension)) { + extension = this.getFileExtension(configName); + } + for (PropertySourceLoader propertySourceLoader : propertySourceLoaders) { + if (!canLoadFileExtension(propertySourceLoader, extension)) { + continue; + } + NacosByteArrayResource nacosByteArrayResource = new NacosByteArrayResource( + configValue.getBytes(), configName); + nacosByteArrayResource.setFilename(getFileName(configName, extension)); + List> propertySourceList = propertySourceLoader + .load(configName, nacosByteArrayResource); + if (CollectionUtils.isEmpty(propertySourceList)) { + return Collections.emptyList(); + } + return propertySourceList.stream().filter(Objects::nonNull) + .map(propertySource -> { + if (propertySource instanceof EnumerablePropertySource) { + String[] propertyNames = ((EnumerablePropertySource) propertySource) + .getPropertyNames(); + if (propertyNames != null && propertyNames.length > 0) { + Map map = new LinkedHashMap<>(); + Arrays.stream(propertyNames).forEach(name -> { + map.put(name, propertySource.getProperty(name)); + }); + return new OriginTrackedMapPropertySource( + propertySource.getName(), map); + } + } + return propertySource; + }).collect(Collectors.toList()); + } + return Collections.emptyList(); } /** - * check the validity of file extensions in dataid. - * @param dataIdAry array of dataId - * @return dataId handle success or not + * check the current extension can be processed. + * @param loader the propertySourceLoader + * @param extension file extension + * @return if can match extension */ - public boolean checkDataId(String... dataIdAry) { - StringBuilder stringBuilder = new StringBuilder(); - for (String dataId : dataIdAry) { - int idx = dataId.lastIndexOf(AbstractNacosDataParser.DOT); - if (idx > 0 && idx < dataId.length() - 1) { - String extension = dataId.substring(idx + 1); - if (parser.checkFileExtension(extension)) { - break; - } - } - // add tips - stringBuilder.append(dataId).append(","); - } - if (stringBuilder.length() > 0) { - String result = stringBuilder.substring(0, stringBuilder.length() - 1); - throw new IllegalStateException(AbstractNacosDataParser.getTips(result)); - } - return true; + private boolean canLoadFileExtension(PropertySourceLoader loader, String extension) { + return Arrays.stream(loader.getFileExtensions()) + .anyMatch((fileExtension) -> StringUtils.endsWithIgnoreCase(extension, + fileExtension)); } - private AbstractNacosDataParser createParser() { - return new NacosDataPropertiesParser().addNextParser(new NacosDataYamlParser()) - .addNextParser(new NacosDataXmlParser()) - .addNextParser(new NacosDataJsonParser()); + /** + * @param name filename + * @return file extension, default {@code DEFAULT_EXTENSION} if don't get + */ + public String getFileExtension(String name) { + if (StringUtils.isEmpty(name)) { + return DEFAULT_EXTENSION; + } + int idx = name.lastIndexOf(DOT); + if (idx > 0 && idx < name.length() - 1) { + return name.substring(idx + 1); + } + return DEFAULT_EXTENSION; + } + + private String getFileName(String name, String extension) { + if (StringUtils.isEmpty(extension)) { + return name; + } + if (StringUtils.isEmpty(name)) { + return extension; + } + int idx = name.lastIndexOf(DOT); + if (idx > 0 && idx < name.length() - 1) { + String ext = name.substring(idx + 1); + if (extension.equalsIgnoreCase(ext)) { + return name; + } + } + return name + DOT + extension; } public static NacosDataParserHandler getInstance() { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataYamlParser.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataYamlParser.java deleted file mode 100644 index b963a097..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataYamlParser.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2013-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 - * - * https://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 com.alibaba.cloud.nacos.parser; - -import java.util.LinkedHashMap; -import java.util.Map; - -import org.springframework.beans.factory.config.YamlMapFactoryBean; -import org.springframework.core.io.ByteArrayResource; - -/** - * @author zkz - */ -public class NacosDataYamlParser extends AbstractNacosDataParser { - - public NacosDataYamlParser() { - super(",yml,yaml,"); - } - - @Override - protected Map doParse(String data) { - YamlMapFactoryBean yamlFactory = new YamlMapFactoryBean(); - yamlFactory.setResources(new ByteArrayResource(data.getBytes())); - - Map result = new LinkedHashMap<>(); - flattenedMap(result, yamlFactory.getObject(), EMPTY_STRING); - return result; - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosJsonPropertySourceLoader.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosJsonPropertySourceLoader.java new file mode 100644 index 00000000..b3b2d267 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosJsonPropertySourceLoader.java @@ -0,0 +1,92 @@ +/* + * Copyright 2013-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 + * + * https://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 com.alibaba.cloud.nacos.parser; + +import java.io.IOException; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.springframework.boot.env.OriginTrackedMapPropertySource; +import org.springframework.core.env.PropertySource; +import org.springframework.core.io.Resource; + +import static com.alibaba.cloud.nacos.parser.AbstractNacosDataParser.DOT; +import static com.alibaba.cloud.nacos.parser.AbstractNacosDataParser.VALUE; + +/** + * @author zkz + */ +public class NacosJsonPropertySourceLoader extends AbstractPropertySourceLoader { + + /** + * Returns the file extensions that the loader supports (excluding the '.'). + * @return the file extensions + */ + @Override + public String[] getFileExtensions() { + return new String[] { "json" }; + } + + /** + * Load the resource into one or more property sources. Implementations may either + * return a list containing a single source, or in the case of a multi-document format + * such as yaml a source for each document in the resource. + * @param name the root name of the property source. If multiple documents are loaded + * an additional suffix should be added to the name for each source loaded. + * @param resource the resource to load + * @return a list property sources + * @throws IOException if the source cannot be loaded + */ + @Override + protected List> doLoad(String name, Resource resource) + throws IOException { + Map result = new LinkedHashMap<>(32); + ObjectMapper mapper = new ObjectMapper(); + Map nacosDataMap = mapper.readValue(resource.getInputStream(), + LinkedHashMap.class); + flattenedMap(result, nacosDataMap, null); + return Collections.singletonList( + new OriginTrackedMapPropertySource(name, this.reloadMap(result))); + + } + + /** + * Reload the key ending in `value` if need. + */ + protected Map reloadMap(Map map) { + if (map == null || map.isEmpty()) { + return null; + } + Map result = new LinkedHashMap<>(map); + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + if (key.contains(DOT)) { + int idx = key.lastIndexOf(DOT); + String suffix = key.substring(idx + 1); + if (VALUE.equalsIgnoreCase(suffix)) { + result.put(key.substring(0, idx), entry.getValue()); + } + } + } + return result; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosXmlPropertySourceLoader.java similarity index 54% rename from spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosXmlPropertySourceLoader.java index eab890b9..16e333ef 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosXmlPropertySourceLoader.java @@ -17,8 +17,9 @@ package com.alibaba.cloud.nacos.parser; import java.io.IOException; -import java.io.StringReader; +import java.util.Collections; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilder; @@ -28,39 +29,78 @@ 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.boot.env.OriginTrackedMapPropertySource; +import org.springframework.boot.env.PropertiesPropertySourceLoader; +import org.springframework.core.Ordered; +import org.springframework.core.env.PropertySource; +import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; +import static com.alibaba.cloud.nacos.parser.AbstractNacosDataParser.DOT; + /** - * With relatively few usage scenarios, only simple parsing is performed to reduce jar - * dependencies. + * Parsing for XML requires overwriting the default + * {@link PropertiesPropertySourceLoader}, because it internally rigorously validates + * ({@conde DOCTYPE}) THE XML in a way that makes it difficult to customize the + * configuration; at finally, make sure it's in the first place. * * @author zkz */ -public class NacosDataXmlParser extends AbstractNacosDataParser { - - public NacosDataXmlParser() { - super("xml"); - } +public class NacosXmlPropertySourceLoader extends AbstractPropertySourceLoader + implements Ordered { + /** + * Get the order value of this object. + *

+ * Higher values are interpreted as lower priority. As a consequence, the object with + * the lowest value has the highest priority (somewhat analogous to Servlet + * {@code load-on-startup} values). + *

+ * Same order values will result in arbitrary sort positions for the affected objects. + * @return the order value + * @see #HIGHEST_PRECEDENCE + * @see #LOWEST_PRECEDENCE + */ @Override - protected Map doParse(String data) throws IOException { - if (StringUtils.isEmpty(data)) { - return null; - } - Map map = parseXml2Map(data); - return this.reloadMap(map); + public int getOrder() { + return Integer.MIN_VALUE; } - private Map parseXml2Map(String xml) throws IOException { - xml = xml.replaceAll("\\r", "").replaceAll("\\n", "").replaceAll("\\t", ""); + /** + * Returns the file extensions that the loader supports (excluding the '.'). + * @return the file extensions + */ + @Override + public String[] getFileExtensions() { + return new String[] { "xml" }; + } + + /** + * Load the resource into one or more property sources. Implementations may either + * return a list containing a single source, or in the case of a multi-document format + * such as yaml a source for each document in the resource. + * @param name the root name of the property source. If multiple documents are loaded + * an additional suffix should be added to the name for each source loaded. + * @param resource the resource to load + * @return a list property sources + * @throws IOException if the source cannot be loaded + */ + @Override + protected List> doLoad(String name, Resource resource) + throws IOException { + Map nacosDataMap = parseXml2Map(resource); + return Collections + .singletonList(new OriginTrackedMapPropertySource(name, nacosDataMap)); + + } + + private Map parseXml2Map(Resource resource) throws IOException { Map map = new LinkedHashMap<>(32); try { DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); - Document document = documentBuilder - .parse(new InputSource(new StringReader(xml))); + Document document = documentBuilder.parse(resource.getInputStream()); if (null == document) { return null; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/resources/META-INF/spring.factories index 9977a854..aa6bf0d9 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/resources/META-INF/spring.factories @@ -4,4 +4,7 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.alibaba.cloud.nacos.NacosConfigAutoConfiguration,\ com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration org.springframework.boot.diagnostics.FailureAnalyzer=\ -com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureAnalyzer \ No newline at end of file +com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureAnalyzer +org.springframework.boot.env.PropertySourceLoader=\ +com.alibaba.cloud.nacos.parser.NacosJsonPropertySourceLoader,\ +com.alibaba.cloud.nacos.parser.NacosXmlPropertySourceLoader \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationNoSuffixTest.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationNoSuffixTest.java index a5c992ef..7dcdff65 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationNoSuffixTest.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationNoSuffixTest.java @@ -50,7 +50,8 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen */ @RunWith(PowerMockRunner.class) -@PowerMockIgnore("javax.management.*") +@PowerMockIgnore({ "javax.management.*", "javax.xml.parsers.*", + "com.sun.org.apache.xerces.internal.jaxp.*", "org.w3c.dom.*" }) @PowerMockRunnerDelegate(SpringRunner.class) @PrepareForTest({ NacosConfigService.class }) @SpringBootTest(classes = NacosConfigurationNoSuffixTest.TestConfig.class, properties = { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationXmlJsonTest.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationXmlJsonTest.java index b06cfd86..aa6fe504 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationXmlJsonTest.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationXmlJsonTest.java @@ -49,7 +49,8 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen * @author zkz */ @RunWith(PowerMockRunner.class) -@PowerMockIgnore("javax.management.*") +@PowerMockIgnore({ "javax.management.*", "javax.xml.parsers.*", + "com.sun.org.apache.xerces.internal.jaxp.*", "org.w3c.dom.*" }) @PowerMockRunnerDelegate(SpringRunner.class) @PrepareForTest({ NacosConfigService.class }) @SpringBootTest(classes = NacosConfigurationXmlJsonTest.TestConfig.class, properties = { @@ -83,13 +84,15 @@ public class NacosConfigurationXmlJsonTest { throws Throwable { if ("xmlApp.xml".equals(args[0]) && "test-group".equals(args[1])) { - return "\n" + " one\n" + return "" + "\n" + + " one\n" + " \n" + " three\n" + " \n" + ""; } if ("test-name.xml".equals(args[0]) && "test-group".equals(args[1])) { - return " \n" + return "" + + " \n" + " \n" + " \n" + " 开启服务 \n" @@ -108,7 +111,8 @@ public class NacosConfigurationXmlJsonTest { if ("test-name-dev.xml".equals(args[0]) && "test-group".equals(args[1])) { - return "\n" + return "" + + "\n" + " \n" + " \n" diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/pom.xml index 50a1162a..37342001 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/pom.xml @@ -136,15 +136,16 @@ org.junit.jupiter junit-jupiter 5.5.2 - compile + test org.mockito mockito-junit-jupiter 3.1.0 - compile + test + diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java index 3ee047b4..632448db 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java @@ -183,17 +183,17 @@ public class NacosDiscoveryProperties { private String secretKey; /** - * Heart beat interval. Time unit: second. + * Heart beat interval. Time unit: millisecond. */ private Integer heartBeatInterval; /** - * Heart beat timeout. Time unit: second. + * Heart beat timeout. Time unit: millisecond. */ private Integer heartBeatTimeout; /** - * Ip delete timeout. Time unit: second. + * Ip delete timeout. Time unit: millisecond. */ private Integer ipDeleteTimeout; diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java index b0dd3628..6e1af695 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java @@ -31,7 +31,7 @@ import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; /** * @author xiaojing @@ -58,7 +58,7 @@ public class NacosDiscoveryClientConfiguration { @ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled", matchIfMissing = true) public NacosWatch nacosWatch(NacosServiceManager nacosServiceManager, NacosDiscoveryProperties nacosDiscoveryProperties, - ObjectProvider taskExecutorObjectProvider) { + ObjectProvider taskExecutorObjectProvider) { return new NacosWatch(nacosServiceManager, nacosDiscoveryProperties, taskExecutorObjectProvider); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java index 4a78238f..bcb59035 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java @@ -27,7 +27,6 @@ import java.util.concurrent.atomic.AtomicLong; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.NacosServiceManager; -import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.listener.Event; import com.alibaba.nacos.api.naming.listener.EventListener; @@ -41,7 +40,6 @@ import org.springframework.cloud.client.discovery.event.HeartbeatEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.context.SmartLifecycle; -import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; /** @@ -66,14 +64,15 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl private final NacosDiscoveryProperties properties; - private final TaskScheduler taskScheduler; + private final ThreadPoolTaskScheduler taskScheduler; public NacosWatch(NacosServiceManager nacosServiceManager, NacosDiscoveryProperties properties, - ObjectProvider taskScheduler) { + ObjectProvider taskScheduler) { this.nacosServiceManager = nacosServiceManager; this.properties = properties; - this.taskScheduler = taskScheduler.getIfAvailable(NacosWatch::getTaskScheduler); + this.taskScheduler = taskScheduler.stream().findAny() + .orElseGet(NacosWatch::getTaskScheduler); } private static ThreadPoolTaskScheduler getTaskScheduler() { @@ -156,7 +155,7 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl if (this.watchFuture != null) { // shutdown current user-thread, // then the other daemon-threads will terminate automatic. - ((ThreadPoolTaskScheduler) this.taskScheduler).shutdown(); + this.taskScheduler.shutdown(); this.watchFuture.cancel(true); } @@ -167,7 +166,7 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl namingService.unsubscribe(properties.getService(), properties.getGroup(), Arrays.asList(properties.getClusterName()), eventListener); } - catch (NacosException e) { + catch (Exception e) { log.error("namingService unsubscribe failed, properties:{}", properties, e); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/actuate/health/NacosDiscoveryHealthIndicator.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/actuate/health/NacosDiscoveryHealthIndicator.java index ea63c583..5a925ec3 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/actuate/health/NacosDiscoveryHealthIndicator.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/actuate/health/NacosDiscoveryHealthIndicator.java @@ -26,6 +26,7 @@ import org.springframework.boot.actuate.health.HealthIndicator; * The {@link HealthIndicator} for Nacos Discovery. * * @author Mercy + * @since 2.2.0 * @see HealthIndicator */ public class NacosDiscoveryHealthIndicator extends AbstractHealthIndicator { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosDiscoveryClientConfigServiceBootstrapConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosDiscoveryClientConfigServiceBootstrapConfiguration.java index f50aca92..4ea8ea5c 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosDiscoveryClientConfigServiceBootstrapConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosDiscoveryClientConfigServiceBootstrapConfiguration.java @@ -16,6 +16,7 @@ package com.alibaba.cloud.nacos.discovery.configclient; +import com.alibaba.cloud.nacos.NacosServiceAutoConfiguration; import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration; import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration; @@ -34,7 +35,7 @@ import org.springframework.context.annotation.Configuration; @ConditionalOnProperty(value = "spring.cloud.config.discovery.enabled", matchIfMissing = false) @Configuration @ImportAutoConfiguration({ NacosDiscoveryAutoConfiguration.class, - NacosDiscoveryClientConfiguration.class }) + NacosServiceAutoConfiguration.class, NacosDiscoveryClientConfiguration.class }) public class NacosDiscoveryClientConfigServiceBootstrapConfiguration { } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java index 9f88830e..b1aea417 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java @@ -36,7 +36,7 @@ import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; * * @author xiaojing */ -@Endpoint(id = "nacos-discovery") +@Endpoint(id = "nacosdiscovery") public class NacosDiscoveryEndpoint { private static final Logger log = LoggerFactory diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java index 0efd8642..9a79a568 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java @@ -41,6 +41,10 @@ import static org.springframework.util.ReflectionUtils.rethrowRuntimeException; */ public class NacosServiceRegistry implements ServiceRegistry { + private static final String STATUS_UP = "UP"; + + private static final String STATUS_DOWN = "DOWN"; + private static final Logger log = LoggerFactory.getLogger(NacosServiceRegistry.class); private final NacosDiscoveryProperties nacosDiscoveryProperties; @@ -119,7 +123,8 @@ public class NacosServiceRegistry implements ServiceRegistry { @Override public void setStatus(Registration registration, String status) { - if (!status.equalsIgnoreCase("UP") && !status.equalsIgnoreCase("DOWN")) { + if (!STATUS_UP.equalsIgnoreCase(status) + && !STATUS_DOWN.equalsIgnoreCase(status)) { log.warn("can't support status {},please choose UP or DOWN", status); return; } @@ -128,7 +133,7 @@ public class NacosServiceRegistry implements ServiceRegistry { Instance instance = getNacosInstanceFromRegistration(registration); - if (status.equalsIgnoreCase("DOWN")) { + if (STATUS_DOWN.equalsIgnoreCase(status)) { instance.setEnabled(false); } else { @@ -137,8 +142,8 @@ public class NacosServiceRegistry implements ServiceRegistry { try { Properties nacosProperties = nacosDiscoveryProperties.getNacosProperties(); - nacosServiceManager.getNamingMaintainService(nacosProperties) - .updateInstance(serviceId, instance); + nacosServiceManager.getNamingMaintainService(nacosProperties).updateInstance( + serviceId, nacosDiscoveryProperties.getGroup(), instance); } catch (Exception e) { throw new RuntimeException("update nacos instance status fail", e); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java index 8d705b04..82cdd317 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java @@ -28,7 +28,7 @@ import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.AbstractLoadBalancerRule; import com.netflix.loadbalancer.DynamicServerListLoadBalancer; import com.netflix.loadbalancer.Server; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json index e7381c30..0987e598 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -1,72 +1,72 @@ {"properties": [ - { - "name": "spring.cloud.nacos.server-addr", - "type": "java.lang.String", - "defaultValue": "localhost:8848", - "description": "nacos server address." - }, - { - "name": "spring.cloud.nacos.discovery.server-addr", - "type": "java.lang.String", - "defaultValue": "${spring.cloud.nacos.server-addr}", - "description": "nacos discovery server address." - }, - { - "name": "spring.cloud.nacos.discovery.service", - "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.enabled", - "type": "java.lang.Boolean", - "defaultValue": true, - "description": "enable nacos discovery or not." - }, - { - "name": "spring.cloud.nacos.discovery.instance-enabled", - "type": "java.lang.Boolean", - "defaultValue": true, - "description": "If instance is enabled to accept request. The default value is true." - }, - { - "name": "spring.cloud.nacos.discovery.ephemeral", - "type": "java.lang.Boolean", - "defaultValue": true, - "description": "If instance is ephemeral.The default value is true." - }, - { - "name": "spring.cloud.nacos.discovery.namingLoadCacheAtStart", - "type": "java.lang.Boolean", - "defaultValue": "false", - "description": "naming load from local cache at application start ." - }, - { - "name": "spring.cloud.nacos.discovery.watch.enabled", - "type": "java.lang.Boolean", - "defaultValue": "true", - "description": "enable nacos discovery watch or not ." - }, - { - "name": "spring.cloud.nacos.discovery.username", - "type": "java.lang.String", - "defaultValue": "${spring.cloud.nacos.username}", - "description": "nacos discovery service's username to authenticate." - }, - { - "name": "spring.cloud.nacos.discovery.password", - "type": "java.lang.String", - "defaultValue": "${spring.cloud.nacos.password}", - "description": "nacos discovery service's password to authenticate." - }, - { - "name": "spring.cloud.nacos.username", - "type": "java.lang.String", - "description": "nacos userName to authenticate." - }, - { - "name": "spring.cloud.nacos.password", - "type": "java.lang.String", - "description": "nacos password to authenticate." - } + { + "name": "spring.cloud.nacos.server-addr", + "type": "java.lang.String", + "defaultValue": "localhost:8848", + "description": "nacos server address." + }, + { + "name": "spring.cloud.nacos.discovery.server-addr", + "type": "java.lang.String", + "defaultValue": "${spring.cloud.nacos.server-addr}", + "description": "nacos discovery server address." + }, + { + "name": "spring.cloud.nacos.discovery.service", + "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.enabled", + "type": "java.lang.Boolean", + "defaultValue": true, + "description": "enable nacos discovery or not." + }, + { + "name": "spring.cloud.nacos.discovery.instance-enabled", + "type": "java.lang.Boolean", + "defaultValue": true, + "description": "If instance is enabled to accept request. The default value is true." + }, + { + "name": "spring.cloud.nacos.discovery.ephemeral", + "type": "java.lang.Boolean", + "defaultValue": true, + "description": "If instance is ephemeral.The default value is true." + }, + { + "name": "spring.cloud.nacos.discovery.namingLoadCacheAtStart", + "type": "java.lang.Boolean", + "defaultValue": "false", + "description": "naming load from local cache at application start ." + }, + { + "name": "spring.cloud.nacos.discovery.watch.enabled", + "type": "java.lang.Boolean", + "defaultValue": "true", + "description": "enable nacos discovery watch or not ." + }, + { + "name": "spring.cloud.nacos.discovery.username", + "type": "java.lang.String", + "defaultValue": "${spring.cloud.nacos.username}", + "description": "nacos discovery service's username to authenticate." + }, + { + "name": "spring.cloud.nacos.discovery.password", + "type": "java.lang.String", + "defaultValue": "${spring.cloud.nacos.password}", + "description": "nacos discovery service's password to authenticate." + }, + { + "name": "spring.cloud.nacos.username", + "type": "java.lang.String", + "description": "nacos userName to authenticate." + }, + { + "name": "spring.cloud.nacos.password", + "type": "java.lang.String", + "description": "nacos password to authenticate." + } ]} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/spring.factories index e2c189e2..fd1eca5d 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/spring.factories @@ -4,7 +4,7 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration,\ com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\ com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\ - com.alibaba.cloud.nacos.NacosServiceAutoConfiguration,\ - com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration + com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration,\ + com.alibaba.cloud.nacos.NacosServiceAutoConfiguration org.springframework.cloud.bootstrap.BootstrapConfiguration=\ com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizerTest.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizerTest.java new file mode 100644 index 00000000..be45b01d --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizerTest.java @@ -0,0 +1,103 @@ +/* + * Copyright 2013-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 + * + * https://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 com.alibaba.cloud.nacos.registry; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Properties; + +import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration; +import com.alibaba.nacos.api.NacosFactory; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.api.support.MethodProxy; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +/** + * @author L.cm + */ +@RunWith(PowerMockRunner.class) +@PowerMockIgnore("javax.management.*") +@PowerMockRunnerDelegate(SpringRunner.class) +@PrepareForTest({ NacosFactory.class }) +@SpringBootTest(classes = NacosRegistrationCustomizerTest.TestConfig.class, properties = { + "spring.application.name=myTestService1", + "spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848" }, webEnvironment = RANDOM_PORT) +public class NacosRegistrationCustomizerTest { + + @Autowired + private NacosAutoServiceRegistration nacosAutoServiceRegistration; + + static { + try { + Method method = PowerMockito.method(NacosFactory.class, "createNamingService", + Properties.class); + MethodProxy.proxy(method, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + return new MockNamingService(); + } + }); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + @Test + public void contextLoads() throws Exception { + NacosRegistration registration = nacosAutoServiceRegistration.getRegistration(); + Map metadata = registration.getMetadata(); + Assert.assertEquals("test1", metadata.get("test1")); + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ AutoServiceRegistrationConfiguration.class, + NacosDiscoveryClientConfiguration.class, + NacosServiceRegistryAutoConfiguration.class }) + public static class TestConfig { + + @Bean + public NacosRegistrationCustomizer nacosRegistrationCustomizer() { + return registration -> { + Map metadata = registration.getMetadata(); + metadata.put("test1", "test1"); + }; + } + + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java index 2aa507bd..d0a1528b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java @@ -36,6 +36,7 @@ import io.seata.core.context.RootContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; @@ -156,11 +157,15 @@ public class SeataHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy public K call() throws Exception { try { RequestContextHolder.setRequestAttributes(requestAttributes); - RootContext.bind(xid); + if (!StringUtils.isEmpty(xid)) { + RootContext.bind(xid); + } return actual.call(); } finally { - RootContext.unbind(); + if (!StringUtils.isEmpty(xid)) { + RootContext.unbind(); + } RequestContextHolder.resetRequestAttributes(); } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java index 6ddedb1b..f7ec7659 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java @@ -43,7 +43,6 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - String xid = RootContext.getXID(); String rpcXid = request.getHeader(RootContext.KEY_XID); if (log.isDebugEnabled()) { @@ -56,6 +55,7 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { log.debug("bind {} to RootContext", rpcXid); } } + return true; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpointAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpointAutoConfiguration.java index caa5afd2..a583874b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpointAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpointAutoConfiguration.java @@ -19,7 +19,6 @@ package com.alibaba.cloud.sentinel.endpoint; import com.alibaba.cloud.sentinel.SentinelProperties; import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -36,7 +35,6 @@ public class SentinelEndpointAutoConfiguration { @Bean @ConditionalOnMissingBean - @ConditionalOnEnabledEndpoint public SentinelEndpoint sentinelEndPoint(SentinelProperties sentinelProperties) { return new SentinelEndpoint(sentinelProperties); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 49b06b0d..97dd52e7 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -24,7 +24,8 @@ "defaultValue": true, "description": "Specify whether unify web context(i.e. use the default context name), and is true by default." }, - { "name": "spring.cloud.sentinel.transport.port", + { + "name": "spring.cloud.sentinel.transport.port", "type": "java.lang.String", "defaultValue": "8719", "description": "sentinel api port." diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/SidecarHealthChecker.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/SidecarHealthChecker.java index fabccd12..eaf42639 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/SidecarHealthChecker.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/SidecarHealthChecker.java @@ -79,6 +79,7 @@ public class SidecarHealthChecker { "Health check failed. unregister this instance. applicationName = {}, ip = {}, port = {}, status = {}", applicationName, ip, port, status); this.sidecarDiscoveryClient.deregisterInstance(applicationName, ip, port); + sidecarInstanceCacheMap.put(applicationName, buildCache(ip, port, status)); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryClient.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryClient.java index 86735833..d8229478 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryClient.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryClient.java @@ -37,6 +37,7 @@ public class SidecarNacosDiscoveryClient implements SidecarDiscoveryClient { public SidecarNacosDiscoveryClient(NacosServiceManager nacosServiceManager, SidecarNacosDiscoveryProperties sidecarNacosDiscoveryProperties) { + this.nacosServiceManager = nacosServiceManager; this.sidecarNacosDiscoveryProperties = sidecarNacosDiscoveryProperties; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryProperties.java index a6c5a978..1a7a6d87 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryProperties.java @@ -22,7 +22,6 @@ import com.alibaba.cloud.sidecar.SidecarProperties; import org.springframework.util.StringUtils; /** - * @author itmuch.com * @author yuhuangbin */ public class SidecarNacosDiscoveryProperties extends NacosDiscoveryProperties { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/pom.xml index a4351c6c..34b013b7 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/pom.xml @@ -3,8 +3,7 @@ xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - - + com.alibaba.cloud spring-cloud-alibaba-starters ${revision} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationAutoConfiguration.java index 3415bcee..b4cc2d4a 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationAutoConfiguration.java @@ -17,18 +17,25 @@ package com.alibaba.cloud.dubbo.autoconfigure; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import com.alibaba.cloud.dubbo.autoconfigure.condition.MissingSpringCloudRegistryConfigPropertyCondition; +import com.alibaba.cloud.dubbo.bootstrap.DubboBootstrapStartCommandLineRunner; +import com.alibaba.cloud.dubbo.bootstrap.DubboBootstrapWrapper; +import com.alibaba.cloud.dubbo.bootstrap.event.DubboBootstrapStartedEvent; import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; import com.alibaba.cloud.dubbo.registry.DubboServiceRegistrationEventPublishingAspect; +import com.alibaba.cloud.dubbo.registry.event.ServiceInstancePreDeregisteredEvent; import com.alibaba.cloud.dubbo.registry.event.ServiceInstancePreRegisteredEvent; import com.ecwid.consul.v1.agent.model.NewService; import com.netflix.appinfo.InstanceInfo; import org.apache.dubbo.config.RegistryConfig; +import org.apache.dubbo.config.bootstrap.DubboBootstrap; import org.apache.dubbo.config.spring.ServiceBean; -import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +49,9 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.cloud.client.serviceregistry.ServiceRegistry; import org.springframework.cloud.consul.serviceregistry.ConsulRegistration; +import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean; import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaAutoServiceRegistration; import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration; import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaServiceRegistry; @@ -63,9 +72,11 @@ import static org.springframework.util.ObjectUtils.isEmpty; * Dubbo Service Registration Auto-{@link Configuration}. * * @author Mercy + * @author theonefx */ @Configuration -@Import({ DubboServiceRegistrationEventPublishingAspect.class }) +@Import({ DubboServiceRegistrationEventPublishingAspect.class, + DubboBootstrapStartCommandLineRunner.class }) @ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true) @AutoConfigureAfter(name = { EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME, CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME, @@ -105,10 +116,42 @@ public class DubboServiceRegistrationAutoConfiguration { return new RegistryConfig(ADDRESS, PROTOCOL); } + private Map, Set> registrations = new ConcurrentHashMap<>(); + + @EventListener(DubboBootstrapStartedEvent.class) + public void onDubboBootstrapStarted(DubboBootstrapStartedEvent event) { + if (!event.getSource().isReady()) { + return; + } + registrations.forEach( + (registry, registrations) -> registrations.forEach(registration -> { + attachDubboMetadataServiceMetadata(registration); + registry.register(registration); + })); + } + @EventListener(ServiceInstancePreRegisteredEvent.class) public void onServiceInstancePreRegistered(ServiceInstancePreRegisteredEvent event) { Registration registration = event.getSource(); - attachDubboMetadataServiceMetadata(registration); + if (!DubboBootstrap.getInstance().isReady() + || !DubboBootstrap.getInstance().isStarted()) { + ServiceRegistry registry = event.getRegistry(); + synchronized (registry) { + registrations.putIfAbsent(registry, new HashSet<>()); + registrations.get(registry).add(registration); + } + } + else { + attachDubboMetadataServiceMetadata(registration); + } + + } + + @EventListener(ServiceInstancePreDeregisteredEvent.class) + public void onServiceInstancePreDeregistered( + ServiceInstancePreDeregisteredEvent event) { + ServiceRegistry registry = event.getRegistry(); + registrations.remove(registry); } private void attachDubboMetadataServiceMetadata(Registration registration) { @@ -131,21 +174,67 @@ public class DubboServiceRegistrationAutoConfiguration { @Configuration @ConditionalOnBean(name = EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME) - @Aspect class EurekaConfiguration implements SmartInitializingSingleton { @Autowired private ObjectProvider> serviceBeans; + @EventListener(DubboBootstrapStartedEvent.class) + public void onDubboBootstrapStarted(DubboBootstrapStartedEvent event) { + DubboBootstrapWrapper wrapper = event.getSource(); + if (!wrapper.isReady()) { + return; + } + registrations.forEach( + (registry, registrations) -> registrations.removeIf(registration -> { + if (!(registration instanceof EurekaRegistration)) { + return false; + } + EurekaRegistration eurekaRegistration = (EurekaRegistration) registration; + InstanceInfo instanceInfo = eurekaRegistration + .getApplicationInfoManager().getInfo(); + + EurekaInstanceConfigBean config = (EurekaInstanceConfigBean) eurekaRegistration + .getInstanceConfig(); + config.setInitialStatus(InstanceInfo.InstanceStatus.UP); + + attachDubboMetadataServiceMetadata(instanceInfo.getMetadata()); + eurekaRegistration.getApplicationInfoManager() + .registerAppMetadata(instanceInfo.getMetadata()); + eurekaRegistration.getApplicationInfoManager() + .setInstanceStatus(InstanceInfo.InstanceStatus.UP); + return true; + })); + } + @EventListener(ServiceInstancePreRegisteredEvent.class) public void onServiceInstancePreRegistered( ServiceInstancePreRegisteredEvent event) { Registration registration = event.getSource(); - EurekaRegistration eurekaRegistration = EurekaRegistration.class - .cast(registration); - InstanceInfo instanceInfo = eurekaRegistration.getApplicationInfoManager() - .getInfo(); - attachDubboMetadataServiceMetadata(instanceInfo.getMetadata()); + if (!(registration instanceof EurekaRegistration)) { + return; + } + + if (DubboBootstrap.getInstance().isReady() + && DubboBootstrap.getInstance().isStarted()) { + EurekaRegistration eurekaRegistration = (EurekaRegistration) registration; + InstanceInfo instanceInfo = eurekaRegistration.getApplicationInfoManager() + .getInfo(); + + EurekaInstanceConfigBean config = (EurekaInstanceConfigBean) eurekaRegistration + .getInstanceConfig(); + config.setInitialStatus(InstanceInfo.InstanceStatus.UP); + + attachDubboMetadataServiceMetadata(instanceInfo.getMetadata()); + eurekaRegistration.getApplicationInfoManager() + .registerAppMetadata(instanceInfo.getMetadata()); + } + else { + EurekaRegistration eurekaRegistration = (EurekaRegistration) registration; + EurekaInstanceConfigBean config = (EurekaInstanceConfigBean) eurekaRegistration + .getInstanceConfig(); + config.setInitialStatus(InstanceInfo.InstanceStatus.STARTING); + } } /** @@ -170,21 +259,28 @@ public class DubboServiceRegistrationAutoConfiguration { @AutoConfigureOrder class ConsulConfiguration { - /** - * Handle the pre-registered event of {@link ServiceInstance} for Consul. - * @param event {@link ServiceInstancePreRegisteredEvent} - */ - @EventListener(ServiceInstancePreRegisteredEvent.class) - public void onServiceInstancePreRegistered( - ServiceInstancePreRegisteredEvent event) { - Registration registration = event.getSource(); - Class registrationClass = AopUtils.getTargetClass(registration); - String registrationClassName = registrationClass.getName(); - if (CONSUL_AUTO_SERVICE_AUTO_REGISTRATION_CLASS_NAME - .equalsIgnoreCase(registrationClassName)) { - ConsulRegistration consulRegistration = (ConsulRegistration) registration; - attachURLsIntoMetadata(consulRegistration); + @EventListener(DubboBootstrapStartedEvent.class) + public void attachURLsIntoMetadataBeforeReRegist( + DubboBootstrapStartedEvent event) { + if (!event.getSource().isReady()) { + return; } + registrations.entrySet().removeIf(entry -> { + Set registrations = entry.getValue(); + registrations.removeIf(registration -> { + Class registrationClass = AopUtils.getTargetClass(registration); + String registrationClassName = registrationClass.getName(); + return !CONSUL_AUTO_SERVICE_AUTO_REGISTRATION_CLASS_NAME + .equalsIgnoreCase(registrationClassName); + }); + return registrations.isEmpty(); + }); + + registrations.forEach( + (registry, registrations) -> registrations.forEach(registration -> { + ConsulRegistration consulRegistration = (ConsulRegistration) registration; + attachURLsIntoMetadata(consulRegistration); + })); } private void attachURLsIntoMetadata(ConsulRegistration consulRegistration) { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationNonWebApplicationAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationNonWebApplicationAutoConfiguration.java index a7d19424..d0bb30df 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationNonWebApplicationAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationNonWebApplicationAutoConfiguration.java @@ -103,7 +103,7 @@ public class DubboServiceRegistrationNonWebApplicationAutoConfiguration { */ private void setServerPort() { if (serverPort == null) { - synchronized (this) { + synchronized (DubboServiceRegistrationNonWebApplicationAutoConfiguration.class) { if (serverPort == null) { for (List urls : repository.getAllExportedUrls().values()) { urls.stream().filter( diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboBootstrapStartCommandLineRunner.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboBootstrapStartCommandLineRunner.java new file mode 100644 index 00000000..9f47bb2e --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboBootstrapStartCommandLineRunner.java @@ -0,0 +1,50 @@ +/* + * Copyright 2013-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 + * + * https://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 com.alibaba.cloud.dubbo.bootstrap; + +import com.alibaba.cloud.dubbo.bootstrap.event.DubboBootstrapStartedEvent; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ApplicationEventPublisherAware; +import org.springframework.stereotype.Component; + +/** + * publish Dubbo microsystem startup finish event. + * + * @author theonefx + */ + +@Component +public class DubboBootstrapStartCommandLineRunner + implements CommandLineRunner, ApplicationEventPublisherAware { + + private ApplicationEventPublisher applicationEventPublisher; + + @Override + public void setApplicationEventPublisher( + ApplicationEventPublisher applicationEventPublisher) { + this.applicationEventPublisher = applicationEventPublisher; + } + + @Override + public void run(String... args) { + applicationEventPublisher.publishEvent( + new DubboBootstrapStartedEvent(DubboBootstrapWrapper.getInstance())); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboBootstrapWrapper.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboBootstrapWrapper.java new file mode 100644 index 00000000..60fcaf6a --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboBootstrapWrapper.java @@ -0,0 +1,47 @@ +/* + * Copyright 2013-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 + * + * https://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 com.alibaba.cloud.dubbo.bootstrap; + +import org.apache.dubbo.config.bootstrap.DubboBootstrap; + +/** + * Wrapper DubboBootstrap operation. + * + * @author theonefx + */ +public final class DubboBootstrapWrapper { + + private DubboBootstrapWrapper() { + } + + private static final DubboBootstrapWrapper INSTANCE = new DubboBootstrapWrapper(); + + public static DubboBootstrapWrapper getInstance() { + return INSTANCE; + } + + public boolean isReady() { + return DubboBootstrap.getInstance().isStarted() + && DubboBootstrap.getInstance().isReady() + && DubboBootstrap.getInstance().isInitialized(); + } + + public DubboBootstrap getDubboBootstrap() { + return DubboBootstrap.getInstance(); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/bootstrap/event/DubboBootstrapStartedEvent.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/bootstrap/event/DubboBootstrapStartedEvent.java new file mode 100644 index 00000000..3f14525c --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/bootstrap/event/DubboBootstrapStartedEvent.java @@ -0,0 +1,44 @@ +/* + * Copyright 2013-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 + * + * https://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 com.alibaba.cloud.dubbo.bootstrap.event; + +import com.alibaba.cloud.dubbo.bootstrap.DubboBootstrapWrapper; + +import org.springframework.context.ApplicationEvent; + +/** + * Dubbo microsytem start finish event, every thing is ready. + * + * @author theonefx + */ +public class DubboBootstrapStartedEvent extends ApplicationEvent { + + /** + * Create a new {@code DubboBootstrapStartedEvent}. + * @param source the object on which the event initially occurred or with which the + * event is associated (never {@code null}) + */ + public DubboBootstrapStartedEvent(DubboBootstrapWrapper source) { + super(source); + } + + @Override + public DubboBootstrapWrapper getSource() { + return (DubboBootstrapWrapper) super.getSource(); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractHttpRequestMatcher.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractHttpRequestMatcher.java index a2d3ea75..899229eb 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractHttpRequestMatcher.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractHttpRequestMatcher.java @@ -40,6 +40,7 @@ public abstract class AbstractHttpRequestMatcher implements HttpRequestMatcher { *

* For example {@code " || "} for URL patterns or {@code " && "} for param * expressions. + * @return str */ protected abstract String getToStringInfix(); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java index f6434f3c..40d3bc68 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java @@ -77,7 +77,7 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { /** * Caches the IDs of {@link ApplicationListener}. */ - private static final Set registerListeners = new HashSet<>(); + private static final Set REGISTER_LISTENERS = new HashSet<>(); protected final Logger logger = LoggerFactory.getLogger(getClass()); @@ -193,7 +193,7 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { private void registerServiceInstancesChangedEventListener(URL url, NotifyListener listener) { String listenerId = generateId(url); - if (registerListeners.add(listenerId)) { + if (REGISTER_LISTENERS.add(listenerId)) { applicationContext.addApplicationListener( new ApplicationListener() { @Override @@ -261,7 +261,7 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { String listenerId = generateId(url); // The metaservice will restart the new listener. It needs to be optimized // to see whether the original listener can be reused. - this.registerListeners.remove(listenerId); + REGISTER_LISTENERS.remove(listenerId); } /** diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java index dbede698..be24b11f 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java @@ -83,7 +83,7 @@ public class DubboCloudRegistry extends FailbackRegistry { /** * Caches the IDs of {@link ApplicationListener}. */ - private static final Set registerListeners = new HashSet<>(); + private static final Set REGISTER_LISTENERS = new HashSet<>(); protected final Logger logger = LoggerFactory.getLogger(getClass()); @@ -215,7 +215,7 @@ public class DubboCloudRegistry extends FailbackRegistry { private void registerServiceInstancesChangedListener(URL url, ApplicationListener listener) { String listenerId = generateId(url); - if (registerListeners.add(listenerId)) { + if (REGISTER_LISTENERS.add(listenerId)) { applicationContext.addApplicationListener(listener); } } @@ -290,7 +290,7 @@ public class DubboCloudRegistry extends FailbackRegistry { .map(templateURL -> templateURL.removeParameter(PID_KEY)) .map(templateURL -> { String protocol = templateURL.getProtocol(); - int port = repository.getDubboProtocolPort(serviceInstance, + Integer port = repository.getDubboProtocolPort(serviceInstance, protocol); if (Objects.equals(templateURL.getHost(), host) && Objects.equals(templateURL.getPort(), port)) { // use @@ -300,15 +300,27 @@ public class DubboCloudRegistry extends FailbackRegistry { return templateURL; } - URLBuilder clonedURLBuilder = from(templateURL) // remove the - // parameters from - // the template - // URL - .setHost(host) // reset the host - .setPort(port); // reset the port + if (port == null) { + if (logger.isWarnEnabled()) { + logger.warn( + "The protocol[{}] port of Dubbo service instance[host : {}] " + + "can't be resolved", + protocol, host); + } + return null; + } + else { + URLBuilder clonedURLBuilder = from(templateURL) // remove the + // parameters from + // the template + // URL + .setHost(host) // reset the host + .setPort(port); // reset the port - return clonedURLBuilder.build(); - }).forEach(clonedExportedURLs::add); + return clonedURLBuilder.build(); + } + + }).filter(Objects::nonNull).forEach(clonedExportedURLs::add); }); return clonedExportedURLs; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboServiceRegistrationEventPublishingAspect.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboServiceRegistrationEventPublishingAspect.java index 43e679f5..8cd5c6b7 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboServiceRegistrationEventPublishingAspect.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboServiceRegistrationEventPublishingAspect.java @@ -16,6 +16,7 @@ package com.alibaba.cloud.dubbo.registry; +import com.alibaba.cloud.dubbo.registry.event.ServiceInstancePreDeregisteredEvent; import com.alibaba.cloud.dubbo.registry.event.ServiceInstancePreRegisteredEvent; import com.alibaba.cloud.dubbo.registry.event.ServiceInstanceRegisteredEvent; import org.aspectj.lang.annotation.After; @@ -33,6 +34,7 @@ import org.springframework.context.ApplicationEventPublisherAware; * @author Mercy * @see ServiceInstancePreRegisteredEvent * @see ServiceInstanceRegisteredEvent + * @see ServiceInstancePreDeregisteredEvent */ @Aspect public class DubboServiceRegistrationEventPublishingAspect @@ -41,18 +43,29 @@ public class DubboServiceRegistrationEventPublishingAspect /** * The pointcut expression for {@link ServiceRegistry#register(Registration)}. */ - public static final String REGISTER_POINTCUT_EXPRESSION = "execution(* org.springframework.cloud.client.serviceregistry.ServiceRegistry.register(*)) && args(registration)"; + public static final String REGISTER_POINTCUT_EXPRESSION = "execution(* org.springframework.cloud.client.serviceregistry.ServiceRegistry.register(*)) && target(registry) && args(registration)"; + + /** + * The pointcut expression for {@link ServiceRegistry#deregister(Registration)}. + */ + public static final String DEREGISTER_POINTCUT_EXPRESSION = "execution(* org.springframework.cloud.client.serviceregistry.ServiceRegistry.deregister(*)) && target(registry) && args(registration)"; private ApplicationEventPublisher applicationEventPublisher; - @Before(REGISTER_POINTCUT_EXPRESSION) - public void beforeRegister(Registration registration) { - applicationEventPublisher - .publishEvent(new ServiceInstancePreRegisteredEvent(registration)); + @Before(value = REGISTER_POINTCUT_EXPRESSION, argNames = "registry, registration") + public void beforeRegister(ServiceRegistry registry, Registration registration) { + applicationEventPublisher.publishEvent( + new ServiceInstancePreRegisteredEvent(registry, registration)); } - @After(REGISTER_POINTCUT_EXPRESSION) - public void afterRegister(Registration registration) { + @Before(value = DEREGISTER_POINTCUT_EXPRESSION, argNames = "registry, registration") + public void beforeDeregister(ServiceRegistry registry, Registration registration) { + applicationEventPublisher.publishEvent( + new ServiceInstancePreDeregisteredEvent(registry, registration)); + } + + @After(value = REGISTER_POINTCUT_EXPRESSION, argNames = "registry, registration") + public void afterRegister(ServiceRegistry registry, Registration registration) { applicationEventPublisher .publishEvent(new ServiceInstanceRegisteredEvent(registration)); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancePreDeregisteredEvent.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancePreDeregisteredEvent.java new file mode 100644 index 00000000..5e60be5b --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancePreDeregisteredEvent.java @@ -0,0 +1,49 @@ +/* + * Copyright 2013-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 + * + * https://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 com.alibaba.cloud.dubbo.registry.event; + +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.cloud.client.serviceregistry.ServiceRegistry; +import org.springframework.context.ApplicationEvent; + +/** + * The + * before-{@link org.springframework.cloud.client.serviceregistry.ServiceRegistry#register(org.springframework.cloud.client.serviceregistry.Registration) + * register} event for {@link org.springframework.cloud.client.ServiceInstance}. + * + * @author Mercy + */ +public class ServiceInstancePreDeregisteredEvent extends ApplicationEvent { + + private final ServiceRegistry registry; + + public ServiceInstancePreDeregisteredEvent(ServiceRegistry registry, + Registration source) { + super(source); + this.registry = registry; + } + + @Override + public Registration getSource() { + return (Registration) super.getSource(); + } + + public ServiceRegistry getRegistry() { + return registry; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancePreRegisteredEvent.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancePreRegisteredEvent.java index 4733fef6..e1b905c0 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancePreRegisteredEvent.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancePreRegisteredEvent.java @@ -29,8 +29,12 @@ import org.springframework.context.ApplicationEvent; */ public class ServiceInstancePreRegisteredEvent extends ApplicationEvent { - public ServiceInstancePreRegisteredEvent(Registration source) { + private final ServiceRegistry registry; + + public ServiceInstancePreRegisteredEvent(ServiceRegistry registry, + Registration source) { super(source); + this.registry = registry; } @Override @@ -38,4 +42,8 @@ public class ServiceInstancePreRegisteredEvent extends ApplicationEvent { return (Registration) super.getSource(); } + public ServiceRegistry getRegistry() { + return registry; + } + }