diff --git a/README-zh.md b/README-zh.md index d6972625..c4f7dd96 100644 --- a/README-zh.md +++ b/README-zh.md @@ -1,21 +1,21 @@ # Spring Cloud Alibaba [![CircleCI](https://circleci.com/gh/alibaba/spring-cloud-alibaba/tree/master.svg?style=svg)](https://circleci.com/gh/alibaba/spring-cloud-alibaba/tree/master) -[![Maven Central](https://img.shields.io/maven-central/v/org.springframework.cloud/spring-cloud-alibaba-dependencies.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:org.springframework.cloud%20AND%20a:spring-cloud-alibaba-dependencies) -[![Codecov](https://codecov.io/gh/spring-cloud-incubator/spring-cloud-alibaba/branch/master/graph/badge.svg)](https://codecov.io/gh/spring-cloud-incubator/spring-cloud-alibaba) +[![Maven Central](https://img.shields.io/maven-central/v/com.alibaba.cloud/spring-cloud-alibaba-dependencies.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:com.alibaba.cloud%20AND%20a:spring-cloud-alibaba-dependencies) +[![Codecov](https://codecov.io/gh/alibaba/spring-cloud-alibaba/branch/master/graph/badge.svg)](https://codecov.io/gh/alibaba/spring-cloud-alibaba) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。 -参考文档 请查看 [WIKI](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki) 。 +参考文档 请查看 [WIKI](https://github.com/alibaba/spring-cloud-alibaba/wiki) 。 -为 Spring Cloud Alibaba 贡献代码请参考 [如何贡献](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/%E5%A6%82%E4%BD%95%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81) 。 +为 Spring Cloud Alibaba 贡献代码请参考 [如何贡献](https://github.com/alibaba/spring-cloud-alibaba/wiki/%E5%A6%82%E4%BD%95%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81) 。 ## 主要功能 -* **服务限流降级**:默认支持 Servlet、Feign、RestTemplate、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。 +* **服务限流降级**:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。 * **服务注册与发现**:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。 * **分布式配置管理**:支持分布式系统中的外部化配置,配置更改时自动刷新。 * **消息驱动能力**:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。 @@ -25,7 +25,7 @@ Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。 * **阿里云短信服务**:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。 -更多功能请参考 [Roadmap](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/Roadmap-zh.md)。 +更多功能请参考 [Roadmap](https://github.com/alibaba/spring-cloud-alibaba/blob/master/Roadmap-zh.md)。 ## 组件 @@ -35,7 +35,7 @@ Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。 **[RocketMQ](https://rocketmq.apache.org/)**:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。 -**[Dubbo](https://github.com/apache/incubator-dubbo)**:Apache Dubbo™ (incubating) 是一款高性能 Java RPC 框架。 +**[Dubbo](https://github.com/apache/dubbo)**:Apache Dubbo™ 是一款高性能 Java RPC 框架。 **[Seata](https://github.com/seata/seata)**:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。 @@ -47,14 +47,15 @@ Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。 **[Alibaba Cloud SMS](https://www.aliyun.com/product/sms)**: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。 -更多组件请参考 [Roadmap](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/Roadmap-zh.md)。 +更多组件请参考 [Roadmap](https://github.com/alibaba/spring-cloud-alibaba/blob/master/Roadmap-zh.md)。 ## 如何构建 -* master 分支对应的是 Spring Cloud Finchley,最低支持 JDK 1.8。 +* master 分支对应的是 Spring Cloud Greenwich,最低支持 JDK 1.8。 +* finchley 分支对应的是 Spring Cloud Finchley,最低支持 JDK 1.8。 * 1.x 分支对应的是 Spring Cloud Edgware,最低支持 JDK 1.7。 -Spring Cloud 使用 Maven 来构建,最快的使用方式是将本项目clone到本地,然后执行以下命令: +Spring Cloud 使用 Maven 来构建,最快的使用方式是将本项目 clone 到本地,然后执行以下命令: ./mvnw install @@ -63,14 +64,13 @@ Spring Cloud 使用 Maven 来构建,最快的使用方式是将本项目clone ## 如何使用 ### 如何引入依赖 -项目的最新版本是 0.2.1.RELEASE 和 0.1.1.RELEASE,版本 0.2.1.RELEASE 对应的是 Spring Cloud Finchley 版本,版本 0.1.1.RELEASE 对应的是 Spring Cloud Edgware 版本。 如果需要使用已发布的版本,在 `dependencyManagement` 中添加如下配置。 - org.springframework.cloud + com.alibaba.cloud spring-cloud-alibaba-dependencies 0.2.1.RELEASE pom @@ -100,34 +100,33 @@ Spring Cloud 使用 Maven 来构建,最快的使用方式是将本项目clone Example 列表: -[Sentinel Example](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md) +[Sentinel Example](https://github.com/alibaba/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md) -[Nacos Config Example](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md) +[Nacos Config Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md) -[Nacos Discovery Example](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md) +[Nacos Discovery Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md) -[RocketMQ Example](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/rocketmq-example/readme-zh.md) +[RocketMQ Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/rocketmq-example/readme-zh.md) -[Seata Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/sms-example/readme-zh.md) +[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/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/oss-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 ANS Example](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/ans-example/ans-provider-example/readme-zh.md) +[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 ACM Example](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/acm-example/acm-local-example/readme-zh.md) +[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/xiaolongzuo/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/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/readme-zh.md) ## 版本管理规范 + 项目的版本号格式为 x.x.x 的形式,其中 x 的数值类型为数字,从 0 开始取值,且不限于 0~9 这个范围。项目处于孵化器阶段时,第一位版本号固定使用 0,即版本号为 0.x.x 的格式。 -由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们使用了两个不同分支来分别支持 Spring Boot 1 和 Spring Boot 2: -* 0.1.x 版本适用于 Spring Boot 1 -* 0.2.x 版本适用于 Spring Boot 2 - -项目孵化阶段,项目版本升级机制如下: -* 功能改动的升级会增加第三位版本号的数值,例如 0.1.0 的下一个版本为0.1.1。 +由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本: +* 1.5.x 版本适用于 Spring Boot 1.5.x +* 2.0.x 版本适用于 Spring Boot 2.0.x +* 2.1.x 版本适用于 Spring Boot 2.1.x ## 社区交流 @@ -138,4 +137,4 @@ spring-cloud-alibaba@googlegroups.com,欢迎通过此邮件列表讨论与 spr ### 钉钉群 -![DingQR](https://cdn.nlark.com/lark/0/2018/png/54319/1544667717958-b3022f21-3357-4270-836d-4064e7ac728c.png) +![DingQR](https://img.alicdn.com/tfs/TB1zrRie4v1gK0jSZFFXXb0sXXa-7862-3570.png) diff --git a/README.md b/README.md index d1e19126..db4005b0 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # Spring Cloud Alibaba [![CircleCI](https://circleci.com/gh/alibaba/spring-cloud-alibaba/tree/master.svg?style=svg)](https://circleci.com/gh/alibaba/spring-cloud-alibaba/tree/master) -[![Maven Central](https://img.shields.io/maven-central/v/org.springframework.cloud/spring-cloud-alibaba-dependencies.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:org.springframework.cloud%20AND%20a:spring-cloud-alibaba-dependencies) -[![Codecov](https://codecov.io/gh/spring-cloud-incubator/spring-cloud-alibaba/branch/master/graph/badge.svg)](https://codecov.io/gh/spring-cloud-incubator/spring-cloud-alibaba) +[![Maven Central](https://img.shields.io/maven-central/v/com.alibaba.cloud/spring-cloud-alibaba-dependencies.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:com.alibaba.cloud%20AND%20a:spring-cloud-alibaba-dependencies) +[![Codecov](https://codecov.io/gh/alibaba/spring-cloud-alibaba/branch/master/graph/badge.svg)](https://codecov.io/gh/alibaba/spring-cloud-alibaba) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) A project maintained by Alibaba. -See the [中文文档](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/README-zh.md) for Chinese readme. +See the [中文文档](https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md) for Chinese readme. Spring Cloud Alibaba provides a one-stop solution for distributed application development. It contains all the components required to develop distributed applications, making it easy for you to develop your applications using Spring Cloud. @@ -25,7 +25,7 @@ With Spring Cloud Alibaba, you only need to add some annotations and a small amo * **Alibaba Cloud SchedulerX**:accurate, highly reliable, and highly available scheduled job scheduling services with response time within seconds. * **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. -For more features, please refer to [Roadmap](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/Roadmap.md). +For more features, please refer to [Roadmap](https://github.com/alibaba/spring-cloud-alibaba/blob/master/Roadmap.md). ## Components @@ -35,7 +35,7 @@ For more features, please refer to [Roadmap](https://github.com/spring-cloud-inc **[RocketMQ](https://rocketmq.apache.org/)**:A distributed messaging and streaming platform with low latency, high performance and reliability, trillion-level capacity and flexible scalability. -**[Dubbo](https://github.com/apache/incubator-dubbo)**:A high-performance, Java based open source RPC framework. +**[Dubbo](https://github.com/apache/dubbo)**:A high-performance, Java based open source RPC framework. **[Seata](https://github.com/seata/seata)**:A distributed transaction solution with high performance and ease of use for microservices architecture. @@ -47,12 +47,13 @@ For more features, please refer to [Roadmap](https://github.com/spring-cloud-inc **[Alibaba Cloud SchedulerX](https://www.aliyun.com/product/SchedulerX)**: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/spring-cloud-incubator/spring-cloud-alibaba/blob/master/Roadmap.md). +For more features please refer to [Roadmap](https://github.com/alibaba/spring-cloud-alibaba/blob/master/Roadmap.md). ## How to build -* **master branch**: Corresponds to Spring Boot 2.x. JDK 1.8 or later versions are supported. -* **1.x branch**: Corresponds to Spring Boot 1.x, JDK 1.7 or later versions are supported. +* **master branch**: Corresponds to Spring Cloud Greenwich & Spring Boot 2.x. JDK 1.8 or later versions are supported. +* **finchley branch**: Corresponds to Spring Cloud Finchley & Spring Boot 2.x. JDK 1.8 or later versions are supported. +* **1.x branch**: Corresponds to Spring Cloud Edgware & Spring Boot 1.x, JDK 1.7 or later versions are supported. Spring Cloud uses Maven for most build-related activities, and you should be able to get off the ground quite quickly by cloning the project you are interested in and typing: @@ -61,17 +62,16 @@ Spring Cloud uses Maven for most build-related activities, and you should be abl ## How to Use -### Add maven dependency -Version 0.2.1.RELEASE is compatible with the Spring Cloud Finchley. Version 0.1.1.RELEASE is compatible with the Spring Cloud Edgware. +### Add maven dependency These artifacts are available from Maven Central and Spring Release repository via BOM: - org.springframework.cloud + com.alibaba.cloud spring-cloud-alibaba-dependencies - 0.2.1.RELEASE + 1.5.0.RELEASE pom import @@ -80,29 +80,16 @@ These artifacts are available from Maven Central and Spring Release repository v add the module in `dependencies`. -If you want to use the latest BUILD-SNAPSHOT version, add `Spring Snapshot Repository` in pom.xml , **Attention: BUILD-SNAPSHOT may be updated in any time** - - - - spring-snapshot - Spring Snapshot Repository - https://repo.spring.io/snapshot - - true - - - - ### Reference Doc -[Contents](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/spring-cloud-alibaba.adoc) +[Contents](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/spring-cloud-alibaba.adoc) -[Nacos Config](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc) +[Nacos Config](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc) -[Nacos Discovery](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-discovery.adoc) +[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/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/acm.adoc) +[ACM](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/acm.adoc) ## Examples @@ -111,26 +98,26 @@ A `spring-cloud-alibaba-examples` module is included in our project for you to g Examples: -[Sentinel Example](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md) +[Sentinel Example](https://github.com/alibaba/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md) -[Nacos Config Example](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme.md) +[Nacos Config Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme.md) -[Nacos Discovery Example](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md) +[Nacos Discovery Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md) -[RocketMQ Example](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/rocketmq-example/readme.md) +[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/spring-cloud-incubator/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/oss-example/readme.md) +[Alibaba Cloud OSS Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/oss-example/readme.md) + +[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) ## 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 first version number is fixed to 0, that is, the version number is 0.x.x. +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. -As the interfaces and annotations of Spring Boot 1 and Spring Boot 2 have been changed significantly in the Actuator module, and spring-cloud-commons is also changed quite a lot from 1.x.x to 2.0.0, we maintain two different branches to support Spring Boot 1 and Spring Boot 2: -* 0.1.x for Spring Boot 1 -* 0.2.x for Spring Boot 2 - -During the incubation period, the version management of the project will follow these rules: -* Functional updates will be reflected in the 3rd number of the version, for example, the next version of 0.1.0 will be 0.1.1. +As the interfaces and annotations of Spring Boot 1 and Spring Boot 2 have been changed significantly in the Actuator module, and spring-cloud-commons is also changed quite a lot from 1.x.x to 2.0.0, we take the same version rule as SpringBoot version number. +* 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 ## 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/Roadmap-zh.md b/Roadmap-zh.md index e9c844b8..73559795 100644 --- a/Roadmap-zh.md +++ b/Roadmap-zh.md @@ -23,7 +23,7 @@ Apache RocketMQ™ 基于 Java 的高性能、高吞吐量的分布式消息和 **Dubbo** -Apache Dubbo™ (incubating) 是一款高性能 Java RPC 框架。 +Apache Dubbo™ 是一款高性能 Java RPC 框架。 **Seata** diff --git a/Roadmap.md b/Roadmap.md index 99e20d6e..7d1f4118 100644 --- a/Roadmap.md +++ b/Roadmap.md @@ -1,6 +1,6 @@ # Roadmap -See the [中文文档](https://github.com/spring-cloud-incubator/spring-cloud-alibabacloud/blob/master/Roadmap-zh.md) for Chinese Roadmap. +See the [中文文档](https://github.com/alibaba/spring-cloud-alibaba/blob/master/Roadmap-zh.md) for Chinese Roadmap. Spring Cloud Alibaba provides a one-stop solution for distributed application development. It contains all the components required to develop distributed applications, making it easy for you to develop your applications using Spring Cloud. @@ -26,7 +26,7 @@ Apache RocketMQ™ is an open source distributed messaging and streaming data pl **Dubbo** -Apache Dubbo™ (incubating) is a high-performance, Java based open source RPC framework. +Apache Dubbo™ is a high-performance, Java based open source RPC framework. **Seata** diff --git a/pom.xml b/pom.xml index b627f865..687f0c60 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.springframework.cloud spring-cloud-build - 1.3.11.RELEASE + 1.3.12.RELEASE @@ -28,12 +28,12 @@ - https://github.com/spring-cloud-incubator/spring-cloud-alibaba + https://github.com/alibaba/spring-cloud-alibaba - scm:git:git://github.com/spring-cloud-incubator/spring-cloud-alibaba.git + scm:git:git://github.com/alibaba/spring-cloud-alibaba.git - scm:git:ssh://git@github.com/spring-cloud-incubator/spring-cloud-alibaba.git + scm:git:ssh://git@github.com/alibaba/spring-cloud-alibaba.git HEAD @@ -66,14 +66,16 @@ - 1.3.5.RELEASE - 1.4.6.RELEASE - 1.3.4.RELEASE + 1.3.6.RELEASE + 1.4.7.RELEASE + 1.3.5.RELEASE 4.12 3.0 1.7.25 + + 2.0.2 3.5 @@ -138,6 +140,11 @@ import + + org.apache.rocketmq + rocketmq-spring-boot-starter + ${rocketmq.starter.version} + diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index bb9476ab..fd8bb387 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -6,7 +6,7 @@ spring-cloud-dependencies-parent org.springframework.cloud - 1.3.11.RELEASE + 1.3.12.RELEASE com.alibaba.cloud @@ -19,19 +19,19 @@ 1.6.3 3.1.0 - 0.7.1 - 1.1.1 + 0.9.0 + 1.1.4 1.0.9 1.0.1 4.4.1 1.0.5 2.44.0 - 2.0.2 2.1.6 - 2.7.1 + 2.7.3 2.7.1 1.1.0 1.1.8.6 + 1.1.1 @@ -90,14 +90,7 @@ com.alibaba.nacos nacos-client - ${nacos.version} - - - - - org.apache.rocketmq - rocketmq-spring-boot-starter - ${rocketmq.starter.version} + ${nacos.client.version} @@ -131,6 +124,11 @@ sentinel-datasource-nacos ${sentinel.version} + + com.alibaba.csp + sentinel-datasource-redis + ${sentinel.version} + com.alibaba.csp sentinel-web-servlet @@ -166,11 +164,6 @@ sentinel-apache-dubbo-adapter ${sentinel.version} - - com.alibaba.cloud - sentinel-dubbo-api - ${project.version} - com.alibaba.csp sentinel-cluster-server-default @@ -188,8 +181,6 @@ - - io.seata @@ -197,6 +188,13 @@ ${seata.version} + + + org.apache.dubbo + dubbo-spring-boot-starter + ${dubbo-spring-boot.version} + + org.apache.dubbo @@ -218,13 +216,6 @@ - - - org.apache.dubbo - dubbo-spring-boot-starter - ${dubbo-spring-boot.version} - - com.aliyun.oss @@ -373,9 +364,9 @@ - + spring diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/ans.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/ans.adoc index 7ae01717..f44c1a18 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/ans.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/ans.adoc @@ -93,3 +93,4 @@ access-key 和 secret-key 则是阿里云账号的 AK/SK,需要首先注册阿 namespace 是阿里云 EDAS 产品的概念,用于隔离不同的环境,比如测试环境和生产环境。要获取 namespace 需要 https://common-buy.aliyun.com/?spm=5176.11451019.0.0.6f5965c0Uq5tue&commodityCode=edaspostpay#/buy[开通 EDAS 服务],按量计费模式下开通是免费的,开通以后进入 https://edas.console.aliyun.com/#/namespaces?regionNo=cn-hangzhou[EDAS控制台],即可看到对应的 namespace,比如 cn-hangzhou。 NOTE: EDAS 提供应用托管服务,如果你将应用托管到 EDAS,那么 EDAS 将会自动为你填充所有配置。 + 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 efa95c69..4827d751 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 @@ -412,10 +412,8 @@ Endpoint 暴露的 json 中包含了三种属性: 更多关于 Nacos Config Starter 的配置项如下所示: -:frame: topbot -[width="60%",options="header"] -|==== -^|配置项 ^|Key ^|默认值 ^|说明 +|=== +|配置项 |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 @@ -432,4 +430,4 @@ Endpoint 暴露的 json 中包含了三种属性: |共享配置|`spring.cloud.nacos.config.sharedDataids`||共享配置的 DataId, "," 分割 |共享配置动态刷新|`spring.cloud.nacos.config.refreshableDataids`||共享配置中需要动态刷新的 DataId, "," 分割 |自定义 Data Id 配置|`spring.cloud.nacos.config.extConfig`||属性是个集合,内部由 `Config` POJO 组成。`Config` 有 3 个属性,分别是 `dataId`, `group` 以及 `refresh` -|==== \ No newline at end of file +|=== diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-discovery.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-discovery.adoc index 4876454c..3457e2a8 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-discovery.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-discovery.adoc @@ -42,7 +42,9 @@ image::https://img.alicdn.com/tfs/TB1dyWJbQL0gK0jSZFtXXXQCXXa-2788-1086.png[] 以下步骤向您展示了如何将一个服务注册到 Nacos。 * pom.xml的配置。一个完整的 pom.xml 配置如下所示: -[source,xml,indent=0] + +.pom.xml +[source,xml] ---- ``` -### Spring Cloud Alibaba RocketMQ Binder 实现 +=== Spring Cloud Alibaba RocketMQ Binder 实现 这是 Spring Cloud Stream RocketMQ Binder 的实现架构: @@ -166,14 +166,14 @@ NOTE: 在使用 RocketMQ Binder 的同时也可以配置 rocketmq.** 用于触 MessageBuilder builder = MessageBuilder.withPayload(msg) .setHeader(RocketMQHeaders.TAGS, "binder") .setHeader(RocketMQHeaders.KEYS, "my-key") - .setHeader("DELAY", "1"); + .setHeader(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "1"); Message message = builder.build(); output().send(message); ``` -### 配置选项 +=== 配置选项 -#### RocketMQ Binder Properties +==== RocketMQ Binder Properties spring.cloud.stream.rocketmq.binder.name-server:: RocketMQ NameServer 地址(老版本使用 namesrv-addr 配置项)。 @@ -197,7 +197,7 @@ spring.cloud.stream.rocketmq.binder.customized-trace-topic:: Default: `RMQ_SYS_TRACE_TOPIC`. -#### RocketMQ Consumer Properties +==== RocketMQ Consumer Properties 下面的这些配置是以 `spring.cloud.stream.rocketmq.bindings..consumer.` 为前缀的 RocketMQ Consumer 相关的配置。 @@ -233,7 +233,7 @@ suspendCurrentQueueTimeMillis:: + 默认值: `1000`. -#### RocketMQ Provider Properties +==== RocketMQ Provider Properties 下面的这些配置是以 `spring.cloud.stream.rocketmq.bindings..producer.` 为前缀的 RocketMQ Producer 相关的配置。 @@ -282,7 +282,7 @@ retryNextServer:: + 默认值: `false`. -### 阿里云 MQ 服务 +=== 阿里云 MQ 服务 使用阿里云 MQ 服务需要配置 AccessKey、SecretKey 以及云上的 NameServer 地址。 @@ -297,4 +297,4 @@ spring.cloud.stream.rocketmq.binder.name-server=NameServerInMQ NOTE: topic 和 group 请以 实例id% 为前缀进行配置。比如 topic 为 "test",需要配置成 "实例id%test" .NameServer 的获取(配置中请去掉 http:// 前缀) -image::https://spring-cloud-alibaba.oss-cn-beijing.aliyuncs.com/MQ.png[] \ No newline at end of file +image::https://spring-cloud-alibaba.oss-cn-beijing.aliyuncs.com/MQ.png[] diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sentinel.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sentinel.adoc index 9b1f2ec3..be7c2f14 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sentinel.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sentinel.adoc @@ -1,6 +1,6 @@ == Spring Cloud Alibaba Sentinel -### Sentinel 介绍 +=== Sentinel 介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 https://github.com/alibaba/Sentinel[Sentinel] 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 @@ -11,11 +11,12 @@ https://github.com/alibaba/Sentinel[Sentinel] 具有以下特征: * *广泛的开源生态*: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 * *完善的 SPI 扩展点*: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。 -### 如何使用 Sentinel +=== 如何使用 Sentinel 如果要在您的项目中引入 Sentinel,使用 group ID 为 `com.alibaba.cloud` 和 artifact ID 为 `spring-cloud-starter-alibaba-sentinel` 的 starter。 ```xml +[source,yaml] com.alibaba.cloud spring-cloud-starter-alibaba-sentinel @@ -50,7 +51,7 @@ public class TestController { @SentinelResource 还提供了其它额外的属性如 `blockHandler`,`blockHandlerClass`,`fallback` 用于表示限流或降级的操作,更多内容可以参考 https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81[Sentinel注解支持]。 -##### Sentinel 控制台 +===== Sentinel 控制台 Sentinel 控制台提供一个轻量级的控制台,它提供机器发现、单机资源实时监控、集群资源汇总,以及规则管理的功能。您只需要对应用进行简单的配置,就可以使用这些功能。 @@ -61,7 +62,7 @@ image::https://github.com/alibaba/Sentinel/wiki/image/dashboard.png[] 开启该功能需要3个步骤: -###### 获取控制台 +====== 获取控制台 您可以从 https://github.com/alibaba/Sentinel/releases[release 页面] 下载最新版本的控制台 jar 包。 @@ -71,7 +72,7 @@ image::https://github.com/alibaba/Sentinel/wiki/image/dashboard.png[] * 使用以下命令将代码打包成一个 fat jar: `mvn clean package` -###### 启动控制台 +====== 启动控制台 Sentinel 控制台是一个标准的 SpringBoot 应用,以 SpringBoot 的方式运行 jar 包即可。 @@ -81,7 +82,7 @@ java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject 如若8080端口冲突,可使用 `-Dserver.port=新端口` 进行设置。 -#### 配置控制台信息 +==== 配置控制台信息 .application.yml ---- @@ -97,7 +98,7 @@ spring: 更多 Sentinel 控制台的使用及问题参考: https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0[Sentinel控制台] -### OpenFeign 支持 +=== OpenFeign 支持 Sentinel 适配了 https://github.com/OpenFeign/feign[OpenFeign] 组件。如果想使用,除了引入 `sentinel-starter` 的依赖外还需要 2 个步骤: @@ -115,7 +116,7 @@ Sentinel 适配了 https://github.com/OpenFeign/feign[OpenFeign] 组件。如果 ```java @FeignClient(name = "service-provider", fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class) public interface EchoService { - @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) + @GetMapping(value = "/echo/{str}") String echo(@PathVariable("str") String str); } @@ -138,7 +139,7 @@ NOTE: Feign 对应的接口中的资源名策略定义:httpmethod:protocol://r `EchoService` 接口中方法 `echo` 对应的资源名为 `GET:http://service-provider/echo/{str}`。 -### RestTemplate 支持 +=== RestTemplate 支持 Spring Cloud Alibaba Sentinel 支持对 `RestTemplate` 的服务调用使用 Sentinel 进行保护,在构造 `RestTemplate` bean的时候需要加上 `@SentinelRestTemplate` 注解。 @@ -180,13 +181,14 @@ Sentinel RestTemplate 限流的资源规则提供两种粒度: NOTE: 以 `https://www.taobao.com/test` 这个 url 并使用 GET 方法为例。对应的资源名有两种粒度,分别是 `GET:https://www.taobao.com` 以及 `GET:https://www.taobao.com/test` -### 动态数据源支持 +=== 动态数据源支持 `SentinelProperties` 内部提供了 `TreeMap` 类型的 `datasource` 属性用于配置数据源信息。 比如配置 4 个数据源: -``` +[source,properties] +---- spring.cloud.sentinel.datasource.ds1.file.file=classpath: degraderule.json spring.cloud.sentinel.datasource.ds1.file.rule-type=flow @@ -209,8 +211,7 @@ spring.cloud.sentinel.datasource.ds4.apollo.namespace-name = application spring.cloud.sentinel.datasource.ds4.apollo.flow-rules-key = sentinel spring.cloud.sentinel.datasource.ds4.apollo.default-flow-rule-value = test spring.cloud.sentinel.datasource.ds4.apollo.rule-type=param-flow - -``` +---- 这种配置方式参考了 Spring Cloud Stream Binder 的配置,内部使用了 `TreeMap` 进行存储,comparator 为 `String.CASE_INSENSITIVE_ORDER` 。 @@ -228,7 +229,7 @@ NOTE: 默认情况下,xml 格式是不支持的。需要添加 `jackson-datafo 关于 Sentinel 动态数据源的实现原理,参考: https://github.com/alibaba/Sentinel/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%99%E6%89%A9%E5%B1%95[动态规则扩展] -### Zuul 支持 +=== Zuul 支持 https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81[参考 Sentinel 网关限流] @@ -251,7 +252,7 @@ https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81[ ``` -### Sentinel 对外暴露的 Endpoint +=== Sentinel 对外暴露的 Endpoint Sentinel 内部提供了一个 Endpoint, 对应的 endpoint id 为 `sentinel`。 @@ -355,26 +356,22 @@ Endpoint 暴露的 json 中包含了多种属性: } ---- -### 关于 Sentinel Starter 更多的配置项信息 +=== 关于 Sentinel Starter 更多的配置项信息 下表显示当应用的 `ApplicationContext` 中存在对应的Bean的类型时,会进行自动化设置: -:frame: topbot -[width="60%",options="header"] -|==== -^|存在Bean的类型 ^|操作 ^|作用 +|=== +|存在Bean的类型 |操作 |作用 |`UrlCleaner`|`WebCallbackManager.setUrlCleaner(urlCleaner)`|资源清理(资源(比如将满足 /foo/:id 的 URL 都归到 /foo/* 资源下)) |`UrlBlockHandler`|`WebCallbackManager.setUrlBlockHandler(urlBlockHandler)`|自定义限流处理逻辑 |`RequestOriginParser`|`WebCallbackManager.setRequestOriginParser(requestOriginParser)`|设置来源信息 -|==== +|=== Spring Cloud Alibaba Sentinel 提供了这些配置选项 -:frame: topbot -[width="60%",options="header"] -|==== -^|配置项 ^|含义 ^|默认值 +|=== +|配置项 |含义 |默认值 |`spring.application.name` or `project.name`|Sentinel项目名| |`spring.cloud.sentinel.enabled`|Sentinel自动化配置是否生效|true |`spring.cloud.sentinel.eager`|是否提前触发 Sentinel 初始化|false @@ -396,6 +393,6 @@ Spring Cloud Alibaba Sentinel 提供了这些配置选项 |`spring.cloud.sentinel.zuul.order.pre`| SentinelZuulPreFilter 的 order | 10000 |`spring.cloud.sentinel.zuul.order.post`| SentinelZuulPostFilter 的 order | 1000 |`spring.cloud.sentinel.zuul.order.error`| SentinelZuulErrorFilter 的 order | -1 -|==== +|=== NOTE: 请注意。这些配置只有在 Servlet 环境下才会生效,RestTemplate 和 Feign 针对这些配置都无法生效 \ No newline at end of file diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sms.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sms.adoc index 6bd7d89c..e6f6813e 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sms.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sms.adoc @@ -186,6 +186,7 @@ public QuerySendDetailsResponse querySendDetailsResponse( 1、在 `application.properties` 配置文件中(也可以是 application.yaml)配置 SmsReport 的队列名称。 .application.properties +[source,properties] ---- spring.cloud.alicloud.sms.report-queue-name=Alicom-Queue-********-SmsReport ---- diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/ans.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/ans.adoc index 2213114a..dede7648 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/ans.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/ans.adoc @@ -93,3 +93,4 @@ Access-key and secret-key are the AK/SK of your Alibaba Cloud account. Register Namespace is a concept in EDAS, which is used to isolate environments, such as testing environment and production environment. To find your namespace, click to https://common-buy.aliyun.com/?spm=5176.11451019.0.0.6f5965c0Uq5tue&commodityCode=edaspostpay#/buy[Sign up for EDAS] first. You will not be charged under the pay-as-you-go mode. Then log on to the https://edas.console.aliyun.com/#/namespaces?regionNo=cn-hangzhou[EDAS Console] and you will be able to see your namespace, for example cn-hangzhou. NOTE: EDAS provides application hosting service and will fill in all configurations automatically for the hosted applications. + diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-config.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-config.adoc index 13752b7d..5aa199c1 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-config.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-config.adoc @@ -100,7 +100,7 @@ user name :nacos-config-properties; age: 90 Nacos Config supports yaml format as well. You only need to complete the following 2 steps. -1. In the bootstrap.properties file, add the following line to claim that the format of DataId is yaml. As follows: +1、In the bootstrap.properties file, add the following line to claim that the format of DataId is yaml. As follows: .bootstrap.properties [source,yaml] @@ -108,7 +108,7 @@ Nacos Config supports yaml format as well. You only need to complete the followi spring.cloud.nacos.config.file-extension=yaml ---- -2. Add a configuration with the DataId in yaml format on the Nacos console, as shown below: +2、Add a configuration with the DataId in yaml format on the Nacos console, as shown below: [source,subs="normal"] ---- @@ -401,10 +401,8 @@ set spring.cloud.nacos.config.enabled = false to disable Spring Cloud Nacos Conf The following shows the other configurations of the starter of Nacos Config: -:frame: topbot -[width="60%",options="header"] -|==== -^|Configuration ^|Key ^|Default Value ^|Description +|=== +|Configuration |Key |Default Value |Description |Server address|`spring.cloud.nacos.config.server-addr`|| IP and port of the Nacos Server listener |Dataid from nacos config|`spring.cloud.nacos.config.name`|| First take the prefix, then go to the name, and finally take spring.application.name |Dataid from nacos config|`spring.cloud.nacos.config.prefix`|| First take the prefix, then go to the name, and finally take spring.application.name @@ -421,4 +419,4 @@ The following shows the other configurations of the starter of Nacos Config: |Dataid for Shared Configuration|`spring.cloud.nacos.config.sharedDataids`||Dataid for Shared Configuration, split by "," |Dynamic refresh dataid for Shared Configuration|`spring.cloud.nacos.config.refreshableDataids`||Dynamic refresh dataid for Shared Configuration, split by "," |custom dataid|`spring.cloud.nacos.config.extConfig`||It's a List,build up by `Config` POJO. `Config` has 3 attributes, `dataId`, `group` and `refresh` -|==== \ No newline at end of file +|=== 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 fd6b97b9..f7f833d3 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-discovery.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-discovery.adoc @@ -41,10 +41,12 @@ For more Nacos Server versions, you can download the latest version from https:/ The following sample illustrates how to register a service to Nacos. -* Configuration of pom.xml The following is a complete example of pom.xml: -[source, xml] +* Configuration of pom.xml The following is a complete example of pom.xml: + +.pom.xml +[source,xml] ---- - + 4.0.0 @@ -115,11 +117,12 @@ The following sample illustrates how to register a service to Nacos. ---- * Configuration of application.properties Some of the basic configurations of Nacos must be included in application.properties(or application.yaml), as shown below: -application.properties + +.application.properties [source,properties] ---- server.port=8081 -spring.application.name=nacos-producer +spring.application.name=nacos-provider spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 management.endpoints.web.exposure.include=* ---- @@ -128,6 +131,7 @@ management.endpoints.web.exposure.include=* NOTE: If you do not want to use Nacos for service registration and discovery, you can set `spring.cloud.nacos.discovery` to `false`. * The following is a sample for starting Provider: + [source,java,indent=0] ---- @SpringBootApplication @@ -135,7 +139,7 @@ NOTE: If you do not want to use Nacos for service registration and discovery, yo public class NacosProviderDemoApplication { public static void main(String[] args) { - SpringApplication.run(NacosProducerDemoApplication.class, args); + SpringApplication.run(NacosProviderDemoApplication.class, args); } @RestController @@ -179,7 +183,7 @@ public class NacosConsumerApp { @GetMapping("/echo/app-name") public String echoAppName(){ - //Access through the combination of LoadBalanceClient and RestTemolate + //Access through the combination of LoadBalanceClient and RestTemplate ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider"); String path = String.format("http://%s:%s/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName); System.out.println("request path:" +path); @@ -264,7 +268,7 @@ The followings shows how a service instance accesses the Endpoint: "lastRefTime": 1541755293119, "checksum": "e5a699c9201f5328241c178e804657e11541755293119", "allIPs": false, - "key": "nacos-producer", + "key": "nacos-provider", "valid": true } ], @@ -294,10 +298,8 @@ The followings shows how a service instance accesses the Endpoint: The following shows the other configurations of the starter of Nacos Discovery: -:frame: topbot -[width="60%",options="header"] -|==== -^|Configuration ^|Key ^|Default Value ^|Description +|=== +|Configuration |Key |Default Value |Description |Server address|`spring.cloud.nacos.discovery.server-addr`||IP and port of the Nacos Server listener |Service name|`spring.cloud.nacos.discovery.service`|`${spring.application.name}`|Name the current service |Weight|`spring.cloud.nacos.discovery.weight`|`1`|Value range: 1 to 100. The bigger the value, the greater the weight @@ -309,7 +311,9 @@ The following shows the other configurations of the starter of Nacos Discovery: |SecretKey|`spring.cloud.nacos.discovery.secret-key`||Alibaba Cloud account secretkey |Metadata|`spring.cloud.nacos.discovery.metadata`||You can define some of the metadata for your services in the Map format |Log file name|`spring.cloud.nacos.discovery.log-name`|| +|Cluster Name|`spring.cloud.nacos.discovery.cluster-name`|`DEFAULT`|Cluster name of Nacos |Endpoint|`spring.cloud.nacos.discovery.endpoint`||The domain name of a certain service in a specific region. You can retrieve the server address dynamically with this domain name |Integrate Ribbon or not|`ribbon.nacos.enabled`|`true`|Set to true in most cases |Enable Nacos Watch|`spring.cloud.nacos.discovery.watch.enabled`|`true`|set to false to close watch -|==== +|=== + diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/oss.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/oss.adoc index f9d61830..a44fd72d 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/oss.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/oss.adoc @@ -154,4 +154,4 @@ spring.cloud.alicloud.oss.config.max-connections=1000 For more configurations, refer to the table at the bottom of https://help.aliyun.com/document_detail/32010.html[OSSClient Configurations]. -NOTE: In most cases, you need to connect the parameter names with “-” for the parameters in the table of https://help.aliyun.com/document_detail/32010.html[OSSClient Configurations] with “-”, and all letters should be in lowercase. For example, ConnectionTimeout should be changed to connection-timeout. \ No newline at end of file +NOTE: In most cases, you need to connect the parameter names with “-” for the parameters in the table of https://help.aliyun.com/document_detail/32010.html[OSSClient Configurations] with “-”, and all letters should be in lowercase. For example, ConnectionTimeout should be changed to connection-timeout. diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/rocketmq.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/rocketmq.adoc index d6a48745..85753b3f 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/rocketmq.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/rocketmq.adoc @@ -1,6 +1,6 @@ == Spring Cloud Alibaba RocketMQ Binder -### Introduction of RocketMQ +=== Introduction of RocketMQ https://rocketmq.apache.org[RocketMQ] is an open-source distributed message system. It is based on highly available distributed cluster technologies and provides message publishing and subscription service with low latency and high stability. RocketMQ is widely used in a variety of industries, such as decoupling of asynchronous communication, enterprise sulotions, financial settlements, telecommunication, e-commerce, logistics, marketing, social media, instant messaging, mobile applications, mobile games, vedios, IoT, and Internet of Vehicles. @@ -16,7 +16,7 @@ It has the following features: * Billion-level message accumulation capability -### RocketMQ Usages +=== RocketMQ Usages * Download RocketMQ @@ -74,7 +74,7 @@ sh bin/mqshutdown broker sh bin/mqshutdown namesrv ``` -### Introduction of Spring Cloud Stream +=== Introduction of Spring Cloud Stream Spring Cloud Stream is a microservice framework used to build architectures based on messages. It helps you to create production-ready single-server Spring applications based on SpringBoot, and connects with Broker using `Spring Integration`. @@ -114,7 +114,7 @@ All the message types in this code are provided by the `spring-messaging`module. **The lower layer of Spring Cloud Stream also implements various code abstractions based on the previous code.** -### How to use Spring Cloud Alibaba RocketMQ Binder ### +=== How to use Spring Cloud Alibaba RocketMQ Binder For using the Spring Cloud Alibaba RocketMQ Binder, you just need to add it to your Spring Cloud Stream application, using the following Maven coordinates: @@ -134,7 +134,7 @@ Alternatively, you can also use the Spring Cloud Stream RocketMQ Starter: ``` -### How Spring Cloud Alibaba RocketMQ Binder Works +=== How Spring Cloud Alibaba RocketMQ Binder Works This is the implementation architecture of Spring Cloud Stream RocketMQ Binder: @@ -165,14 +165,14 @@ For example, `TAGS`, `DELAY`, `TRANSACTIONAL_ARG`, `KEYS`, `WAIT_STORE_MSG_OK`, MessageBuilder builder = MessageBuilder.withPayload(msg) .setHeader(RocketMQHeaders.TAGS, "binder") .setHeader(RocketMQHeaders.KEYS, "my-key") - .setHeader("DELAY", "1"); + .setHeader(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "1"); Message message = builder.build(); output().send(message); ``` -### Configuration Options +=== Configuration Options -#### RocketMQ Binder Properties +==== RocketMQ Binder Properties spring.cloud.stream.rocketmq.binder.name-server:: The name server of RocketMQ Server(Older versions use the namesrv-addr configuration item). @@ -196,7 +196,7 @@ The trace topic for message trace. Default: `RMQ_SYS_TRACE_TOPIC`. -#### RocketMQ Consumer Properties +==== RocketMQ Consumer Properties The following properties are available for RocketMQ producers only and must be prefixed with `spring.cloud.stream.rocketmq.bindings..consumer.`. @@ -232,7 +232,7 @@ Time interval of message consume retry for orderly consume. + Default: `1000`. -#### RocketMQ Provider Properties +==== RocketMQ Provider Properties The following properties are available for RocketMQ producers only and must be prefixed with `spring.cloud.stream.rocketmq.bindings..producer.`. diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/schedulerx.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/schedulerx.adoc index de969003..38c79c50 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/schedulerx.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/schedulerx.adoc @@ -111,4 +111,4 @@ NOTE: Group-id must be created within a namespace. Access-key and secret-key are the AK/SK of your Alibaba Cloud account. If you deploy you applications on EDAS, then you do not need to fill in this information. Otherwise please go to https://usercenter.console.aliyun.com/#/manage/ak[Security Information] to get your AccessKeys. -Domain-name is not mandatory. You can refer to https://help.aliyun.com/document_detail/35359.html[SchedulerX Documentation] for details. \ No newline at end of file +Domain-name is not mandatory. You can refer to https://help.aliyun.com/document_detail/35359.html[SchedulerX Documentation] for details. diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/sentinel.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/sentinel.adoc index bb0e66da..85446c99 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/sentinel.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/sentinel.adoc @@ -1,6 +1,6 @@ == Spring Cloud Alibaba Sentinel -### Introduction of Sentinel +=== Introduction of Sentinel As microservices become popular, the stability of service calls is becoming increasingly important. https://github.com/alibaba/Sentinel[Sentinel] takes "flow" as the breakthrough point, and works on multiple fields including flow control, circuit breaking and load protection to protect service reliability. @@ -12,7 +12,7 @@ https://github.com/alibaba/Sentinel[Sentinel] has the following features: * *Extensive Open-Source Ecosystem*: Sentinel provides out-of-box modules that can be easily integrated with other open-source frameworks/libraries, such as Spring Cloud, Dubbo, and gRPC. To use Sentinel, you only need to introduce the related dependency and make a few simple configurations. * *Sound SPI Extensions*: Sentinel provides easy-to-use and sound SPI extension interfaces. You can customize logics with the SPI extensions quickly, for example, you can define your own rule management, or adapt to specific data sources. -### How to Use Sentinel +=== How to Use Sentinel If you want to use Sentinel in your project, please use the starter with the group ID as `com.alibaba.cloud` and the artifact ID as `spring-cloud-starter-alibaba-sentinel`. @@ -51,7 +51,7 @@ The @SentinelResource annotation is used to identify if a resource is rate limit @SentinelResource also provides attributes such as `blockHandler`, `blockHandlerClass`, and `fallback` to identify rate limiting or degradation operations. For more details, refer to https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81[Sentinel Annotation Support]. -##### Sentinel Dashboard +===== Sentinel Dashboard Sentinel dashboard is a lightweight console that provides functions such as machine discovery, single-server resource monitoring, overview of cluster resource data, as well as rule management. To use these features, you only need to complete a few steps. @@ -62,7 +62,7 @@ image::https://github.com/alibaba/Sentinel/wiki/image/dashboard.png[] To use the Sentinel dashboard, simply complete the following 3 steps. -###### Get the Dashboard +====== Get the Dashboard You can download the latest dashboard JAR file from the https://github.com/alibaba/Sentinel/releases[Release Page]. @@ -72,7 +72,7 @@ You can also get the latest source code to build your own Sentinel dashboard: * Run the following command to package the code into a FatJar: `mvn clean package` -###### Start the Dashboard +====== Start the Dashboard Sentinel dashboard is a standard SpringBoot application, and you can run the JAR file in the Spring Boot mode. @@ -98,7 +98,7 @@ The port number specified in `spring.cloud.sentinel.transport.port` will start a For more information about Sentinel dashboard, please refer to https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0[Sentinel Dashboard]. -### OpenFeign Support +=== OpenFeign Support Sentinel is compatible with the https://github.com/OpenFeign/feign[OpenFeign] component. To use it, in addition to introducing the `sentinel-starter` dependency, complete the following 2 steps: @@ -116,7 +116,7 @@ This is a simple usage of `FeignClient`: ```java @FeignClient(name = "service-provider", fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class) public interface EchoService { - @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) + @GetMapping(value = "/echo/{str}") String echo(@PathVariable("str") String str); } @@ -139,7 +139,7 @@ NOTE: The resource name policy in the corresponding interface of Feign is:http The corresponding resource name of the `echo` method in the `EchoService` interface is `GET:http://service-provider/echo/{str}`. -### RestTemplate Support +=== RestTemplate Support Spring Cloud Alibaba Sentinel supports the protection of `RestTemplate` service calls using Sentinel. To do this, you need to add the `@SentinelRestTemplate` annotation when constructing the `RestTemplate` bean. @@ -183,13 +183,14 @@ Sentinel RestTemplate provides two granularities for resource rate limiting: NOTE: Take Http GET `https://www.taobao.com/test` as an example. The corresponding resource names have two levels of granularities, `GET:https://www.taobao.com` and `GET:https://www.taobao.com/test`. -### Dynamic Data Source Support +=== Dynamic Data Source Support `SentinelProperties` provide `datasource` attribute to configure datasource. For example, 4 data sources are configures: -``` +[source,properties] +---- spring.cloud.sentinel.datasource.ds1.file.file=classpath: degraderule.json spring.cloud.sentinel.datasource.ds1.file.rule-type=flow @@ -212,7 +213,7 @@ spring.cloud.sentinel.datasource.ds4.apollo.namespace-name = application spring.cloud.sentinel.datasource.ds4.apollo.flow-rules-key = sentinel spring.cloud.sentinel.datasource.ds4.apollo.default-flow-rule-value = test spring.cloud.sentinel.datasource.ds4.apollo.rule-type=param-flow -``` +---- This method follows the configuration of Spring Cloud Stream Binder. `TreeMap` is used for storage internally, and comparator is `String.CASE_INSENSITIVE_ORDER`. @@ -228,9 +229,9 @@ NOTE: XML format is not supported by default. To make it effective, you need to To learn more about how dynamic data sources work in Sentinel, refer to https://github.com/alibaba/Sentinel/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%99%E6%89%A9%E5%B1%95[Dynamic Rule Extension]. -### Support Zuul +=== Support Zuul -https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81[参考 Sentinel 网关限流] +Refer https://github.com/alibaba/Sentinel/wiki/API-Gateway-Flow-Control[API Gateway Flow Control] If you want to use Sentinel Starter with Zuul, you need to add the `spring-cloud-alibaba-sentinel-gateway` dependency, and you need to add the `spring-cloud-starter-netflix-zuul` dependency to let Zuul AutoConfiguration class in the gateway module takes effect: @@ -251,7 +252,7 @@ If you want to use Sentinel Starter with Zuul, you need to add the `spring-cloud ``` -### Sentinel Endpoint +=== Sentinel Endpoint Sentinel provides an Endpoint internally with a corresponding endpoint id of `sentinel`. @@ -354,25 +355,21 @@ The followings shows how a service instance accesses the Endpoint: } ---- -### Configuration +=== Configuration The following table shows that when there are corresponding bean types in `ApplicationContext`, some actions will be taken: -:frame: topbot -[width="60%",options="header"] -|==== -^|Existing Bean Type ^|Action ^|Function +|=== +|Existing Bean Type |Action |Function |`UrlCleaner`|`WebCallbackManager.setUrlCleaner(urlCleaner)`|Resource cleaning(resource(for example, classify all URLs of /foo/:id to the /foo/* resource)) |`UrlBlockHandler`|`WebCallbackManager.setUrlBlockHandler(urlBlockHandler)`|Customize rate limiting logic |`RequestOriginParser`|`WebCallbackManager.setRequestOriginParser(requestOriginParser)`|Setting the origin -|==== +|=== The following table shows all the configurations of Spring Cloud Alibaba Sentinel: -:frame: topbot -[width="60%",options="header"] -|==== -^|Configuration ^|Description ^|Default Value +|=== +|Configuration |Description |Default Value |`spring.application.name` or `project.name`|Project Name Of Sentinel| |`spring.cloud.sentinel.enabled`|Whether Sentinel automatic configuration takes effect|true |`spring.cloud.sentinel.eager`|Whether to trigger Sentinel initialization in advance|false @@ -393,7 +390,7 @@ The following table shows all the configurations of Spring Cloud Alibaba Sentine |`spring.cloud.sentinel.zuul.order.pre`| The order of SentinelZuulPreFilter | 10000 |`spring.cloud.sentinel.zuul.order.post`| The order of SentinelZuulPostFilter | 1000 |`spring.cloud.sentinel.zuul.order.error`| The order of SentinelZuulErrorFilter | -1 -|==== +|=== -NOTE: These configurations will only take effect in servlet environment. RestTemplate and Feign will not take effect for these configurations. \ No newline at end of file +NOTE: These configurations will only take effect in servlet environment. RestTemplate and Feign will not take effect for these configurations. diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/sms.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/sms.adoc index 91c43de8..f6308fb0 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/sms.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/sms.adoc @@ -185,6 +185,7 @@ By subscribing to the SmsUp upstream SMS message, you can know the content of th 1、Configure the queue name for SmsReport in the `application.properties` configuration file (which can also be application.yaml). .application.properties +[source,properties] ---- spring.cloud.alicloud.sms.up-queue-name=Alicom-Queue-********-SmsUp ---- @@ -206,4 +207,4 @@ public class SmsUpMessageListener } ---- -More message body format for Message can be https://help.aliyun.com/document_detail/55496.html?spm=a2c4g.11186623.6.570.7f792c78rOiWXO[reference here]. \ No newline at end of file +More message body format for Message can be https://help.aliyun.com/document_detail/55496.html?spm=a2c4g.11186623.6.570.7f792c78rOiWXO[reference here]. diff --git a/spring-cloud-alibaba-examples/acm-example/acm-local-example/src/main/java/com/alibaba/cloud/examples/EchoController.java b/spring-cloud-alibaba-examples/acm-example/acm-local-example/src/main/java/com/alibaba/cloud/examples/EchoController.java index 287645e3..74abd424 100644 --- a/spring-cloud-alibaba-examples/acm-example/acm-local-example/src/main/java/com/alibaba/cloud/examples/EchoController.java +++ b/spring-cloud-alibaba-examples/acm-example/acm-local-example/src/main/java/com/alibaba/cloud/examples/EchoController.java @@ -18,7 +18,9 @@ package com.alibaba.cloud.examples; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -26,6 +28,7 @@ import org.springframework.web.bind.annotation.RestController; * @author xiaolongzuo */ @RestController +@RefreshScope public class EchoController { private static final Logger LOGGER = LoggerFactory.getLogger(EchoController.class); diff --git a/spring-cloud-alibaba-examples/ans-example/ans-consumer-feign-example/src/main/java/com/alibaba/cloud/examples/HomeController.java b/spring-cloud-alibaba-examples/ans-example/ans-consumer-feign-example/src/main/java/com/alibaba/cloud/examples/HomeController.java index 45018514..efe964b5 100644 --- a/spring-cloud-alibaba-examples/ans-example/ans-consumer-feign-example/src/main/java/com/alibaba/cloud/examples/HomeController.java +++ b/spring-cloud-alibaba-examples/ans-example/ans-consumer-feign-example/src/main/java/com/alibaba/cloud/examples/HomeController.java @@ -18,6 +18,7 @@ package com.alibaba.cloud.examples; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; diff --git a/spring-cloud-alibaba-examples/ans-example/ans-consumer-ribbon-example/src/main/java/com/alibaba/cloud/examples/HomeController.java b/spring-cloud-alibaba-examples/ans-example/ans-consumer-ribbon-example/src/main/java/com/alibaba/cloud/examples/HomeController.java index d7ccafb2..8827d2b4 100644 --- a/spring-cloud-alibaba-examples/ans-example/ans-consumer-ribbon-example/src/main/java/com/alibaba/cloud/examples/HomeController.java +++ b/spring-cloud-alibaba-examples/ans-example/ans-consumer-ribbon-example/src/main/java/com/alibaba/cloud/examples/HomeController.java @@ -18,6 +18,7 @@ package com.alibaba.cloud.examples; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; diff --git a/spring-cloud-alibaba-examples/ans-example/ans-provider-example/src/main/java/com/alibaba/cloud/examples/EchoController.java b/spring-cloud-alibaba-examples/ans-example/ans-provider-example/src/main/java/com/alibaba/cloud/examples/EchoController.java index 30bc0998..1430df9e 100644 --- a/spring-cloud-alibaba-examples/ans-example/ans-provider-example/src/main/java/com/alibaba/cloud/examples/EchoController.java +++ b/spring-cloud-alibaba-examples/ans-example/ans-provider-example/src/main/java/com/alibaba/cloud/examples/EchoController.java @@ -18,6 +18,7 @@ package com.alibaba.cloud.examples; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; 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 e7339058..2c9441f3 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 @@ -15,7 +15,7 @@ 1. 首先,修改 pom.xml 文件,引入 Nacos Config Starter。 - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config @@ -43,12 +43,10 @@ 1. 直接下载:[Nacos Server 下载页](https://github.com/alibaba/nacos/releases) 2. 源码构建:进入 Nacos [Github 项目页面](https://github.com/alibaba/nacos),将代码 git clone 到本地自行编译打包,[参考此文档](https://nacos.io/zh-cn/docs/quick-start.html)。 - - 2. 启动 Server,进入下载到本地并解压完成后的文件夹(使用源码构建的方式则进入编译打包好的文件夹),再进去其相对文件夹 nacos/bin,并对照操作系统实际情况执行如下命令。[详情参考此文档](https://nacos.io/zh-cn/docs/quick-start.html)。 1. Linux/Unix/Mac 操作系统,执行命令 `sh startup.sh -m standalone` - 1. Windows 操作系统,执行命令 `cmd startup.cmd` + 2. Windows 操作系统,执行命令 `cmd startup.cmd` 3. 在命令行执行如下命令,向 Nacos Server 中添加一条配置。 @@ -113,11 +111,11 @@ Nacos Client 从 Nacos Server 端获取数据时,调用的是此接口 `Config 在 Nacos Config Starter 中,dataId 的拼接格式如下 - ${prefix} - ${spring.active.profile} . ${file-extension} + ${prefix} - ${spring.profiles.active} . ${file-extension} * `prefix` 默认为 `spring.application.name` 的值,也可以通过配置项 `spring.cloud.nacos.config.prefix`来配置。 -* `spring.active.profile` 即为当前环境对应的 profile,详情可以参考 [Spring Boot文档](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html#boot-features-profiles) +* `spring.profiles.active` 即为当前环境对应的 profile,详情可以参考 [Spring Boot文档](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html#boot-features-profiles) **注意,当 activeprofile 为空时,对应的连接符 `-` 也将不存在,dataId 的拼接格式变成 `${prefix}`.`${file-extension}`** 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 58b499ae..b415bf8c 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 @@ -15,7 +15,7 @@ Before we start the demo, let's learn how to connect Nacos Config to a Spring Cl 1. Add dependency spring-cloud-starter-alibaba-nacos-config in the pom.xml file in your Spring Cloud project. - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config @@ -42,12 +42,10 @@ Before we start the demo, let's learn how to connect Nacos Config to a Spring Cl 1. Download: Download Nacos Server [download page](https://github.com/alibaba/nacos/releases) 2. Build from source code: Get source code by git clone git@github.com:alibaba/Nacos.git from Github Nacos and build your code. See [build reference](https://nacos.io/en-us/docs/quick-start.html) for details. - - 2. Unzip the downloaded file and go to the nacos/bin folder(), And according to the actual situation of the operating system, execute the following command。[see reference for more detail](https://nacos.io/en-us/docs/quick-start.html)。 1. Linux/Unix/Mac , execute `sh startup.sh -m standalone` - 1. Windows , execute `cmd startup.cmd` + 2. Windows , execute `cmd startup.cmd` 3. Execute the following command to add a configuration to Nacos Server. @@ -114,11 +112,11 @@ Nacos Client gets data from Nacos Server through this method. `ConfigService.get In Nacos Config Starter, the splicing format of dataId is as follows - ${prefix} - ${spring.active.profile} . ${file-extension} + ${prefix} - ${spring.profiles.active} . ${file-extension} * `prefix` default value is `spring.application.name` value, which can also be configured via the configuration item `spring.cloud.nacos.config.prefix`. -* `spring.active.profile` is the profile corresponding to the current environment. For details, please refer to [Spring Boot Doc](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html#boot-features-profiles) +* `spring.profiles.active` is the profile corresponding to the current environment. For details, please refer to [Spring Boot Doc](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html#boot-features-profiles) **Note: when the activeprofile is empty, the corresponding connector `-` will also not exist, and the splicing format of the dataId becomes `${prefix}`.`${file-extension}`** 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 176c2709..e65a171a 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 @@ -1,5 +1,14 @@ package com.alibaba.cloud.examples; +import java.io.IOException; +import java.io.StringReader; +import java.util.Properties; +import java.util.concurrent.Executor; + +import com.alibaba.cloud.nacos.NacosConfigManager; +import com.alibaba.nacos.api.config.listener.Listener; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; @@ -11,11 +20,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** - * @author xiaojing + * @author xiaojing, Jianwei Mao */ @SpringBootApplication public class Application { - public static void main(String[] args) { SpringApplication.run(Application.class, args); } @@ -27,13 +35,47 @@ class SampleRunner implements ApplicationRunner { @Value("${user.name}") String userName; - @Value("${user.age}") + @Value("${user.age:25}") int userAge; + @Autowired + private NacosConfigManager nacosConfigManager; + @Override public void run(ApplicationArguments args) throws Exception { - System.out.println(userName); - System.out.println(userAge); + System.out.println( + String.format("Initial username=%s, userAge=%d", userName, userAge)); + + nacosConfigManager.getConfigService().addListener( + "nacos-config-example.properties", "DEFAULT_GROUP", new Listener() { + + /** + * Callback with latest config data. + * + * For example, config data in Nacos is: + * + * user.name=Nacos user.age=25 + * + * @param configInfo latest config data for specific dataId in Nacos + * server + */ + @Override + public void receiveConfigInfo(String configInfo) { + Properties properties = new Properties(); + try { + properties.load(new StringReader(configInfo)); + } + catch (IOException e) { + e.printStackTrace(); + } + System.out.println("config changed: " + properties); + } + + @Override + public Executor getExecutor() { + return null; + } + }); } } @@ -44,7 +86,7 @@ class SampleController { @Value("${user.name}") String userName; - @Value("${user.age}") + @Value("${user.age:25}") int age; @RequestMapping("/user") diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/src/main/java/com/alibaba/cloud/examples/ConsumerApplication.java b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/src/main/java/com/alibaba/cloud/examples/ConsumerApplication.java index 10242937..d4097621 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/src/main/java/com/alibaba/cloud/examples/ConsumerApplication.java +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/src/main/java/com/alibaba/cloud/examples/ConsumerApplication.java @@ -1,5 +1,8 @@ package com.alibaba.cloud.examples; +import com.alibaba.cloud.examples.ConsumerApplication.EchoService; +import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate; + import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @@ -13,9 +16,6 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.client.RestTemplate; -import com.alibaba.cloud.examples.ConsumerApplication.EchoService; -import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate; - /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/src/main/java/com/alibaba/cloud/examples/TestController.java b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/src/main/java/com/alibaba/cloud/examples/TestController.java index cb584cd4..f0920d2c 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/src/main/java/com/alibaba/cloud/examples/TestController.java +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-consumer-example/src/main/java/com/alibaba/cloud/examples/TestController.java @@ -1,5 +1,7 @@ package com.alibaba.cloud.examples; +import com.alibaba.cloud.examples.ConsumerApplication.EchoService; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.PathVariable; @@ -9,8 +11,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; -import com.alibaba.cloud.examples.ConsumerApplication.EchoService; - /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/src/main/java/com/alibaba/cloud/examples/ProviderApplication.java b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/src/main/java/com/alibaba/cloud/examples/ProviderApplication.java index 450cde83..c0bc7b01 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/src/main/java/com/alibaba/cloud/examples/ProviderApplication.java +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/src/main/java/com/alibaba/cloud/examples/ProviderApplication.java @@ -14,8 +14,8 @@ import org.springframework.web.bind.annotation.RestController; /** * @author xiaojing */ -@SpringBootApplication @EnableDiscoveryClient +@SpringBootApplication public class ProviderApplication { public static void main(String[] args) { @@ -24,6 +24,7 @@ public class ProviderApplication { @RestController class EchoController { + @RequestMapping(value = "/", method = RequestMethod.GET) public ResponseEntity index() { return new ResponseEntity("index error", HttpStatus.INTERNAL_SERVER_ERROR); diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-client/src/main/java/com/alibaba/cloud/examples/SpringCloudConfigClientApplication.java b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-client/src/main/java/com/alibaba/cloud/examples/SpringCloudConfigClientApplication.java index 7a95927f..4968266c 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-client/src/main/java/com/alibaba/cloud/examples/SpringCloudConfigClientApplication.java +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-client/src/main/java/com/alibaba/cloud/examples/SpringCloudConfigClientApplication.java @@ -27,8 +27,8 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient public class SpringCloudConfigClientApplication { - public static void main(String[] args) { - SpringApplication.run(SpringCloudConfigClientApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(SpringCloudConfigClientApplication.class, args); + } } \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-client/src/main/resources/application.yml b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-client/src/main/resources/application.yml index 36ecefd3..23cd46cd 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-client/src/main/resources/application.yml +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-spring-cloud-config-client/src/main/resources/application.yml @@ -1 +1 @@ -config: config-from-yml +config: config-from-yml \ No newline at end of file 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 7be882bd..417e2613 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 @@ -15,7 +15,7 @@ 1. 首先,修改 pom.xml 文件,引入 Nacos Discovery Starter。 - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery @@ -35,7 +35,7 @@ @RestController class EchoController { - @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) + @GetMapping(value = "/echo/{string}") public String echo(@PathVariable String string) { return string; } @@ -70,7 +70,7 @@ ### 验证 #### 查询服务 -在浏览器输入此地址 `http://127.0.0.1:8848/nacos/v1/ns/instances?serviceName=service-provider`,并点击跳转,可以看到服务节点已经成功注册到 Nacos Server。 +在浏览器输入此地址 `http://127.0.0.1:8848/nacos/v1/ns/catalog/instances?serviceName=service-provider&clusterName=DEFAULT&pageSize=10&pageNo=1&namespaceId=`,并点击跳转,可以看到服务节点已经成功注册到 Nacos Server。 ![查询服务](https://cdn.nlark.com/lark/0/2018/png/54319/1536986288092-5cf96af9-9a26-466b-85f6-39ad1d92dfdc.png) @@ -102,7 +102,7 @@ Nacos Discovery Starter 默认集成了 Ribbon ,所以对于使用了 Ribbon @FeignClient(name = "service-provider") public interface EchoService { - @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) + @GetMapping(value = "/echo/{str}") String echo(@PathVariable("str") String str); } @@ -120,11 +120,11 @@ Nacos Discovery Starter 默认集成了 Ribbon ,所以对于使用了 Ribbon @Autowired private EchoService echoService; - @RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET) + @GetMapping(value = "/echo-rest/{str}") public String rest(@PathVariable String str) { return restTemplate.getForObject("http://service-provider/echo/" + str, String.class); } - @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET) + @GetMapping(value = "/echo-feign/{str}") public String feign(@PathVariable String str) { return echoService.echo(str); } @@ -141,11 +141,11 @@ Nacos Discovery Starter 默认集成了 Ribbon ,所以对于使用了 Ribbon 2. 打包编译后启动:在 nacos-discovery-consumer-example 项目中执行 `mvn clean package` 将工程编译打包,然后执行 `java -jar nacos-discovery-consumer-example.jar`启动应用。 #### 验证 -1. 在流量器地址栏中输入 http://127.0.0.1:18083/echo-rest/1234,点击跳转,可以看到浏览器显示了 nacos-discovery-provider-example 返回的消息 "hello Nacos Discovery 1234",证明服务发现生效。 +1. 在浏览器地址栏中输入 http://127.0.0.1:18083/echo-rest/1234,点击跳转,可以看到浏览器显示了 nacos-discovery-provider-example 返回的消息 "hello Nacos Discovery 1234",证明服务发现生效。 ![rest](https://cdn.nlark.com/lark/0/2018/png/54319/1536986302124-ee27670d-bdcc-4210-9f5d-875acec6d3ea.png) -1. 在流量器地址栏中输入 http://127.0.0.1:18083/echo-feign/12345,点击跳转,可以看到浏览器显示 nacos-discovery-provider-example 返回的消息 "hello Nacos Discovery 12345",证明服务发现生效。 +1. 在浏览器地址栏中输入 http://127.0.0.1:18083/echo-feign/12345,点击跳转,可以看到浏览器显示 nacos-discovery-provider-example 返回的消息 "hello Nacos Discovery 12345",证明服务发现生效。 ![feign](https://cdn.nlark.com/lark/0/2018/png/54319/1536986311685-6d0c1f9b-a453-4ec3-88ab-f7922d210f65.png) ## 原理 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 7136933d..ef196068 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 @@ -14,7 +14,7 @@ Before we start the demo, let's learn how to connect Nacos Config to a Spring Cl 1. Add dependency spring-cloud-starter-alibaba-nacos-discovery in the pom.xml file in your Spring Cloud project. - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery @@ -34,7 +34,7 @@ Before we start the demo, let's learn how to connect Nacos Config to a Spring Cl @RestController class EchoController { - @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) + @GetMapping(value = "/echo/{string}") public String echo(@PathVariable String string) { return string; } diff --git a/spring-cloud-alibaba-examples/oss-example/readme-zh.md b/spring-cloud-alibaba-examples/oss-example/readme-zh.md index 452ca9fd..4385636f 100644 --- a/spring-cloud-alibaba-examples/oss-example/readme-zh.md +++ b/spring-cloud-alibaba-examples/oss-example/readme-zh.md @@ -1,4 +1,4 @@ -# Storage Example +# OSS Example ## 项目说明 @@ -11,33 +11,33 @@ ### 接入 OSS 在启动示例进行演示之前,我们先了解一下如何接入 OSS。 -**注意:本节只是为了便于您理解接入方式,本示例代码中已经完成接入工作,您只需修改 accessKeyId、secretAccessKey、region 即可。** +**注意:本节只是为了便于您理解接入方式,本示例代码中已经完成接入工作,您只需修改 accessKey、secretKey、endpoint 即可。** -1. 修改 pom.xml 文件,引入 OSS starter。 +1. 修改 pom.xml 文件,引入 alicloud-oss starter。 - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alicloud-oss -2. 在配置文件中配置 OSS 服务对应的 accessKeyId、secretAccessKey 和 region。 +2. 在配置文件中配置 OSS 服务对应的 accessKey、secretKey 和 endpoint。 // application.properties - spring.cloud.alibaba.oss.accessKeyId=your-ak - spring.cloud.alibaba.oss.secretAccessKey=your-sk - spring.cloud.alibaba.oss.region=cn-beijing + spring.cloud.alicloud.access-key=your-ak + spring.cloud.alicloud.secret-key=your-sk + spring.cloud.alicloud.oss.endpoint=*** - 以阿里云 accessKeyId、secretAccessKey 为例,获取方式如下。 + 以阿里云 accessKey、secretKey 为例,获取方式如下。 i. 在阿里云控制台界面,单击右上角头像,选择 accesskeys,或者直接登录[用户信息管理界面](https://usercenter.console.aliyun.com/): ![undefined](https://cdn.nlark.com/lark/0/2018/png/64647/1535371973274-3ebec90a-ebde-4eb7-96ed-5372f6b32fe0.png) - ii. 获取 accessKeyId、secretAccessKey: + ii. 获取 accessKey、secretKey: ![undefined](https://cdn.nlark.com/lark/0/2018/png/64647/1535372168883-b94a3d77-3f81-4938-b409-611945a9e21c.png) - **注意:**如果您使用了阿里云 [STS服务](https://help.aliyun.com/document_detail/28756.html) 进行短期访问权限管理,则除了 accessKeyId、secretAccessKey、region 以外,还需配置 securityToken。 + **注意:**如果您使用了阿里云 [STS服务](https://help.aliyun.com/document_detail/28756.html) 进行短期访问权限管理,则除了 accessKey、secretKey、endpoint 以外,还需配置 securityToken。 3. 注入 OSSClient 并进行文件上传下载等操作。 @@ -61,9 +61,9 @@ spring.application.name=oss-example server.port=18084 - spring.cloud.alibaba.oss.accessKeyId=your-ak - spring.cloud.alibaba.oss.secretAccessKey=your-sk - spring.cloud.alibaba.oss.region=cn-beijing + spring.cloud.alicloud.access-key=your-ak + spring.cloud.alicloud.secret-key=your-sk + spring.cloud.alicloud.oss.endpoint=*** 2. 通过 IDE 直接启动或者编译打包后启动应用。 @@ -72,7 +72,7 @@ 1. 执行 `mvn clean package` 将工程编译打包; 2. 执行 `java -jar oss-example.jar`启动应用。 -应用启动后会自动在 OSS 上创建一个名为 `spring-cloud-alibaba` 的 Bucket。 +应用启动后会自动在 OSS 上创建一个名为 `spring-cloud-alibaba-test` 的 Bucket。 ### 上传或下载文件 @@ -96,7 +96,7 @@ 显示结果: // 如果配置正确,则输出 - download success, content: { "name": "spring-cloud-alibaba", "github": "https://github.com/spring-cloud-incubator/spring-cloud-alibaba", "authors": ["Jim", "flystar32"], "emails": ["fangjian0423@gmail.com", "flystar32@163.com"] } + download success, content: { "name": "oss-test" } // 下载的过程中如果发生异常,则会输出download fail: fail reason。比如accessKeyId配置错误,则fail reason内容如下 download fail: The OSS Access Key Id you provided does not exist in our records. [ErrorCode]: InvalidAccessKeyId [RequestId]: RequestId [HostId]: xxx.oss-cn-beijing.aliyuncs.com [ResponseError]: InvalidAccessKeyId The OSS Access Key Id you provided does not exist in our records. RequestId sxxx.oss-cn-beijing.aliyuncs.com xxx-accessKeyId @@ -106,11 +106,11 @@ 完成文件上传或者下载操作后,可以登录 OSS 控制台进行验证。 -1. 登陆[OSS控制台](https://oss.console.aliyun.com/),可以看到左侧 Bucket 列表新增一个名字为`spring-cloud-alibaba`的 Bucket。 +1. 登陆[OSS控制台](https://oss.console.aliyun.com/),可以看到左侧 Bucket 列表新增一个名字为`spring-cloud-alibaba-test`的 Bucket。 ![undefined](https://cdn.nlark.com/lark/0/2018/png/64647/1535369224513-387afdf9-6078-4a42-9f18-d9fe9926a9cd.png) -2. 单击`spring-cloud-alibaba` Bucket,选择 `文件管理` 页签,发现上传的 oss-test 文件在 custom-dir 目录中。上传的 objectName 为`custom-dir/oss-test`。目录和文件以'/'符号分割。 +2. 单击`spring-cloud-alibaba-test` Bucket,选择 `文件管理` 页签,发现上传的 oss-test 文件。上传的 objectName 为`oss-test.json`。目录和文件以'/'符号分割。 ![undefined](https://cdn.nlark.com/lark/0/2018/png/64647/1535615378605-df1381e9-c5ff-4da1-b3b3-ce9acfef313f.png) @@ -128,30 +128,12 @@ Spring Boot 应用支持通过 Endpoint 来暴露相关信息,OSS Starter 也 Spring Boot1.x 可以通过访问 http://127.0.0.1:18084/oss 来查看 OSS Endpoint 的信息。 -Spring Boot2.x 可以通过访问 http://127.0.0.1:18084/acutator/oss 来访问。 +Spring Boot2.x 可以通过访问 http://127.0.0.1:18084/actuator/oss 来访问。 Endpoint 内部会显示所有的 OSSClient 配置信息,以及该 OSSClient 对应的 Bucket 列表。 ![undefined](https://cdn.nlark.com/lark/0/2018/png/64647/1535373658171-20674565-6fe1-4e1e-a596-1dd6f4159ec3.png) - -## 多个 OSSClient 场景 - -如果您需要配置多个 OSSClient,类似多数据源的配置,则可以先构造 `OSSProperties`,再构造 `OSSClient`,并分别为每个 OSSClient 配置相应的 accessKeyId、secretAccessKey 等信息。 - - @Bean - @ConfigurationProperties(prefix = "spring.cloud.alibaba.oss1") - public OSSProperties ossProperties1() { - return new OSSProperties(); - } - - @Bean - public OSS ossClient1(@Qualifier("ossProperties1") OSSProperties ossProperties) { - return new OSSClientBuilder().build(ossProperties.getEndpoint(), - ossProperties.getAccessKeyId(), ossProperties.getSecretAccessKey(), - ossProperties.getSecurityToken(), ossProperties.getConfiguration()); - } -

以 Resource 的形式读取文件

OSS Starter 支持以 Resource 的形式得到文件对象。如果只需读取少量文件,您可以使用这种方式。 @@ -171,3 +153,4 @@ OSS Starter 支持以 Resource 的形式得到文件对象。如果只需读取 如果您对 Spring Cloud OSS Starter 有任何建议或想法,欢迎提交 issue 中或者通过其他社区渠道向我们反馈。 + diff --git a/spring-cloud-alibaba-examples/oss-example/readme.md b/spring-cloud-alibaba-examples/oss-example/readme.md index 8fe54d2f..76e7f899 100644 --- a/spring-cloud-alibaba-examples/oss-example/readme.md +++ b/spring-cloud-alibaba-examples/oss-example/readme.md @@ -11,33 +11,33 @@ If your applications are Spring Cloud applications and you need to use Alibaba C ### Connect to OSS Before we start the demo, let's learn how to connect OSS to a Spring Cloud application. -**Note: This section is to show you how to connect to oss. The actual configurations have been completed in the following example, and you only need to specify your accessKeyId, secretAccessKey and region.** +**Note: This section is to show you how to connect to oss. The actual configurations have been completed in the following example, and you only need to specify your accessKey, secretKey and endpoint.** 1. Add dependency spring-cloud-starter-alicloud-oss in the pom.xml file in your Spring Cloud project. - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alicloud-oss 2. Configure accessKeyId, secretAccessKey and region in application.properties. // application.properties - spring.cloud.alibaba.oss.accessKeyId=your-ak - spring.cloud.alibaba.oss.secretAccessKey=your-sk - spring.cloud.alibaba.oss.region=cn-beijing + spring.cloud.alicloud.access-key=your-ak + spring.cloud.alicloud.secret-key=your-sk + spring.cloud.alicloud.oss.endpoint=*** - To get accessKeyId, secretAccessKey, follow these steps: + To get accessKey, secretKey, follow these steps: 1. On the Alibaba Cloud console, click your avatar on the upper-right corner and click accesskeys. Or visit [User Management](https://usercenter.console.aliyun.com/) page directly: ![undefined](https://cdn.nlark.com/lark/0/2018/png/64647/1535464041257-5c7ae997-daff-45b3-89d4-02d578da4ac7.png) - 2. Get your accessKeyId、secretAccessKey: + 2. Get your accessKey、secretKey: ![undefined](https://cdn.nlark.com/lark/0/2018/png/64647/1535464098793-517491f6-156b-4a98-a5a4-6113cb3c01a4.png) - **Note:** If you are using [STS](https://www.alibabacloud.com/help/doc-detail/28756.html), you should configure securityToken in addition to accessKeyId, secretAccessKey, and region. + **Note:** If you are using [STS](https://www.alibabacloud.com/help/doc-detail/28756.html), you should configure securityToken in addition to accessKey, secretKey, and endpoint. 3. Inject OSSClient and use it to upload files to the OSS server and download a file from OSS server. @@ -60,9 +60,9 @@ Before we start the demo, let's learn how to connect OSS to a Spring Cloud appli spring.application.name=oss-example server.port=18084 - spring.cloud.alibaba.oss.accessKeyId=your-ak - spring.cloud.alibaba.oss.secretAccessKey=your-sk - spring.cloud.alibaba.oss.region=cn-beijing + spring.cloud.alicloud.access-key=your-ak + spring.cloud.alicloud.secret-key=your-sk + spring.cloud.alicloud.oss.endpoint=*** 2. Start the application in IDE or by building a fatjar. @@ -71,7 +71,7 @@ Before we start the demo, let's learn how to connect OSS to a Spring Cloud appli 1. Execute command `mvn clean package` to build a fatjar. 2. Run command `java -jar oss-example.jar` to start the application. -After startup, a bucket called 'spring-cloud-alibaba' is automatically created in OSS. +After startup, a bucket called 'spring-cloud-alibaba-test' is automatically created in OSS. ### Upload or download files @@ -88,14 +88,14 @@ Results: upload fail: The OSS Access Key Id you provided does not exist in our records. [ErrorCode]: InvalidAccessKeyId [RequestId]: RequestId [HostId]: xxx.oss-cn-beijing.aliyuncs.com [ResponseError]: InvalidAccessKeyId The OSS Access Key Id you provided does not exist in our records. RequestId xxx.oss-cn-beijing.aliyuncs.com xxx-accessKeyId #### Download files -Use `curl` command to download files. It will download the oss-test.json file that you uploaded just now and print in result): +Use `curl` command to download files. It will download the oss-test.json file that you uploaded just now and print in result: curl http://localhost:18084/download Results: // If configurations are correct, the output will be as follows - download success, content: { "name": "spring-cloud-alibaba", "github": "https://github.com/spring-cloud-incubator/spring-cloud-alibaba", "authors": ["Jim", "flystar32"], "emails": ["fangjian0423@gmail.com", "flystar32@163.com"] } + download success, content: { "name": "oss-tes" } // If an error occurs during downloading, the output will be 'download fail: fail reason'. For example, if accessKeyId is wrong,fail reason will be as follows download fail: The OSS Access Key Id you provided does not exist in our records. [ErrorCode]: InvalidAccessKeyId [RequestId]: RequestId [HostId]: xxx.oss-cn-beijing.aliyuncs.com [ResponseError]: InvalidAccessKeyId The OSS Access Key Id you provided does not exist in our records. RequestId sxxx.oss-cn-beijing.aliyuncs.com xxx-accessKeyId @@ -103,18 +103,18 @@ Results: ### Verify results on OSS You can verify results on the OSS console when you finish uploading or downloading files. -1. Log on to the [OSS console](https://oss.console.aliyun.com/),and you will find a bucket named `spring-cloud-alibaba`. +1. Log on to the [OSS console](https://oss.console.aliyun.com/),and you will find a bucket named `spring-cloud-alibaba-test`. ![undefined](https://cdn.nlark.com/lark/0/2018/png/64647/1535464204462-ccebb9e0-7233-499c-8dec-8b8348231b2b.png) -2. Click the `spring-cloud-alibaba` bucket, select the Files tab, and you will find the oss-test file. The file 'oss-test' is located in directory 'custom-dir'. The objectName of the file is 'custom-dir/oss-test'. File directory and file is separated by '/'. +2. Click the `spring-cloud-alibaba-test` bucket, select the Files tab, and you will find the oss-test.json file. The objectName of the file is 'oss-test.json'. File directory and file is separated by '/'. ![undefined](https://cdn.nlark.com/lark/0/2018/png/64647/1535618026281-613a338c-f89c-4c7b-8b04-d404d1320699.png) ## Endpoint -OSS starter also supports the implmentation of Spring Boot acutator endpoints. +OSS starter also supports the implementation of Spring Boot actuator endpoints. **Prerequisite:** @@ -127,32 +127,12 @@ To view the endpoint information, visit the following URLs: Spring Boot1.x: OSS Endpoint URL is http://127.0.0.1:18084/oss. -Spring Boot2.x: OSS Endpoint URL is http://127.0.0.1:18084/acutator/oss. +Spring Boot2.x: OSS Endpoint URL is http://127.0.0.1:18084/actuator/oss. Endpoint will show the configurations and the list of buckets of all OSSClients. ![undefined](https://cdn.nlark.com/lark/0/2018/png/64647/1535373658171-20674565-6fe1-4e1e-a596-1dd6f4159ec3.png) -## Multiple OSSClients - -If you need multiple OSSClients,like Multi DataSources, build `OSSProperties` first,and then build `OSSClient`. Specify information such as assessKeyId and secrectAccessKey for each OSSClient. - - @Bean - @ConfigurationProperties(prefix = "spring.cloud.alibaba.oss1") - public OSSProperties ossProperties1() { - return new OSSProperties(); - } - - @Bean - public OSS ossClient1(@Qualifier("ossProperties1") OSSProperties ossProperties) { - return new OSSClientBuilder().build(ossProperties.getEndpoint(), - ossProperties.getAccessKeyId(), ossProperties.getSecretAccessKey(), - ossProperties.getSecurityToken(), ossProperties.getConfiguration()); - } - - -* OSSClient shutdown:You do not need to shutdown OSSClient. It will be done in `OSSApplicationListener`. -

Read file using resource mode

OSS Starter supports getting file objects by `Spring Resource`. Simply configure OSS protocol of the resource: @@ -167,3 +147,4 @@ OSS Starter supports getting file objects by `Spring Resource`. Simply configure You do not need to manually shut down OSSClient. OSS Starter calls all OSSClient shutdown methods in the `OSSApplicationListener` during ApplicationContext close. If you have any feedback or suggestions for Spring Cloud OSS Starter, please don't hesitate to tell us by submitting github issues or via other community channels. + diff --git a/spring-cloud-alibaba-examples/oss-example/src/main/java/com/alibaba/cloud/examples/OssApplication.java b/spring-cloud-alibaba-examples/oss-example/src/main/java/com/alibaba/cloud/examples/OssApplication.java index 9dd6907f..932497ed 100644 --- a/spring-cloud-alibaba-examples/oss-example/src/main/java/com/alibaba/cloud/examples/OssApplication.java +++ b/spring-cloud-alibaba-examples/oss-example/src/main/java/com/alibaba/cloud/examples/OssApplication.java @@ -2,6 +2,8 @@ package com.alibaba.cloud.examples; import java.net.URISyntaxException; +import com.aliyun.oss.OSS; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; @@ -9,8 +11,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; -import com.aliyun.oss.OSS; - /** * OSS Application * diff --git a/spring-cloud-alibaba-examples/oss-example/src/main/java/com/alibaba/cloud/examples/OssController.java b/spring-cloud-alibaba-examples/oss-example/src/main/java/com/alibaba/cloud/examples/OssController.java index c1c9d261..901e2779 100644 --- a/spring-cloud-alibaba-examples/oss-example/src/main/java/com/alibaba/cloud/examples/OssController.java +++ b/spring-cloud-alibaba-examples/oss-example/src/main/java/com/alibaba/cloud/examples/OssController.java @@ -2,7 +2,11 @@ package com.alibaba.cloud.examples; import java.nio.charset.Charset; +import com.aliyun.oss.OSS; +import com.aliyun.oss.common.utils.IOUtils; +import com.aliyun.oss.model.OSSObject; import org.apache.commons.codec.CharEncoding; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; @@ -10,10 +14,6 @@ import org.springframework.util.StreamUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; -import com.aliyun.oss.OSS; -import com.aliyun.oss.common.utils.IOUtils; -import com.aliyun.oss.model.OSSObject; - /** * OSS Controller * diff --git a/spring-cloud-alibaba-examples/rocketmq-example/readme-zh.md b/spring-cloud-alibaba-examples/rocketmq-example/readme-zh.md index 1156b81f..ec27f69e 100644 --- a/spring-cloud-alibaba-examples/rocketmq-example/readme-zh.md +++ b/spring-cloud-alibaba-examples/rocketmq-example/readme-zh.md @@ -6,25 +6,25 @@ [RocketMQ](https://rocketmq.apache.org/) 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。 -在说明RocketMQ的示例之前,我们先了解一下 Spring Cloud Stream。 +在说明 RocketMQ 的示例之前,我们先了解一下 Spring Cloud Stream。 -这是官方对Spring Cloud Stream的一段介绍: +这是官方对 Spring Cloud Stream 的一段介绍: -Spring Cloud Stream是一个用于构建基于消息的微服务应用框架。它基于SpringBoot来创建具有生产级别的单机Spring应用,并且使用 `Spring Integration` 与Broker进行连接。 +Spring Cloud Stream 是一个用于构建基于消息的微服务应用框架。它基于 SpringBoot 来创建具有生产级别的单机 Spring 应用,并且使用 `Spring Integration` 与 Broker 进行连接。 -Spring Cloud Stream提供了消息中间件配置的统一抽象,推出了 publish-subscribe、consumer groups、partition 这些统一的概念。 +Spring Cloud Stream 提供了消息中间件配置的统一抽象,推出了 publish-subscribe、consumer groups、partition 这些统一的概念。 -Spring Cloud Stream 内部有2个概念:Binder 和 Binding。 +Spring Cloud Stream 内部有两个概念:Binder 和 Binding。 -* Binder: 跟外部消息中间件集成的组件,用来创建Binding,各消息中间件都有自己的Binder实现。 +* Binder: 跟外部消息中间件集成的组件,用来创建 Binding,各消息中间件都有自己的 Binder 实现。 -比如 `Kafka` 的实现 `KafkaMessageChannelBinder` ,`RabbitMQ` 的实现 `RabbitMessageChannelBinder` 以及 `RocketMQ` 的实现 `RocketMQMessageChannelBinder` 。 +比如 `Kafka` 的实现 `KafkaMessageChannelBinder`,`RabbitMQ` 的实现 `RabbitMessageChannelBinder` 以及 `RocketMQ` 的实现 `RocketMQMessageChannelBinder`。 -* Binding: 包括Input Binding和Output Binding。 +* Binding: 包括 Input Binding 和 Output Binding。 -Binding在消息中间件与应用程序提供的Provider和Consumer之间提供了一个桥梁,实现了开发者只需使用应用程序的Provider或Consumer生产或消费数据即可,屏蔽了开发者与底层消息中间件的接触。 +Binding 在消息中间件与应用程序提供的 Provider 和 Consumer 之间提供了一个桥梁,实现了开发者只需使用应用程序的 Provider 或 Consumer 生产或消费数据即可,屏蔽了开发者与底层消息中间件的接触。 -下图是Spring Cloud Stream的架构设计。 +下图是 Spring Cloud Stream 的架构设计。 ![](https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/images/SCSt-overview.png) @@ -40,12 +40,12 @@ Binding在消息中间件与应用程序提供的Provider和Consumer之间提供 ```xml - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-stream-rocketmq ``` -2. 配置Input和Output的Binding信息并配合`@EnableBinding`注解使其生效 +2. 配置 Input 和 Output 的 Binding 信息并配合 `@EnableBinding` 注解使其生效 ```java @SpringBootApplication @@ -57,10 +57,10 @@ public class RocketMQApplication { } ``` -配置Binding信息: +配置 Binding 信息: ```properties # 配置rocketmq的nameserver地址 -spring.cloud.stream.rocketmq.binder.namesrv-addr=127.0.0.1:9876 +spring.cloud.stream.rocketmq.binder.name-server=127.0.0.1:9876 # 定义name为output的binding spring.cloud.stream.bindings.output.destination=test-topic spring.cloud.stream.bindings.output.content-type=application/json @@ -75,7 +75,7 @@ spring.cloud.stream.bindings.input.group=test-group ### 下载并启动 RocketMQ -在接入RocketMQ Binder之前,首先需要启动RocketMQ的Name Server和Broker。 +**在接入 RocketMQ Binder 之前,首先需要启动 RocketMQ 的 Name Server 和 Broker。** 1. 下载[RocketMQ最新的二进制文件](https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.3.2/rocketmq-all-4.3.2-bin-release.zip),并解压 @@ -85,13 +85,13 @@ spring.cloud.stream.bindings.input.group=test-group sh bin/mqnamesrv ``` -3. 启动Broker +3. 启动 Broker ```bash sh bin/mqbroker -n localhost:9876 ``` -4. 创建Topic: test-topic +4. 创建 Topic: test-topic ```bash sh bin/mqadmin updateTopic -n localhost:9876 -c DefaultCluster -t test-topic @@ -108,24 +108,24 @@ server.port=28081 2. 启动应用,支持 IDE 直接启动和编译打包后启动。 - 1. IDE直接启动:找到主类 `RocketMQApplication`,执行 main 方法启动应用。 - 2. 打包编译后启动:首先执行 `mvn clean package` 将工程编译打包,然后执行 `java -jar rocketmq-example.jar`启动应用。 + 1. IDE 直接启动:找到主类 `RocketMQApplication`,执行 main 方法启动应用。 + 2. 打包编译后启动:首先执行 `mvn clean package` 将工程编译打包,然后执行 `java -jar rocketmq-example.jar` 启动应用。 ### 消息处理 -使用name为output对应的binding发送消息到test-topic这个topic。 +使用 name 为 output 对应的 binding 发送消息到 test-topic 这个 topic。 -使用2个input binding订阅数据。 +使用2个 input binding 订阅数据。 -* input1:订阅topic为test-topic的消息,顺序消费所有消息(顺序消费的前提是所有消息都在一个MessageQueue中) +* input1: 订阅 topic 为 test-topic 的消息,顺序消费所有消息(顺序消费的前提是所有消息都在一个 MessageQueue 中) -* input2:订阅topic为test-topic的消息,异步消费tags为tagStr的消息,Consumer端线程池个数为20 +* input2: 订阅 topic 为 test-topic 的消息,异步消费 tags 为 tagStr 的消息,Consumer 端线程池个数为20 配置信息如下: ```properties -spring.cloud.stream.rocketmq.binder.namesrv-addr=127.0.0.1:9876 +spring.cloud.stream.rocketmq.binder.name-server=127.0.0.1:9876 spring.cloud.stream.bindings.output.destination=test-topic spring.cloud.stream.bindings.output.content-type=application/json @@ -146,7 +146,7 @@ spring.cloud.stream.bindings.input2.consumer.concurrency=20 #### 消息发送 -使用MessageChannel进行消息发送: +使用 MessageChannel 进行消息发送: ```java public class ProducerRunner implements CommandLineRunner { @@ -162,7 +162,7 @@ public class ProducerRunner implements CommandLineRunner { } ``` -或者使用RocketMQ原生的API进行消息发送: +或者使用 RocketMQ 原生的 API 进行消息发送: ```java public class RocketMQProducer { @@ -177,7 +177,7 @@ public class RocketMQProducer { #### 消息接收 -使用`@StreamListener`注解接收消息: +使用 `@StreamListener` 注解接收消息: ```java @Service @@ -204,7 +204,7 @@ Spring Boot 应用支持通过 Endpoint 来暴露相关信息,RocketMQ Stream * Spring Boot 1.x 中添加配置 `management.security.enabled=false` * Spring Boot 2.x 中添加配置 `management.endpoints.web.exposure.include=*` -Spring Boot 1.x 可以通过访问 http://127.0.0.1:28081/rocketmq_binder 来查看 RocketMQ Binder Endpoint 的信息。Spring Boot 2.x 可以通过访问 http://127.0.0.1:28081/actuator/rocketmq-binder 来访问。 +Spring Boot 1.x 可以通过访问 http://127.0.0.1:18083/rocketmq_binder 来查看 RocketMQ Binder Endpoint 的信息。Spring Boot 2.x 可以通过访问 http://127.0.0.1:28081/actuator/rocketmq-binder 来访问。 这里会统计消息最后一次发送的数据,消息发送成功或失败的次数,消息消费成功或失败的次数等数据。 @@ -258,7 +258,7 @@ Spring Boot 1.x 可以通过访问 http://127.0.0.1:28081/rocketmq_binder 来查 } ``` -注意:要想查看统计数据需要在pom里加上 [metrics-core依赖](https://mvnrepository.com/artifact/io.dropwizard.metrics/metrics-core) 。如若不加,endpoint将会显示warning信息而不会显示统计信息: +注意:要想查看统计数据需要在pom里加上 [metrics-core依赖](https://mvnrepository.com/artifact/io.dropwizard.metrics/metrics-core)。如若不加,endpoint 将会显示 warning 信息而不会显示统计信息: ```json { diff --git a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-consume-example/src/main/java/com/alibaba/cloud/examples/RocketMQConsumerApplication.java b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-consume-example/src/main/java/com/alibaba/cloud/examples/RocketMQConsumerApplication.java index 9459f171..6add624e 100644 --- a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-consume-example/src/main/java/com/alibaba/cloud/examples/RocketMQConsumerApplication.java +++ b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-consume-example/src/main/java/com/alibaba/cloud/examples/RocketMQConsumerApplication.java @@ -1,13 +1,13 @@ package com.alibaba.cloud.examples; +import com.alibaba.cloud.examples.RocketMQConsumerApplication.MySink; + import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.annotation.Input; import org.springframework.messaging.SubscribableChannel; -import com.alibaba.cloud.examples.RocketMQConsumerApplication.MySink; - /** * @author Jim */ 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 c0111f31..bad9fa22 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 @@ -1,5 +1,7 @@ package com.alibaba.cloud.examples; +import com.alibaba.cloud.examples.RocketMQProduceApplication.MySource; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; @@ -9,8 +11,6 @@ import org.springframework.cloud.stream.annotation.Output; import org.springframework.context.annotation.Bean; import org.springframework.messaging.MessageChannel; -import com.alibaba.cloud.examples.RocketMQProduceApplication.MySource; - /** * @author Jim */ diff --git a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/src/main/java/com/alibaba/cloud/examples/SenderService.java b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/src/main/java/com/alibaba/cloud/examples/SenderService.java index 8084562e..09865d72 100644 --- a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/src/main/java/com/alibaba/cloud/examples/SenderService.java +++ b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/src/main/java/com/alibaba/cloud/examples/SenderService.java @@ -3,8 +3,11 @@ package com.alibaba.cloud.examples; import java.util.HashMap; import java.util.Map; +import com.alibaba.cloud.examples.RocketMQProduceApplication.MySource; + import org.apache.rocketmq.common.message.MessageConst; import org.apache.rocketmq.spring.support.RocketMQHeaders; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; @@ -12,8 +15,6 @@ import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Service; import org.springframework.util.MimeTypeUtils; -import com.alibaba.cloud.examples.RocketMQProduceApplication.MySource; - /** * @author Jim */ diff --git a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/src/main/java/com/alibaba/cloud/examples/TransactionListenerImpl.java b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/src/main/java/com/alibaba/cloud/examples/TransactionListenerImpl.java index 25feb612..c926f3da 100644 --- a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/src/main/java/com/alibaba/cloud/examples/TransactionListenerImpl.java +++ b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-produce-example/src/main/java/com/alibaba/cloud/examples/TransactionListenerImpl.java @@ -19,6 +19,7 @@ package com.alibaba.cloud.examples; import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener; import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener; import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState; + import org.springframework.messaging.Message; /** diff --git a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/com/alibaba/cloud/examples/SimpleTask.java b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/com/alibaba/cloud/examples/SimpleTask.java index 31d0ffa2..1f910e03 100644 --- a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/com/alibaba/cloud/examples/SimpleTask.java +++ b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/com/alibaba/cloud/examples/SimpleTask.java @@ -16,12 +16,12 @@ package com.alibaba.cloud.examples; -import org.springframework.beans.factory.annotation.Autowired; - import com.alibaba.edas.schedulerx.ProcessResult; import com.alibaba.edas.schedulerx.ScxSimpleJobContext; import com.alibaba.edas.schedulerx.ScxSimpleJobProcessor; +import org.springframework.beans.factory.annotation.Autowired; + /** * @author xiaolongzuo */ diff --git a/spring-cloud-alibaba-examples/seata-example/account-service/src/main/java/com/alibaba/cloud/examples/AccountController.java b/spring-cloud-alibaba-examples/seata-example/account-service/src/main/java/com/alibaba/cloud/examples/AccountController.java index 46c2e33a..00bad6db 100644 --- a/spring-cloud-alibaba-examples/seata-example/account-service/src/main/java/com/alibaba/cloud/examples/AccountController.java +++ b/spring-cloud-alibaba-examples/seata-example/account-service/src/main/java/com/alibaba/cloud/examples/AccountController.java @@ -17,14 +17,13 @@ package com.alibaba.cloud.examples; import java.util.Random; +import io.seata.core.context.RootContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; -import io.seata.core.context.RootContext; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; /** * @author xiaojing @@ -45,7 +44,7 @@ public class AccountController { this.random = new Random(); } - @RequestMapping(value = "/account", method = RequestMethod.POST, produces = "application/json") + @PostMapping(value = "/account", produces = "application/json") public String account(String userId, int money) { LOGGER.info("Account Service ... xid: " + RootContext.getXID()); diff --git a/spring-cloud-alibaba-examples/seata-example/account-service/src/main/java/com/alibaba/cloud/examples/DatabaseConfiguration.java b/spring-cloud-alibaba-examples/seata-example/account-service/src/main/java/com/alibaba/cloud/examples/DatabaseConfiguration.java index 777314b7..d9d0cac9 100644 --- a/spring-cloud-alibaba-examples/seata-example/account-service/src/main/java/com/alibaba/cloud/examples/DatabaseConfiguration.java +++ b/spring-cloud-alibaba-examples/seata-example/account-service/src/main/java/com/alibaba/cloud/examples/DatabaseConfiguration.java @@ -17,6 +17,10 @@ package com.alibaba.cloud.examples; import java.sql.SQLException; +import com.alibaba.druid.pool.DruidDataSource; + +import io.seata.rm.datasource.DataSourceProxy; + import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -24,10 +28,6 @@ import org.springframework.context.annotation.Primary; import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; -import com.alibaba.druid.pool.DruidDataSource; - -import io.seata.rm.datasource.DataSourceProxy; - /** * @author xiaojing */ 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 index fd3d304f..0777ae8a 100644 --- 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 @@ -4,7 +4,7 @@ transport { #NIO NATIVE server = "NIO" #enable heartbeat - heartbeat = true + heartbeat = false #thread factory for netty thread-factory { boss-thread-prefix = "NettyBoss" @@ -28,7 +28,7 @@ transport { } service { #vgroup->rgroup - vgroup_mapping.account-service-fescar-service-group = "default" + vgroup_mapping.account-service-seata-service-group = "default" #only support single node default.grouplist = "127.0.0.1:8091" #degrade current not support @@ -46,17 +46,22 @@ client { 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" } -## metrics settings -metrics { - enabled = false - registry-type = "compact" - # multi exporters use comma divided - exporter-list = "prometheus" - exporter-prometheus-port = 9898 +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 index 6dbeb22b..b98f5704 100644 --- 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 @@ -4,7 +4,7 @@ registry { nacos { serverAddr = "localhost" - namespace = "public" + namespace = "" cluster = "default" } eureka { @@ -50,8 +50,7 @@ config { nacos { serverAddr = "localhost" - namespace = "public" - cluster = "default" + namespace = "" } consul { serverAddr = "127.0.0.1:8500" diff --git a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/java/com/alibaba/cloud/examples/HomeController.java b/spring-cloud-alibaba-examples/seata-example/business-service/src/main/java/com/alibaba/cloud/examples/HomeController.java index 8b4ab39d..96ca752f 100644 --- a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/java/com/alibaba/cloud/examples/HomeController.java +++ b/spring-cloud-alibaba-examples/seata-example/business-service/src/main/java/com/alibaba/cloud/examples/HomeController.java @@ -16,8 +16,13 @@ package com.alibaba.cloud.examples; +import com.alibaba.cloud.examples.BusinessApplication.OrderService; +import com.alibaba.cloud.examples.BusinessApplication.StorageService; + +import io.seata.spring.annotation.GlobalTransactional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -29,11 +34,6 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; -import com.alibaba.cloud.examples.BusinessApplication.OrderService; -import com.alibaba.cloud.examples.BusinessApplication.StorageService; - -import io.seata.spring.annotation.GlobalTransactional; - /** * @author xiaojing */ 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 index a766d498..a6e431bc 100644 --- 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 @@ -4,7 +4,7 @@ transport { #NIO NATIVE server = "NIO" #enable heartbeat - heartbeat = true + heartbeat = false #thread factory for netty thread-factory { boss-thread-prefix = "NettyBoss" @@ -28,7 +28,7 @@ transport { } service { #vgroup->rgroup - vgroup_mapping.business-service-fescar-service-group = "default" + vgroup_mapping.business-service-seata-service-group = "default" #only support single node default.grouplist = "127.0.0.1:8091" #degrade current not support @@ -46,17 +46,22 @@ client { 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" } -## metrics settings -metrics { - enabled = false - registry-type = "compact" - # multi exporters use comma divided - exporter-list = "prometheus" - exporter-prometheus-port = 9898 +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 index 6dbeb22b..b98f5704 100644 --- 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 @@ -4,7 +4,7 @@ registry { nacos { serverAddr = "localhost" - namespace = "public" + namespace = "" cluster = "default" } eureka { @@ -50,8 +50,7 @@ config { nacos { serverAddr = "localhost" - namespace = "public" - cluster = "default" + namespace = "" } consul { serverAddr = "127.0.0.1:8500" diff --git a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/DatabaseConfiguration.java b/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/DatabaseConfiguration.java index b38de9b7..e947312b 100644 --- a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/DatabaseConfiguration.java +++ b/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/DatabaseConfiguration.java @@ -17,6 +17,10 @@ package com.alibaba.cloud.examples; import java.sql.SQLException; +import com.alibaba.druid.pool.DruidDataSource; + +import io.seata.rm.datasource.DataSourceProxy; + import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -24,10 +28,6 @@ import org.springframework.context.annotation.Primary; import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; -import com.alibaba.druid.pool.DruidDataSource; - -import io.seata.rm.datasource.DataSourceProxy; - /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OrderController.java b/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OrderController.java index 3060a7b7..66d3ea68 100644 --- a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OrderController.java +++ b/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OrderController.java @@ -21,8 +21,10 @@ import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Random; +import io.seata.core.context.RootContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -38,8 +40,6 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; -import io.seata.core.context.RootContext; - /** * @author xiaojing */ 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 index 536cc785..89f55344 100644 --- 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 @@ -4,7 +4,7 @@ transport { #NIO NATIVE server = "NIO" #enable heartbeat - heartbeat = true + heartbeat = false #thread factory for netty thread-factory { boss-thread-prefix = "NettyBoss" @@ -28,7 +28,7 @@ transport { } service { #vgroup->rgroup - vgroup_mapping.order-service-fescar-service-group = "default" + vgroup_mapping.order-service-seata-service-group = "default" #only support single node default.grouplist = "127.0.0.1:8091" #degrade current not support @@ -46,17 +46,22 @@ client { 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" } -## metrics settings -metrics { - enabled = false - registry-type = "compact" - # multi exporters use comma divided - exporter-list = "prometheus" - exporter-prometheus-port = 9898 +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 index 6dbeb22b..b98f5704 100644 --- 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 @@ -4,7 +4,7 @@ registry { nacos { serverAddr = "localhost" - namespace = "public" + namespace = "" cluster = "default" } eureka { @@ -50,8 +50,7 @@ config { nacos { serverAddr = "localhost" - namespace = "public" - cluster = "default" + namespace = "" } consul { serverAddr = "127.0.0.1:8500" diff --git a/spring-cloud-alibaba-examples/seata-example/readme-zh.md b/spring-cloud-alibaba-examples/seata-example/readme-zh.md index f8b012aa..2723de58 100644 --- a/spring-cloud-alibaba-examples/seata-example/readme-zh.md +++ b/spring-cloud-alibaba-examples/seata-example/readme-zh.md @@ -99,12 +99,16 @@ CREATE TABLE `account_tbl` ( 点击这个页面 [https://github.com/seata/seata/releases](https://github.com/seata/seata/releases),下载最新版本的 Seata Server 端. -进入解压之后的 bin 目录,执行如下命令来启动 +进入解压之后的 bin 目录,执行如下命令来启动, 所有启动参数为可选项。 ```$shell -sh seata-server.sh -p $LISTEN_PORT -m $MODE(file or db) +sh seata-server.sh -p $LISTEN_PORT -m $MODE(file or db) -h $HOST -e $ENV ``` - +-p seata-server 监听服务端口号 +-m 存储模式,可选值:file、db。file 用于单点模式,db用于ha模式,当使用db存储模式,需要修改配置中store配置节点的数据库配置,同时在数据库中初始化[global_table、branch_table和 +lock_table](https://github.com/seata/seata/blob/develop/server/src/main/resources/db_store.sql) +-h 用于解决seata-server和业务侧跨网络问题,其配置的host值直接显示到注册中心的服务可用地址host,当跨网络时这里需要配置为公网IP或NATIP,若都在同一局域网则无需配置 +-e 用于解决多环境配置中心隔离问题 在这个示例中,采用如下命令来启动 Seata Server ```$shell @@ -130,7 +134,7 @@ http://127.0.0.1:18081/seata/rest ### Xid 信息是否成功传递 -在 `account-server`、`order-service` 和 `storage-service` 三个 服务的 Controller 中,第一个执行的逻辑都是输出 RootContext 中的 Xid 信息,如果看到都输出了正确的 Xid 信息,即每次都发生变化,且同一次调用中所有服务的 Xid 都一致。则表明 Fescar 的 Xid 的传递和还原是正常的。 +在 `account-server`、`order-service` 和 `storage-service` 三个 服务的 Controller 中,第一个执行的逻辑都是输出 RootContext 中的 Xid 信息,如果看到都输出了正确的 Xid 信息,即每次都发生变化,且同一次调用中所有服务的 Xid 都一致。则表明 Seata 的 Xid 的传递和还原是正常的。 ### 数据库中数据是否一致 diff --git a/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/java/com/alibaba/cloud/examples/DatabaseConfiguration.java b/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/java/com/alibaba/cloud/examples/DatabaseConfiguration.java index f8566c86..661f1aff 100644 --- a/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/java/com/alibaba/cloud/examples/DatabaseConfiguration.java +++ b/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/java/com/alibaba/cloud/examples/DatabaseConfiguration.java @@ -18,6 +18,10 @@ package com.alibaba.cloud.examples; import java.sql.SQLException; +import com.alibaba.druid.pool.DruidDataSource; + +import io.seata.rm.datasource.DataSourceProxy; + import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -25,10 +29,6 @@ import org.springframework.context.annotation.Primary; import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; -import com.alibaba.druid.pool.DruidDataSource; - -import io.seata.rm.datasource.DataSourceProxy; - /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/java/com/alibaba/cloud/examples/StorageController.java b/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/java/com/alibaba/cloud/examples/StorageController.java index 44092bdf..ea835168 100644 --- a/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/java/com/alibaba/cloud/examples/StorageController.java +++ b/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/java/com/alibaba/cloud/examples/StorageController.java @@ -16,16 +16,16 @@ package com.alibaba.cloud.examples; +import io.seata.core.context.RootContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import io.seata.core.context.RootContext; - /** * @author xiaojing */ 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 index 90cb0ede..2915b99c 100644 --- 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 @@ -4,7 +4,7 @@ transport { #NIO NATIVE server = "NIO" #enable heartbeat - heartbeat = true + heartbeat = false #thread factory for netty thread-factory { boss-thread-prefix = "NettyBoss" @@ -28,7 +28,7 @@ transport { } service { #vgroup->rgroup - vgroup_mapping.storage-service-fescar-service-group = "default" + vgroup_mapping.storage-service-seata-service-group = "default" #only support single node default.grouplist = "127.0.0.1:8091" #degrade current not support @@ -46,17 +46,22 @@ client { 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" } -## metrics settings -metrics { - enabled = false - registry-type = "compact" - # multi exporters use comma divided - exporter-list = "prometheus" - exporter-prometheus-port = 9898 +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 index 6dbeb22b..b98f5704 100644 --- 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 @@ -4,7 +4,7 @@ registry { nacos { serverAddr = "localhost" - namespace = "public" + namespace = "" cluster = "default" } eureka { @@ -50,8 +50,7 @@ config { nacos { serverAddr = "localhost" - namespace = "public" - cluster = "default" + namespace = "" } consul { serverAddr = "127.0.0.1:8500" diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md index af535e6d..35b8dc21 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md @@ -19,7 +19,7 @@ ```xml - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-sentinel ``` @@ -122,28 +122,30 @@ ## 自定义限流处理逻辑 -1. URL 限流触发后默认处理逻辑是,直接返回 "Blocked by Sentinel (flow limiting)"。 +* 默认限流异常处理 + +URL 限流触发后默认处理逻辑是,直接返回 "Blocked by Sentinel (flow limiting)"。 如果需要自定义处理逻辑,实现的方式如下: - ```java - public class CustomUrlBlockHandler implements UrlBlockHandler { - @Override - public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { - // todo add your logic - } - } +```java +public class CustomUrlBlockHandler implements UrlBlockHandler { + @Override + public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { + // todo add your logic + } +} - WebCallbackManager.setUrlBlockHandler(new CustomUrlBlockHandler()); - ``` +WebCallbackManager.setUrlBlockHandler(new CustomUrlBlockHandler()); +``` -2. 自定义限流触发后,默认的处理逻辑是抛出异常。 +* 使用 `@SentinelResource` 注解下的限流异常处理 如果需要自定义处理逻辑,填写 `@SentinelResource` 注解的 `blockHandler` 属性(针对所有类型的 `BlockException`,需自行判断)或 `fallback` 属性(针对熔断降级异常),注意**对应方法的签名和位置有限制**,详情见 [Sentinel 注解支持文档](https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81#sentinelresource-%E6%B3%A8%E8%A7%A3)。示例实现如下: ```java public class TestService { - // blockHandler 是位于 ExceptionUtil 类下的 handleException 静态方法,需符合对应的类型限制. + // blockHandler 是位于 ExceptionUtil 类下的 handleException 静态方法,需符合对应的类型限制. @SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class}) public void test() { System.out.println("Test"); @@ -172,7 +174,7 @@ public final class ExceptionUtil { } ``` -一个简单的示例可以见 [sentinel-demo-annotation-spring-aop](https://github.com/alibaba/Sentinel/tree/master/sentinel-demo/sentinel-demo-annotation-spring-aop)。 +一个简单的 `@SentinelResource` 示例可以见 [sentinel-demo-annotation-spring-aop](https://github.com/alibaba/Sentinel/tree/master/sentinel-demo/sentinel-demo-annotation-spring-aop)。 ## Endpoint 信息查看 @@ -212,9 +214,9 @@ spring.cloud.sentinel.datasource.ds2.nacos.data-type=json `ds1` 和 `ds2` 表示ReadableDataSource的名称,可随意编写。`ds1` 和 `ds2` 后面的 `file` 和 `nacos` 表示ReadableDataSource的类型。 -目前支持`file`, `nacos`, `zk`, `apollo` 这4种类型。 +目前支持`file`, `nacos`, `zk`, `apollo`,`redis` 这5种类型。 -其中`nacos`,`zk`,`apollo`这3种类型的使用需要加上对应的依赖`sentinel-datasource-nacos`, `sentinel-datasource-zookeeper`, `sentinel-datasource-apollo`。 +其中`nacos`,`zk`,`apollo`,`redis` 这4种类型的使用需要加上对应的依赖`sentinel-datasource-nacos`, `sentinel-datasource-zookeeper`, `sentinel-datasource-apollo`, `sentinel-datasource-redis`。 当ReadableDataSource加载规则数据成功的时候,控制台会打印出相应的日志信息: diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md index e3135729..b6c56cd0 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme.md @@ -15,7 +15,7 @@ Before we start the demo, let's learn how to connect Sentinel to a Spring Cloud 1. Add dependency spring-cloud-starter-alibaba-sentinel in the pom.xml file in your Spring Cloud project. - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-sentinel @@ -108,7 +108,9 @@ The screenshot belows shows invoke success: ## Customize Flow Control Logic -1. When a URL resource is blocked by Sentinel, the default logic is return HTTP response "Blocked by Sentinel (flow limiting)". +* Flow control exception handle by default + +When a URL resource is blocked by Sentinel, the default logic is return HTTP response "Blocked by Sentinel (flow limiting)". If you want to customize your flow control logic, see the code below: @@ -123,7 +125,9 @@ The screenshot belows shows invoke success: WebCallbackManager.setUrlBlockHandler(new CustomUrlBlockHandler()); -2. When a custom resource is blocked by Sentinel, the default logic is throw BlockException. +* Flow control exception handle by using `@SentinelResource` + +When a custom resource is blocked by Sentinel, the default logic is throw BlockException. If you want to customize your flow control logic, implement interface `SentinelExceptionHandler`, set @SentinelResource's blockHandler() and blockHandlerClass(). See the code below: @@ -185,9 +189,9 @@ spring.cloud.sentinel.datasource.ds2.nacos.data-type=json `ds1` and `ds2` means the name of ReadableDataSource, you can write whatever you want. The `file` and `nacos` after name `ds1` and `ds2` means the type of ReadableDataSource. -Now ReadableDataSource type support 4 categories: `file`, `nacos`, `zk` and `apollo`. +Now ReadableDataSource type support 5 categories: `file`, `nacos`, `zk`, `apollo` and `redis`. -If you want to use `nacos`, `zk` or `apollo` ReadableDataSource, you could add `sentinel-datasource-nacos`, `sentinel-datasource-zookeeper` or `sentinel-datasource-apollo` dependency. +If you want to use `nacos`, `zk`, `apollo` or `redis` ReadableDataSource, you could add `sentinel-datasource-nacos`, `sentinel-datasource-zookeeper`,`sentinel-datasource-apollo` or `sentinel-datasource-redis` dependency. When ReadableDataSource load rule data successfully, console will print some logs: diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/java/com/alibaba/cloud/examples/ExceptionUtil.java b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/java/com/alibaba/cloud/examples/ExceptionUtil.java index 6558a91d..0e5ba677 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/java/com/alibaba/cloud/examples/ExceptionUtil.java +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/java/com/alibaba/cloud/examples/ExceptionUtil.java @@ -1,11 +1,11 @@ package com.alibaba.cloud.examples; -import org.springframework.http.HttpRequest; -import org.springframework.http.client.ClientHttpRequestExecution; - import com.alibaba.cloud.sentinel.rest.SentinelClientHttpResponse; import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; + /** * @author fangjian */ diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/java/com/alibaba/cloud/examples/ServiceApplication.java b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/java/com/alibaba/cloud/examples/ServiceApplication.java index 7dea70ee..fda03fe6 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/java/com/alibaba/cloud/examples/ServiceApplication.java +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/java/com/alibaba/cloud/examples/ServiceApplication.java @@ -1,13 +1,13 @@ package com.alibaba.cloud.examples; +import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate; +import com.alibaba.csp.sentinel.datasource.Converter; + import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; -import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate; -import com.alibaba.csp.sentinel.datasource.Converter; - /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/java/com/alibaba/cloud/examples/TestController.java b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/java/com/alibaba/cloud/examples/TestController.java index 9d8f41ad..60191187 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/java/com/alibaba/cloud/examples/TestController.java +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/java/com/alibaba/cloud/examples/TestController.java @@ -1,13 +1,13 @@ package com.alibaba.cloud.examples; +import com.alibaba.csp.sentinel.annotation.SentinelResource; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; -import com.alibaba.csp.sentinel.annotation.SentinelResource; - /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/readme-zh.md b/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/readme-zh.md index e541cb77..ca7459db 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/readme-zh.md +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/readme-zh.md @@ -6,9 +6,9 @@ [Sentinel](https://github.com/alibaba/Sentinel) 是阿里巴巴开源的分布式系统的流量防卫组件,Sentinel 把流量作为切入点,从流量控制,熔断降级,系统负载保护等多个维度保护服务的稳定性。 -[Dubbo](http://dubbo.apache.org/)是一款高性能Java RPC框架,有对应的[SpringBoot工程](https://github.com/apache/incubator-dubbo-spring-boot-project)。 +[Dubbo](http://dubbo.apache.org/)是一款高性能Java RPC框架,有对应的[SpringBoot工程](https://github.com/apache/dubbo-spring-boot-project)。 -本项目专注于Sentinel与Dubbo的整合,关于Sentinel的更多特性可以查看[sentinel-core-example](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example)。 +本项目专注于Sentinel与Dubbo的整合,关于Sentinel的更多特性可以查看[sentinel-core-example](https://github.com/alibaba/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example)。 ## 示例 @@ -19,7 +19,7 @@ 1. 首先,修改 pom.xml 文件,引入 Sentinel starter 和 Dubbo starter。 - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-sentinel @@ -112,7 +112,7 @@ Consumer端在服务调用之前,先定义限流规则。 根据Provider端中发布的定义,使用Dubbo的@Reference注解注入服务对应的Bean: @Reference(version = "${foo.service.version}", application = "${dubbo.application.id}", - url = "dubbo://localhost:12345", timeout = 30000) + path = "dubbo://localhost:12345", timeout = 30000) private FooService fooService; 由于设置的qps是10。调用15次查看是否被限流: @@ -146,4 +146,3 @@ Consumer端: 1. IDE直接启动:找到主类 `SentinelDubboConsumerApp`,执行 main 方法启动应用。 2. 打包编译后启动:首先执行 `mvn clean package` 将工程编译打包,然后执行 `java -jar sentinel-dubbo-consumer-example.jar`启动应用。 - diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/readme.md b/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/readme.md index 25610eaa..9d22f71a 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/readme.md +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/readme.md @@ -1,4 +1,4 @@ -# Sentinel Provider Example +# Sentinel Dubbo Example ## Project Instruction This example illustrates how to use Sentinel starter to implement flow control for Spring Cloud applications. @@ -7,7 +7,7 @@ This example illustrates how to use Sentinel starter to implement flow control f [Dubbo](http://dubbo.apache.org/) is a high-performance, java based open source RPC framework. -This example focus on the integration of Sentinel and Dubbo. You can see more features on [sentinel-core-example](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example). +This example focus on the integration of Sentinel and Dubbo. You can see more features on [sentinel-core-example](https://github.com/alibaba/spring-cloud-alibaba/tree/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example). ## Demo @@ -18,7 +18,7 @@ Before we start the demo, let's learn how to connect Sentinel with Dubbo to a Sp 1. Add dependency spring-cloud-starter-alibaba-sentinel and dubbo-spring-boot-starter in the pom.xml file in your Spring Cloud project. - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-sentinel @@ -110,7 +110,7 @@ Configure rules: Using the `@Reference` annotation to inject service: @Reference(version = "${foo.service.version}", application = "${dubbo.application.id}", - url = "dubbo://localhost:12345", timeout = 30000) + path = "dubbo://localhost:12345", timeout = 30000) private FooService fooService; Because QPS is 10, we can see that flow control takes effect in this invocation: @@ -143,4 +143,3 @@ Consumer side: 1. Start in IDE: Find main class `SentinelDubboConsumerApp`, and execute the main method. 2. Build a fatjar: Execute command `mvn clean package` to build a fatjar, and run command `java -jar sentinel-dubbo-consumer-example.jar` to start the application. - 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 f51c29c7..f797b3d2 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 @@ -25,6 +25,7 @@ com.alibaba.cloud sentinel-dubbo-api + ${project.version} diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/sentinel-dubbo-consumer-example/src/main/java/com/alibaba/cloud/examples/SentinelDubboConsumerApp.java b/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/sentinel-dubbo-consumer-example/src/main/java/com/alibaba/cloud/examples/SentinelDubboConsumerApp.java index df50cb2b..115b7cc9 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/sentinel-dubbo-consumer-example/src/main/java/com/alibaba/cloud/examples/SentinelDubboConsumerApp.java +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-dubbo-example/sentinel-dubbo-consumer-example/src/main/java/com/alibaba/cloud/examples/SentinelDubboConsumerApp.java @@ -2,16 +2,16 @@ package com.alibaba.cloud.examples; import java.util.Collections; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; - import com.alibaba.csp.sentinel.slots.block.RuleConstant; import com.alibaba.csp.sentinel.slots.block.SentinelRpcException; import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; + /** * @author fangjian */ @@ -26,7 +26,8 @@ public class SentinelDubboConsumerApp { public static void main(String[] args) { FlowRule flowRule = new FlowRule(); - flowRule.setResource("com.alibaba.cloud.examples.FooService:hello(java.lang.String)"); + flowRule.setResource( + "com.alibaba.cloud.examples.FooService:hello(java.lang.String)"); flowRule.setCount(10); flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); flowRule.setLimitApp("default"); 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 1f4f2de2..cb5040e2 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 @@ -25,6 +25,7 @@ com.alibaba.cloud sentinel-dubbo-api + ${project.version} diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-zuul-example/src/main/java/com/alibaba/cloud/examples/RulesController.java b/spring-cloud-alibaba-examples/sentinel-example/sentinel-zuul-example/src/main/java/com/alibaba/cloud/examples/RulesController.java index 73d9ef5a..3af8104a 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-zuul-example/src/main/java/com/alibaba/cloud/examples/RulesController.java +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-zuul-example/src/main/java/com/alibaba/cloud/examples/RulesController.java @@ -19,9 +19,6 @@ package com.alibaba.cloud.examples; import java.util.List; import java.util.Set; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition; import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager; import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule; @@ -29,6 +26,9 @@ import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager; import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + /** * @author Jim */ 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 7393707e..96164f10 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 @@ -18,13 +18,13 @@ package com.alibaba.cloud.examples; import javax.servlet.http.HttpServletRequest; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - import com.alibaba.csp.sentinel.adapter.gateway.zuul.callback.RequestOriginParser; import com.alibaba.csp.sentinel.adapter.gateway.zuul.fallback.BlockResponse; import com.alibaba.csp.sentinel.adapter.gateway.zuul.fallback.ZuulBlockFallbackProvider; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + /** * @author Jim */ diff --git a/spring-cloud-alibaba-examples/sms-example/src/main/java/com/alibaba/cloud/example/SmsController.java b/spring-cloud-alibaba-examples/sms-example/src/main/java/com/alibaba/cloud/example/SmsController.java index 9050b921..dad78d87 100644 --- a/spring-cloud-alibaba-examples/sms-example/src/main/java/com/alibaba/cloud/example/SmsController.java +++ b/spring-cloud-alibaba-examples/sms-example/src/main/java/com/alibaba/cloud/example/SmsController.java @@ -3,11 +3,6 @@ package com.alibaba.cloud.example; import java.util.ArrayList; import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - import com.alibaba.alicloud.sms.ISmsService; import com.aliyun.mns.model.Message; @@ -21,6 +16,11 @@ import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.http.MethodType; import com.google.gson.Gson; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + @RestController public class SmsController { diff --git a/spring-cloud-alibaba-examples/sms-example/src/main/java/com/alibaba/cloud/example/SmsReportMessageListener.java b/spring-cloud-alibaba-examples/sms-example/src/main/java/com/alibaba/cloud/example/SmsReportMessageListener.java index 35f9602c..f5c6abfd 100644 --- a/spring-cloud-alibaba-examples/sms-example/src/main/java/com/alibaba/cloud/example/SmsReportMessageListener.java +++ b/spring-cloud-alibaba-examples/sms-example/src/main/java/com/alibaba/cloud/example/SmsReportMessageListener.java @@ -3,10 +3,10 @@ package com.alibaba.cloud.example; import java.util.LinkedList; import java.util.List; -import org.springframework.stereotype.Component; - import com.aliyun.mns.model.Message; +import org.springframework.stereotype.Component; + /*** * * @author 如果需要监听短信是否被对方成功接收,只需实现这个接口并初始化一个 Spring Bean 即可。 diff --git a/spring-cloud-alibaba-examples/sms-example/src/main/java/com/alibaba/cloud/example/SmsUpMessageListener.java b/spring-cloud-alibaba-examples/sms-example/src/main/java/com/alibaba/cloud/example/SmsUpMessageListener.java index 322d3efc..ed599bb6 100644 --- a/spring-cloud-alibaba-examples/sms-example/src/main/java/com/alibaba/cloud/example/SmsUpMessageListener.java +++ b/spring-cloud-alibaba-examples/sms-example/src/main/java/com/alibaba/cloud/example/SmsUpMessageListener.java @@ -1,9 +1,9 @@ package com.alibaba.cloud.example; -import org.springframework.stereotype.Component; - import com.aliyun.mns.model.Message; +import org.springframework.stereotype.Component; + /*** * * @author 如果发送的短信需要接收对方回复的状态消息,只需实现该接口并初始化一个 Spring Bean 即可。 diff --git a/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/src/main/java/com/alibaba/cloud/examples/rocketmq/RocketMQBusApplication.java b/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/src/main/java/com/alibaba/cloud/examples/rocketmq/RocketMQBusApplication.java index 701886dd..e88a32dd 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/src/main/java/com/alibaba/cloud/examples/rocketmq/RocketMQBusApplication.java +++ b/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/src/main/java/com/alibaba/cloud/examples/rocketmq/RocketMQBusApplication.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 + * Copyright (C) 2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,8 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.alibaba.cloud.examples.rocketmq; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -28,9 +31,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - /** * RocketMQ Bus Spring Application * diff --git a/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/src/main/java/com/alibaba/cloud/examples/rocketmq/User.java b/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/src/main/java/com/alibaba/cloud/examples/rocketmq/User.java index 2c9dae87..fe06facf 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/src/main/java/com/alibaba/cloud/examples/rocketmq/User.java +++ b/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/src/main/java/com/alibaba/cloud/examples/rocketmq/User.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 + * Copyright (C) 2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.alibaba.cloud.examples.rocketmq; /** diff --git a/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/src/main/java/com/alibaba/cloud/examples/rocketmq/UserRemoteApplicationEvent.java b/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/src/main/java/com/alibaba/cloud/examples/rocketmq/UserRemoteApplicationEvent.java index 9979e190..b71018eb 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/src/main/java/com/alibaba/cloud/examples/rocketmq/UserRemoteApplicationEvent.java +++ b/spring-cloud-alibaba-examples/spring-cloud-bus-rocketmq-example/src/main/java/com/alibaba/cloud/examples/rocketmq/UserRemoteApplicationEvent.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 + * Copyright (C) 2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.alibaba.cloud.examples.rocketmq; import org.springframework.cloud.bus.event.RemoteApplicationEvent; diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigAutoConfiguration.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigAutoConfiguration.java index cab15a4e..72271dd0 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigAutoConfiguration.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigAutoConfiguration.java @@ -16,16 +16,16 @@ package com.alibaba.cloud.nacos; +import com.alibaba.cloud.nacos.refresh.NacosContextRefresher; +import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; +import com.alibaba.cloud.nacos.refresh.NacosRefreshProperties; + import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.cloud.nacos.refresh.NacosContextRefresher; -import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; -import com.alibaba.cloud.nacos.refresh.NacosRefreshProperties; - /** * @author juven.xuxb */ @@ -41,8 +41,12 @@ public class NacosConfigAutoConfiguration { return BeanFactoryUtils.beanOfTypeIncludingAncestors(context.getParent(), NacosConfigProperties.class); } - NacosConfigProperties nacosConfigProperties = new NacosConfigProperties(); - return nacosConfigProperties; + return new NacosConfigProperties(); + } + + @Bean + public NacosConfigManager nacosConfigManager() { + return new NacosConfigManager(); } @Bean @@ -57,10 +61,10 @@ public class NacosConfigAutoConfiguration { @Bean public NacosContextRefresher nacosContextRefresher( - NacosConfigProperties nacosConfigProperties, + NacosConfigManager nacosConfigManager, NacosRefreshProperties nacosRefreshProperties, NacosRefreshHistory refreshHistory) { return new NacosContextRefresher(nacosRefreshProperties, refreshHistory, - nacosConfigProperties.configServiceInstance()); + nacosConfigManager.getConfigService()); } } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigBootstrapConfiguration.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigBootstrapConfiguration.java index 081464cd..980126a5 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigBootstrapConfiguration.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigBootstrapConfiguration.java @@ -16,13 +16,13 @@ package com.alibaba.cloud.nacos; +import com.alibaba.cloud.nacos.client.NacosPropertySourceLocator; + import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.cloud.nacos.client.NacosPropertySourceLocator; - /** * @author xiaojing */ @@ -36,10 +36,17 @@ public class NacosConfigBootstrapConfiguration { return new NacosConfigProperties(); } + @Bean + @ConditionalOnMissingBean + public NacosConfigManager nacosConfigManager() { + return new NacosConfigManager(); + } + @Bean public NacosPropertySourceLocator nacosPropertySourceLocator( + NacosConfigManager nacosConfigManager, NacosConfigProperties nacosConfigProperties) { - return new NacosPropertySourceLocator(nacosConfigProperties); + return new NacosPropertySourceLocator(nacosConfigManager, nacosConfigProperties); } } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigManager.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigManager.java new file mode 100644 index 00000000..99f0d173 --- /dev/null +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigManager.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos; + +import com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureException; +import com.alibaba.nacos.api.NacosFactory; +import com.alibaba.nacos.api.config.ConfigService; +import com.alibaba.nacos.api.exception.NacosException; + +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author liaochuntao + */ +public class NacosConfigManager { + + private static ConfigService service = null; + + @Autowired + private NacosConfigProperties properties; + + public ConfigService getConfigService() { + if (service == null) { + try { + service = NacosFactory + .createConfigService(properties.getConfigServiceProperties()); + properties.initConfigService(service); + } + catch (NacosException e) { + throw new NacosConnectionFailureException(properties.getServerAddr(), + e.getMessage(), e); + } + } + return service; + } + +} diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigProperties.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigProperties.java index 82ab1fac..411fb146 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigProperties.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigProperties.java @@ -16,44 +16,76 @@ package com.alibaba.cloud.nacos; -import static com.alibaba.nacos.api.PropertyKeyConst.ACCESS_KEY; -import static com.alibaba.nacos.api.PropertyKeyConst.CLUSTER_NAME; -import static com.alibaba.nacos.api.PropertyKeyConst.CONTEXT_PATH; -import static com.alibaba.nacos.api.PropertyKeyConst.ENCODE; -import static com.alibaba.nacos.api.PropertyKeyConst.ENDPOINT; -import static com.alibaba.nacos.api.PropertyKeyConst.ENDPOINT_PORT; -import static com.alibaba.nacos.api.PropertyKeyConst.NAMESPACE; -import static com.alibaba.nacos.api.PropertyKeyConst.SECRET_KEY; -import static com.alibaba.nacos.api.PropertyKeyConst.SERVER_ADDR; - import java.util.List; import java.util.Objects; import java.util.Properties; +import javax.annotation.PostConstruct; + +import com.alibaba.nacos.api.config.ConfigService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.boot.context.properties.ConfigurationProperties; -import com.alibaba.nacos.api.NacosFactory; -import com.alibaba.nacos.api.config.ConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.core.env.Environment; +import org.springframework.util.StringUtils; + +import static com.alibaba.nacos.api.PropertyKeyConst.ACCESS_KEY; +import static com.alibaba.nacos.api.PropertyKeyConst.CLUSTER_NAME; +import static com.alibaba.nacos.api.PropertyKeyConst.CONFIG_LONG_POLL_TIMEOUT; +import static com.alibaba.nacos.api.PropertyKeyConst.CONFIG_RETRY_TIME; +import static com.alibaba.nacos.api.PropertyKeyConst.CONTEXT_PATH; +import static com.alibaba.nacos.api.PropertyKeyConst.ENABLE_REMOTE_SYNC_CONFIG; +import static com.alibaba.nacos.api.PropertyKeyConst.ENCODE; +import static com.alibaba.nacos.api.PropertyKeyConst.ENDPOINT; +import static com.alibaba.nacos.api.PropertyKeyConst.ENDPOINT_PORT; +import static com.alibaba.nacos.api.PropertyKeyConst.MAX_RETRY; +import static com.alibaba.nacos.api.PropertyKeyConst.NAMESPACE; +import static com.alibaba.nacos.api.PropertyKeyConst.SECRET_KEY; +import static com.alibaba.nacos.api.PropertyKeyConst.SERVER_ADDR; /** - * nacos properties + * Nacos properties. * * @author leijuan * @author xiaojing * @author pbting + * @author lyuzb */ @ConfigurationProperties(NacosConfigProperties.PREFIX) public class NacosConfigProperties { + /** + * Prefix of {@link NacosConfigProperties}. + */ public static final String PREFIX = "spring.cloud.nacos.config"; private static final Logger log = LoggerFactory .getLogger(NacosConfigProperties.class); + @Autowired + private Environment environment; + + @PostConstruct + public void init() { + this.overrideFromEnv(); + } + + private void overrideFromEnv() { + if (StringUtils.isEmpty(this.getServerAddr())) { + String serverAddr = environment + .resolvePlaceholders("${spring.cloud.nacos.config.server-addr:}"); + if (StringUtils.isEmpty(serverAddr)) { + serverAddr = environment + .resolvePlaceholders("${spring.cloud.nacos.server-addr:}"); + } + this.setServerAddr(serverAddr); + } + } + /** - * nacos config server address + * nacos config server address. */ private String serverAddr; @@ -68,9 +100,10 @@ public class NacosConfigProperties { private String group = "DEFAULT_GROUP"; /** - * nacos config dataId prefix + * nacos config dataId prefix. */ private String prefix; + /** * the suffix of nacos config dataId, also the file extension of config content. */ @@ -81,6 +114,30 @@ public class NacosConfigProperties { */ private int timeout = 3000; + /** + * nacos maximum number of tolerable server reconnection errors. + */ + private String maxRetry; + + /** + * nacos get config long poll timeout. + */ + private String configLongPollTimeout; + + /** + * nacos get config failure retry time. + */ + private String configRetryTime; + + /** + * If you want to pull it yourself when the program starts to get the configuration + * for the first time, and the registered Listener is used for future configuration + * updates, you can keep the original code unchanged, just add the system parameter: + * enableRemoteSyncConfig = "true" ( But there is network overhead); therefore we + * recommend that you use {@link ConfigService#getConfigAndSignListener} directly. + */ + private boolean enableRemoteSyncConfig = false; + /** * endpoint for Nacos, the domain name of a service, through which the server address * can be dynamically obtained. @@ -108,10 +165,13 @@ public class NacosConfigProperties { private String contextPath; /** - * nacos config cluster name + * nacos config cluster name. */ private String clusterName; + /** + * nacos config dataId name. + */ private String name; /** @@ -174,6 +234,38 @@ public class NacosConfigProperties { this.timeout = timeout; } + public String getMaxRetry() { + return maxRetry; + } + + public void setMaxRetry(String maxRetry) { + this.maxRetry = maxRetry; + } + + public String getConfigLongPollTimeout() { + return configLongPollTimeout; + } + + public void setConfigLongPollTimeout(String configLongPollTimeout) { + this.configLongPollTimeout = configLongPollTimeout; + } + + public String getConfigRetryTime() { + return configRetryTime; + } + + public void setConfigRetryTime(String configRetryTime) { + this.configRetryTime = configRetryTime; + } + + public Boolean getEnableRemoteSyncConfig() { + return enableRemoteSyncConfig; + } + + public void setEnableRemoteSyncConfig(Boolean enableRemoteSyncConfig) { + this.enableRemoteSyncConfig = enableRemoteSyncConfig; + } + public String getEndpoint() { return endpoint; } @@ -262,15 +354,71 @@ public class NacosConfigProperties { this.name = name; } + /** + * @see NacosConfigManager#getConfigService() . + * @return ConfigService + */ + @Deprecated + public ConfigService configServiceInstance() { + return configService; + } + + public void initConfigService(ConfigService configService) { + this.configService = configService; + } + + public Properties getConfigServiceProperties() { + Properties properties = new Properties(); + properties.put(SERVER_ADDR, Objects.toString(this.serverAddr, "")); + properties.put(ENCODE, Objects.toString(this.encode, "")); + properties.put(NAMESPACE, Objects.toString(this.namespace, "")); + properties.put(ACCESS_KEY, Objects.toString(this.accessKey, "")); + properties.put(SECRET_KEY, Objects.toString(this.secretKey, "")); + properties.put(CONTEXT_PATH, Objects.toString(this.contextPath, "")); + properties.put(CLUSTER_NAME, Objects.toString(this.clusterName, "")); + properties.put(MAX_RETRY, Objects.toString(this.maxRetry, "")); + properties.put(CONFIG_LONG_POLL_TIMEOUT, + Objects.toString(this.configLongPollTimeout, "")); + properties.put(CONFIG_RETRY_TIME, Objects.toString(this.configRetryTime, "")); + properties.put(ENABLE_REMOTE_SYNC_CONFIG, + Objects.toString(this.enableRemoteSyncConfig, "")); + String endpoint = Objects.toString(this.endpoint, ""); + if (endpoint.contains(":")) { + int index = endpoint.indexOf(":"); + properties.put(ENDPOINT, endpoint.substring(0, index)); + properties.put(ENDPOINT_PORT, endpoint.substring(index + 1)); + } + else { + properties.put(ENDPOINT, endpoint); + } + return properties; + } + + @Override + public String toString() { + return "NacosConfigProperties{" + "serverAddr='" + serverAddr + '\'' + + ", encode='" + encode + '\'' + ", group='" + group + '\'' + ", prefix='" + + prefix + '\'' + ", fileExtension='" + fileExtension + '\'' + + ", timeout=" + timeout + ", endpoint='" + endpoint + '\'' + + ", namespace='" + namespace + '\'' + ", accessKey='" + accessKey + '\'' + + ", secretKey='" + secretKey + '\'' + ", contextPath='" + contextPath + + '\'' + ", clusterName='" + clusterName + '\'' + ", name='" + name + '\'' + + ", sharedDataids='" + sharedDataids + '\'' + ", refreshableDataids='" + + refreshableDataids + '\'' + ", extConfig=" + extConfig + '}'; + } + public static class Config { + /** - * the data id of extended configuration + * the data id of extended configuration. */ private String dataId; + /** - * the group of extended configuration, the default value is DEFAULT_GROUP + * the group of extended configuration, the default value is DEFAULT_GROUP. */ private String group = "DEFAULT_GROUP"; + /** * whether to support dynamic refresh, the default does not support . */ @@ -299,53 +447,7 @@ public class NacosConfigProperties { public void setRefresh(boolean refresh) { this.refresh = refresh; } + } - @Override - public String toString() { - return "NacosConfigProperties{" + "serverAddr='" + serverAddr + '\'' - + ", encode='" + encode + '\'' + ", group='" + group + '\'' + ", prefix='" - + prefix + '\'' + ", fileExtension='" + fileExtension + '\'' - + ", timeout=" + timeout + ", endpoint='" + endpoint + '\'' - + ", namespace='" + namespace + '\'' + ", accessKey='" + accessKey + '\'' - + ", secretKey='" + secretKey + '\'' + ", contextPath='" + contextPath - + '\'' + ", clusterName='" + clusterName + '\'' + ", name='" + name + '\'' - + ", sharedDataids='" + sharedDataids + '\'' + ", refreshableDataids='" - + refreshableDataids + '\'' + ", extConfig=" + extConfig + '}'; - } - - public ConfigService configServiceInstance() { - - if (null != configService) { - return configService; - } - - Properties properties = new Properties(); - properties.put(SERVER_ADDR, Objects.toString(this.serverAddr, "")); - properties.put(ENCODE, Objects.toString(this.encode, "")); - properties.put(NAMESPACE, Objects.toString(this.namespace, "")); - properties.put(ACCESS_KEY, Objects.toString(this.accessKey, "")); - properties.put(SECRET_KEY, Objects.toString(this.secretKey, "")); - properties.put(CONTEXT_PATH, Objects.toString(this.contextPath, "")); - properties.put(CLUSTER_NAME, Objects.toString(this.clusterName, "")); - - String endpoint = Objects.toString(this.endpoint, ""); - if (endpoint.contains(":")) { - int index = endpoint.indexOf(":"); - properties.put(ENDPOINT, endpoint.substring(0, index)); - properties.put(ENDPOINT_PORT, endpoint.substring(index + 1)); - } - else { - properties.put(ENDPOINT, endpoint); - } - - try { - configService = NacosFactory.createConfigService(properties); - return configService; - } - catch (Exception e) { - log.error("create config service error!properties={},e=,", this, e); - return null; - } - } } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosPropertySourceRepository.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosPropertySourceRepository.java index e883891a..f7937336 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosPropertySourceRepository.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosPropertySourceRepository.java @@ -16,11 +16,11 @@ package com.alibaba.cloud.nacos; -import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import com.alibaba.cloud.nacos.client.NacosPropertySource; +import com.google.common.collect.Lists; /** * @author xiaojing @@ -28,25 +28,23 @@ import com.alibaba.cloud.nacos.client.NacosPropertySource; */ public class NacosPropertySourceRepository { - private final static ConcurrentHashMap nacosPropertySourceRepository = new ConcurrentHashMap<>(); + private final static ConcurrentHashMap NACOS_PROPERTY_SOURCE_REPOSITORY = new ConcurrentHashMap<>(); /** * @return all nacos properties from application context */ public static List getAll() { - List result = new ArrayList<>(); - result.addAll(nacosPropertySourceRepository.values()); - return result; + return Lists.newArrayList(NACOS_PROPERTY_SOURCE_REPOSITORY.values()); } public static void collectNacosPropertySources( NacosPropertySource nacosPropertySource) { - nacosPropertySourceRepository.putIfAbsent(nacosPropertySource.getDataId(), + NACOS_PROPERTY_SOURCE_REPOSITORY.putIfAbsent(nacosPropertySource.getDataId(), nacosPropertySource); } public static NacosPropertySource getNacosPropertySource(String dataId) { - return nacosPropertySourceRepository.get(dataId); + return NACOS_PROPERTY_SOURCE_REPOSITORY.get(dataId); } } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceBuilder.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceBuilder.java index e10c9a30..9dbfe8bf 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceBuilder.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceBuilder.java @@ -16,23 +16,22 @@ package com.alibaba.cloud.nacos.client; -import java.io.StringReader; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Properties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.util.StringUtils; - import com.alibaba.cloud.nacos.NacosPropertySourceRepository; +import com.alibaba.cloud.nacos.parser.NacosDataParserHandler; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.exception.NacosException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.util.StringUtils; + /** * @author xiaojing * @author pbting @@ -83,24 +82,19 @@ public class NacosPropertySourceBuilder { String data = null; try { data = configService.getConfig(dataId, group, timeout); - if (!StringUtils.isEmpty(data)) { - log.info(String.format("Loading nacos data, dataId: '%s', group: '%s'", - dataId, group)); - - if (fileExtension.equalsIgnoreCase("properties")) { - Properties properties = new Properties(); - - properties.load(new StringReader(data)); - return properties; - } - else if (fileExtension.equalsIgnoreCase("yaml") - || fileExtension.equalsIgnoreCase("yml")) { - YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean(); - yamlFactory.setResources(new ByteArrayResource(data.getBytes())); - return yamlFactory.getObject(); - } - + if (StringUtils.isEmpty(data)) { + log.warn( + "Ignore the empty nacos configuration and get it based on dataId[{}] & group[{}]", + dataId, group); + return EMPTY_PROPERTIES; } + log.info(String.format( + "Loading nacos data, dataId: '%s', group: '%s', data: %s", dataId, + group, data)); + + Properties properties = NacosDataParserHandler.getInstance() + .parseNacosData(data, fileExtension); + return properties == null ? EMPTY_PROPERTIES : properties; } catch (NacosException e) { log.error("get data from Nacos error,dataId:{}, ", dataId, e); @@ -117,9 +111,9 @@ public class NacosPropertySourceBuilder { Enumeration keys = (Enumeration) properties.propertyNames(); while (keys.hasMoreElements()) { String key = keys.nextElement(); - Object value = properties.getProperty(key); + String value = properties.getProperty(key); if (value != null) { - result.put(key, ((String) value).trim()); + result.put(key, value.trim()); } else { result.put(key, null); diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceLocator.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceLocator.java index 51541602..ee6e3952 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceLocator.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceLocator.java @@ -16,23 +16,26 @@ package com.alibaba.cloud.nacos.client; -import java.util.Arrays; 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; import org.slf4j.LoggerFactory; + import org.springframework.cloud.bootstrap.config.PropertySourceLocator; import org.springframework.core.annotation.Order; import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.Environment; import org.springframework.core.env.PropertySource; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -import com.alibaba.cloud.nacos.NacosConfigProperties; -import com.alibaba.cloud.nacos.NacosPropertySourceRepository; -import com.alibaba.cloud.nacos.refresh.NacosContextRefresher; -import com.alibaba.nacos.api.config.ConfigService; - /** * @author xiaojing * @author pbting @@ -42,25 +45,31 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { private static final Logger log = LoggerFactory .getLogger(NacosPropertySourceLocator.class); + private static final String NACOS_PROPERTY_SOURCE_NAME = "NACOS"; + private static final String SEP1 = "-"; + private static final String DOT = "."; + private static final String SHARED_CONFIG_SEPARATOR_CHAR = "[,]"; - private static final List SUPPORT_FILE_EXTENSION = Arrays.asList("properties", - "yaml", "yml"); private NacosPropertySourceBuilder nacosPropertySourceBuilder; private NacosConfigProperties nacosConfigProperties; - public NacosPropertySourceLocator(NacosConfigProperties nacosConfigProperties) { + private NacosConfigManager nacosConfigManager; + + public NacosPropertySourceLocator(NacosConfigManager nacosConfigManager, + NacosConfigProperties nacosConfigProperties) { + this.nacosConfigManager = nacosConfigManager; this.nacosConfigProperties = nacosConfigProperties; } @Override public PropertySource locate(Environment env) { - ConfigService configService = nacosConfigProperties.configServiceInstance(); + ConfigService configService = nacosConfigManager.getConfigService(); if (null == configService) { log.warn("no instance of config service found, can't load config from nacos"); @@ -99,14 +108,14 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { return; } - String[] sharedDataIdArry = sharedDataIds.split(SHARED_CONFIG_SEPARATOR_CHAR); - checkDataIdFileExtension(sharedDataIdArry); + String[] sharedDataIdArray = sharedDataIds.split(SHARED_CONFIG_SEPARATOR_CHAR); + checkDataIdFileExtension(sharedDataIdArray); - for (int i = 0; i < sharedDataIdArry.length; i++) { - String dataId = sharedDataIdArry[i]; + for (int i = 0; i < sharedDataIdArray.length; i++) { + String dataId = sharedDataIdArray[i]; String fileExtension = dataId.substring(dataId.lastIndexOf(".") + 1); - boolean isRefreshable = checkDataIdIsRefreshbable(refreshDataIds, - sharedDataIdArry[i]); + boolean isRefreshable = checkDataIdIsRefreshable(refreshDataIds, + sharedDataIdArray[i]); loadNacosDataIfPresent(compositePropertySource, dataId, "DEFAULT_GROUP", fileExtension, isRefreshable); @@ -114,18 +123,18 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { } private void loadExtConfiguration(CompositePropertySource compositePropertySource) { - if (nacosConfigProperties.getExtConfig() == null - || nacosConfigProperties.getExtConfig().isEmpty()) { + List extConfigs = nacosConfigProperties + .getExtConfig(); + + if (CollectionUtils.isEmpty(extConfigs)) { return; } - List extConfigs = nacosConfigProperties - .getExtConfig(); checkExtConfiguration(extConfigs); for (NacosConfigProperties.Config config : extConfigs) { String dataId = config.getDataId(); - String fileExtension = dataId.substring(dataId.lastIndexOf(".") + 1); + String fileExtension = dataId.substring(dataId.lastIndexOf(DOT) + 1); loadNacosDataIfPresent(compositePropertySource, dataId, config.getGroup(), fileExtension, config.isRefresh()); } @@ -137,7 +146,7 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { String dataId = extConfigs.get(i).getDataId(); if (dataId == null || dataId.trim().length() == 0) { throw new IllegalStateException(String.format( - "the [ spring.cloud.nacos.config.ext-config[%s] ] must give a dataid", + "the [ spring.cloud.nacos.config.ext-config[%s] ] must give a dataId", i)); } dataIds[i] = dataId; @@ -152,8 +161,13 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { String fileExtension = properties.getFileExtension(); String nacosGroup = properties.getGroup(); + // load directly once by default + loadNacosDataIfPresent(compositePropertySource, dataIdPrefix, nacosGroup, + fileExtension, true); + // load with suffix, which have a higher priority than the default loadNacosDataIfPresent(compositePropertySource, dataIdPrefix + DOT + fileExtension, nacosGroup, fileExtension, true); + // Loaded with profile, which have a higher priority than the suffix for (String profile : environment.getActiveProfiles()) { String dataId = dataIdPrefix + SEP1 + profile + DOT + fileExtension; loadNacosDataIfPresent(compositePropertySource, dataId, nacosGroup, @@ -164,56 +178,58 @@ public class NacosPropertySourceLocator implements PropertySourceLocator { private void loadNacosDataIfPresent(final CompositePropertySource composite, final String dataId, final String group, String fileExtension, boolean isRefreshable) { - if (NacosContextRefresher.getRefreshCount() != 0) { - NacosPropertySource ps; - if (!isRefreshable) { - ps = NacosPropertySourceRepository.getNacosPropertySource(dataId); - } - else { - ps = nacosPropertySourceBuilder.build(dataId, group, fileExtension, true); - } + if (null == dataId || dataId.trim().length() < 1) { + return; + } + if (null == group || group.trim().length() < 1) { + return; + } + NacosPropertySource propertySource = this.loadNacosPropertySource(dataId, group, + fileExtension, isRefreshable); + this.addFirstPropertySource(composite, propertySource, false); + } - composite.addFirstPropertySource(ps); + private NacosPropertySource loadNacosPropertySource(final String dataId, + final String group, String fileExtension, boolean isRefreshable) { + if (NacosContextRefresher.getRefreshCount() != 0) { + if (!isRefreshable) { + return NacosPropertySourceRepository.getNacosPropertySource(dataId); + } } - else { - NacosPropertySource ps = nacosPropertySourceBuilder.build(dataId, group, - fileExtension, isRefreshable); - composite.addFirstPropertySource(ps); + return nacosPropertySourceBuilder.build(dataId, group, fileExtension, + isRefreshable); + } + + /** + * Add the nacos configuration to the first place and maybe ignore the empty + * configuration. + */ + private void addFirstPropertySource(final CompositePropertySource composite, + NacosPropertySource nacosPropertySource, boolean ignoreEmpty) { + if (null == nacosPropertySource || null == composite) { + return; } + if (ignoreEmpty && nacosPropertySource.getSource().isEmpty()) { + return; + } + composite.addFirstPropertySource(nacosPropertySource); } private static void checkDataIdFileExtension(String[] dataIdArray) { - StringBuilder stringBuilder = new StringBuilder(); - for (int i = 0; i < dataIdArray.length; i++) { - boolean isLegal = false; - for (String fileExtension : SUPPORT_FILE_EXTENSION) { - if (dataIdArray[i].indexOf(fileExtension) > 0) { - isLegal = true; - break; - } - } - // add tips - if (!isLegal) { - stringBuilder.append(dataIdArray[i] + ","); - } - } - - if (stringBuilder.length() > 0) { - String result = stringBuilder.substring(0, stringBuilder.length() - 1); - throw new IllegalStateException(String.format( - "[%s] must contains file extension with properties|yaml|yml", - result)); + if (dataIdArray == null || dataIdArray.length < 1) { + throw new IllegalStateException("The dataId cannot be empty"); } + // Just decide that the current dataId must have a suffix + NacosDataParserHandler.getInstance().checkDataId(dataIdArray); } - private boolean checkDataIdIsRefreshbable(String refreshDataIds, - String sharedDataId) { - if (refreshDataIds == null || "".equals(refreshDataIds)) { + private boolean checkDataIdIsRefreshable(String refreshDataIds, String sharedDataId) { + if (StringUtils.isEmpty(refreshDataIds)) { return false; } - String[] refreshDataIdArry = refreshDataIds.split(SHARED_CONFIG_SEPARATOR_CHAR); - for (String refreshDataId : refreshDataIdArry) { + String[] refreshDataIdArray = refreshDataIds.split(SHARED_CONFIG_SEPARATOR_CHAR); + for (String refreshDataId : refreshDataIdArray) { if (refreshDataId.equals(sharedDataId)) { return true; } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/diagnostics/analyzer/NacosConnectionFailureAnalyzer.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/diagnostics/analyzer/NacosConnectionFailureAnalyzer.java index 10b1e20a..3c7ae0e2 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/diagnostics/analyzer/NacosConnectionFailureAnalyzer.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/diagnostics/analyzer/NacosConnectionFailureAnalyzer.java @@ -31,7 +31,10 @@ public class NacosConnectionFailureAnalyzer @Override protected FailureAnalysis analyze(Throwable rootFailure, NacosConnectionFailureException cause) { - return new FailureAnalysis("Application failed to connect to Nacos server", - "check your nacos server config", cause); + return new FailureAnalysis( + "Application failed to connect to Nacos server: \"" + + cause.getServerAddr() + "\"", + "Please check your Nacos server config", cause); } + } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/diagnostics/analyzer/NacosConnectionFailureException.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/diagnostics/analyzer/NacosConnectionFailureException.java index f01458d4..2e9efd94 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/diagnostics/analyzer/NacosConnectionFailureException.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/diagnostics/analyzer/NacosConnectionFailureException.java @@ -24,29 +24,21 @@ package com.alibaba.cloud.nacos.diagnostics.analyzer; */ public class NacosConnectionFailureException extends RuntimeException { - private final String domain; + private final String serverAddr; - private final String port; - - public NacosConnectionFailureException(String domain, String port, String message) { + public NacosConnectionFailureException(String serverAddr, String message) { super(message); - this.domain = domain; - this.port = port; + this.serverAddr = serverAddr; } - public NacosConnectionFailureException(String domain, String port, String message, + public NacosConnectionFailureException(String serverAddr, String message, Throwable cause) { super(message, cause); - this.domain = domain; - this.port = port; + this.serverAddr = serverAddr; } - String getDomain() { - return domain; - } - - String getPort() { - return port; + public String getServerAddr() { + return serverAddr; } } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java index 62dbb4e4..742f7fb0 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java @@ -23,13 +23,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.springframework.boot.actuate.endpoint.AbstractEndpoint; - import com.alibaba.cloud.nacos.NacosConfigProperties; import com.alibaba.cloud.nacos.NacosPropertySourceRepository; import com.alibaba.cloud.nacos.client.NacosPropertySource; import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; +import org.springframework.boot.actuate.endpoint.AbstractEndpoint; + /** * Endpoint for Nacos, contains config data and refresh history * @author xiaojing diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpointAutoConfiguration.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpointAutoConfiguration.java index ab419a60..24723f65 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpointAutoConfiguration.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpointAutoConfiguration.java @@ -16,6 +16,10 @@ package com.alibaba.cloud.nacos.endpoint; +import com.alibaba.cloud.nacos.NacosConfigManager; +import com.alibaba.cloud.nacos.NacosConfigProperties; +import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -23,9 +27,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.context.annotation.Bean; -import com.alibaba.cloud.nacos.NacosConfigProperties; -import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; - /** * @author xiaojing */ @@ -37,6 +38,9 @@ public class NacosConfigEndpointAutoConfiguration { @Autowired private NacosConfigProperties nacosConfigProperties; + @Autowired + private NacosConfigManager nacosConfigManager; + @Autowired private NacosRefreshHistory nacosRefreshHistory; @@ -48,7 +52,6 @@ public class NacosConfigEndpointAutoConfiguration { @Bean public NacosConfigHealthIndicator nacosConfigHealthIndicator() { - return new NacosConfigHealthIndicator(nacosConfigProperties, - nacosConfigProperties.configServiceInstance()); + return new NacosConfigHealthIndicator(nacosConfigManager.getConfigService()); } } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigHealthIndicator.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigHealthIndicator.java index 4954378c..bdbd56f9 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigHealthIndicator.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigHealthIndicator.java @@ -16,58 +16,27 @@ package com.alibaba.cloud.nacos.endpoint; -import java.util.ArrayList; -import java.util.List; +import com.alibaba.nacos.api.config.ConfigService; import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.Health; -import org.springframework.util.StringUtils; - -import com.alibaba.cloud.nacos.NacosConfigProperties; -import com.alibaba.cloud.nacos.NacosPropertySourceRepository; -import com.alibaba.cloud.nacos.client.NacosPropertySource; -import com.alibaba.nacos.api.config.ConfigService; /** * @author xiaojing */ public class NacosConfigHealthIndicator extends AbstractHealthIndicator { - private final NacosConfigProperties nacosConfigProperties; - - private final List dataIds; - private final ConfigService configService; - public NacosConfigHealthIndicator(NacosConfigProperties nacosConfigProperties, - ConfigService configService) { - this.nacosConfigProperties = nacosConfigProperties; + public NacosConfigHealthIndicator(ConfigService configService) { this.configService = configService; - - this.dataIds = new ArrayList<>(); - for (NacosPropertySource nacosPropertySource : NacosPropertySourceRepository - .getAll()) { - this.dataIds.add(nacosPropertySource.getDataId()); - } } @Override protected void doHealthCheck(Health.Builder builder) throws Exception { - for (String dataId : dataIds) { - try { - String config = configService.getConfig(dataId, - nacosConfigProperties.getGroup(), - nacosConfigProperties.getTimeout()); - if (StringUtils.isEmpty(config)) { - builder.down().withDetail(String.format("dataId: '%s', group: '%s'", - dataId, nacosConfigProperties.getGroup()), "config is empty"); - } - } - catch (Exception e) { - builder.down().withDetail(String.format("dataId: '%s', group: '%s'", - dataId, nacosConfigProperties.getGroup()), e.getMessage()); - } - } - builder.up().withDetail("dataIds", dataIds); + builder.up(); + + String status = configService.getServerStatus(); + builder.status(status); } } diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractNacosDataParser.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractNacosDataParser.java new file mode 100644 index 00000000..626db91f --- /dev/null +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractNacosDataParser.java @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos.parser; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import com.alibaba.nacos.client.utils.StringUtils; + +/** + * @author zkz + */ +public abstract class AbstractNacosDataParser { + + protected static final String DOT = "."; + + protected static final String VALUE = "value"; + + private String extension; + + private AbstractNacosDataParser nextParser; + + protected AbstractNacosDataParser(String extension) { + if (StringUtils.isEmpty(extension)) { + throw new IllegalArgumentException("extension cannot be empty"); + } + this.extension = extension.toLowerCase(); + } + + /** + * Verify dataId extensions. + * @param extension file extension. json or xml or yml or yaml or properties + * @return valid or not + */ + public final boolean checkFileExtension(String extension) { + if (this.isLegal(extension.toLowerCase())) { + return true; + } + if (this.nextParser == null) { + return false; + } + return this.nextParser.checkFileExtension(extension); + + } + + /** + * Parsing nacos configuration content. + * @param data config data from Nacos + * @param extension file extension. json or xml or yml or yaml or properties + * @return result of Properties + * @throws IOException thrown if there is a problem parsing config. + */ + public final Properties parseNacosData(String data, String extension) + throws IOException { + if (extension == null || extension.length() < 1) { + throw new IllegalStateException("The file extension cannot be empty"); + } + if (this.isLegal(extension.toLowerCase())) { + return this.doParse(data); + } + if (this.nextParser == null) { + throw new IllegalStateException(getTips(extension)); + } + return this.nextParser.parseNacosData(data, extension); + } + + /** + * Core logic for parsing. + * @param data config from Nacos + * @return result of Properties + * @throws IOException thrown if there is a problem parsing config. + */ + protected abstract Properties doParse(String data) throws IOException; + + protected AbstractNacosDataParser setNextParser(AbstractNacosDataParser nextParser) { + this.nextParser = nextParser; + return this; + } + + public AbstractNacosDataParser addNextParser(AbstractNacosDataParser nextParser) { + if (this.nextParser == null) { + this.nextParser = nextParser; + } + else { + this.nextParser.addNextParser(nextParser); + } + return this; + } + + protected boolean isLegal(String extension) { + return this.extension.equalsIgnoreCase(extension) + || this.extension.contains(extension); + } + + /** + * Generate key-value pairs from the map. + */ + protected Properties generateProperties(Map map) { + if (null == map || map.isEmpty()) { + return null; + } + Properties properties = new Properties(); + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + if (StringUtils.isBlank(key)) { + continue; + } + key = key.startsWith(DOT) ? key.replaceFirst("\\.", "") : key; + properties.put(key, entry.getValue()); + } + return properties; + } + + /** + * Reload the key ending in `value` if need. + */ + protected Map reloadMap(Map map) { + if (map == null || map.isEmpty()) { + return null; + } + Map result = new HashMap<>(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; + } + + public static String getTips(String fileName) { + return String.format( + "[%s] must contains file extension with properties|yaml|yml|xml|json", + fileName); + } + +} diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java new file mode 100644 index 00000000..a4fbe327 --- /dev/null +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos.parser; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Properties; + +import com.alibaba.nacos.client.utils.StringUtils; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * @author zkz + */ +public class NacosDataJsonParser extends AbstractNacosDataParser { + protected NacosDataJsonParser() { + super("json"); + } + + @Override + protected Properties doParse(String data) throws IOException { + if (StringUtils.isEmpty(data)) { + return null; + } + Map map = parseJSON2Map(data); + return this.generateProperties(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. + */ + public static Map parseJSON2Map(String json) throws IOException { + Map map = new HashMap<>(32); + ObjectMapper mapper = new ObjectMapper(); + JsonNode jsonNode = mapper.readTree(json); + if (null == jsonNode) { + return map; + } + parseJsonNode(map, jsonNode, ""); + return map; + } + + private static void parseJsonNode(Map jsonMap, JsonNode jsonNode, + String parentKey) { + Iterator fieldNames = jsonNode.fieldNames(); + while (fieldNames.hasNext()) { + String name = fieldNames.next(); + String fullKey = StringUtils.isEmpty(parentKey) ? name + : parentKey + DOT + name; + JsonNode resultValue = jsonNode.findValue(name); + if (null == resultValue) { + continue; + } + if (resultValue.isArray()) { + Iterator iterator = resultValue.elements(); + while (iterator != null && iterator.hasNext()) { + JsonNode next = iterator.next(); + if (null == next) { + continue; + } + parseJsonNode(jsonMap, next, fullKey); + } + continue; + } + if (resultValue.isObject()) { + parseJsonNode(jsonMap, resultValue, fullKey); + continue; + } + jsonMap.put(fullKey, resultValue.asText()); + } + } + +} diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataParserHandler.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataParserHandler.java new file mode 100644 index 00000000..e40f7f24 --- /dev/null +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataParserHandler.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos.parser; + +import java.io.IOException; +import java.util.Properties; + +/** + * @author zkz + */ +public final class NacosDataParserHandler { + + private AbstractNacosDataParser parser; + + private NacosDataParserHandler() { + parser = this.createParser(); + } + + /** + * 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 properties + * @throws IOException thrown if there is a problem parsing config. + */ + public Properties parseNacosData(String data, String extension) throws IOException { + if (null == parser) { + parser = this.createParser(); + } + return parser.parseNacosData(data, extension); + } + + /** + * check the validity of file extensions in dataid. + * @param dataIdAry array of dataId + * @return dataId handle success or not + */ + 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 AbstractNacosDataParser createParser() { + return new NacosDataPropertiesParser().addNextParser(new NacosDataYamlParser()) + .addNextParser(new NacosDataXmlParser()) + .addNextParser(new NacosDataJsonParser()); + } + + public static NacosDataParserHandler getInstance() { + return ParserHandler.HANDLER; + } + + private static class ParserHandler { + + private static final NacosDataParserHandler HANDLER = new NacosDataParserHandler(); + + } + +} diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataPropertiesParser.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataPropertiesParser.java new file mode 100644 index 00000000..f0599bd2 --- /dev/null +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataPropertiesParser.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos.parser; + +import java.io.IOException; +import java.io.StringReader; +import java.util.Properties; + +/** + * @author zkz + */ +public class NacosDataPropertiesParser extends AbstractNacosDataParser { + + public NacosDataPropertiesParser() { + super("properties"); + } + + @Override + protected Properties doParse(String data) throws IOException { + Properties properties = new Properties(); + properties.load(new StringReader(data)); + return properties; + } +} diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java new file mode 100644 index 00000000..58773cac --- /dev/null +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos.parser; + +import java.io.IOException; +import java.io.StringReader; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import com.alibaba.nacos.client.utils.StringUtils; + +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +/** + * With relatively few usage scenarios, only simple parsing is performed to reduce jar + * dependencies. + * + * @author zkz + */ +public class NacosDataXmlParser extends AbstractNacosDataParser { + + public NacosDataXmlParser() { + super("xml"); + } + + @Override + protected Properties doParse(String data) throws IOException { + if (StringUtils.isEmpty(data)) { + return null; + } + Map map = parseXml2Map(data); + return this.generateProperties(this.reloadMap(map)); + } + + private Map parseXml2Map(String xml) throws IOException { + xml = xml.replaceAll("\\r", "").replaceAll("\\n", "").replaceAll("\\t", ""); + Map map = new HashMap<>(32); + try { + DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance() + .newDocumentBuilder(); + Document document = documentBuilder + .parse(new InputSource(new StringReader(xml))); + if (null == document) { + return null; + } + parseNodeList(document.getChildNodes(), map, ""); + } + catch (Exception e) { + throw new IOException("The xml content parse error.", e.getCause()); + } + return map; + } + + private void parseNodeList(NodeList nodeList, Map map, + String parentKey) { + if (nodeList == null || nodeList.getLength() < 1) { + return; + } + parentKey = parentKey == null ? "" : parentKey; + for (int i = 0; i < nodeList.getLength(); i++) { + Node node = nodeList.item(i); + String value = node.getNodeValue(); + value = value == null ? "" : value.trim(); + String name = node.getNodeName(); + name = name == null ? "" : name.trim(); + + if (StringUtils.isEmpty(name)) { + continue; + } + + String key = StringUtils.isEmpty(parentKey) ? name : parentKey + DOT + name; + NamedNodeMap nodeMap = node.getAttributes(); + parseNodeAttr(nodeMap, map, key); + if (node.getNodeType() == Node.ELEMENT_NODE && node.hasChildNodes()) { + parseNodeList(node.getChildNodes(), map, key); + continue; + } + if (value.length() < 1) { + continue; + } + map.put(parentKey, value); + } + } + + private void parseNodeAttr(NamedNodeMap nodeMap, Map map, + String parentKey) { + if (null == nodeMap || nodeMap.getLength() < 1) { + return; + } + for (int i = 0; i < nodeMap.getLength(); i++) { + Node node = nodeMap.item(i); + if (null == node) { + continue; + } + if (node.getNodeType() == Node.ATTRIBUTE_NODE) { + if (StringUtils.isEmpty(node.getNodeName())) { + continue; + } + if (StringUtils.isEmpty(node.getNodeValue())) { + continue; + } + map.put(parentKey + DOT + node.getNodeName(), node.getNodeValue()); + } + } + } + +} diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataYamlParser.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataYamlParser.java new file mode 100644 index 00000000..74898027 --- /dev/null +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataYamlParser.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos.parser; + +import java.util.Properties; + +import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; +import org.springframework.core.io.ByteArrayResource; + +/** + * @author zkz + */ +public class NacosDataYamlParser extends AbstractNacosDataParser { + + public NacosDataYamlParser() { + super(",yml,yaml,"); + } + + @Override + protected Properties doParse(String data) { + YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean(); + yamlFactory.setResources(new ByteArrayResource(data.getBytes())); + return yamlFactory.getObject(); + } +} diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/refresh/NacosContextRefresher.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/refresh/NacosContextRefresher.java index ab0234b5..439771cc 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/refresh/NacosContextRefresher.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/refresh/NacosContextRefresher.java @@ -26,8 +26,15 @@ import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; +import com.alibaba.cloud.nacos.NacosPropertySourceRepository; +import com.alibaba.cloud.nacos.client.NacosPropertySource; +import com.alibaba.nacos.api.config.ConfigService; +import com.alibaba.nacos.api.config.listener.Listener; +import com.alibaba.nacos.api.exception.NacosException; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.cloud.endpoint.event.RefreshEvent; import org.springframework.context.ApplicationContext; @@ -35,12 +42,6 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; import org.springframework.util.StringUtils; -import com.alibaba.cloud.nacos.NacosPropertySourceRepository; -import com.alibaba.cloud.nacos.client.NacosPropertySource; -import com.alibaba.nacos.api.config.ConfigService; -import com.alibaba.nacos.api.config.listener.Listener; -import com.alibaba.nacos.api.exception.NacosException; - /** * On application start up, NacosContextRefresher add nacos listeners to all application * level dataIds, when there is a change in the data, listeners will refresh diff --git a/spring-cloud-alibaba-nacos-config/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-alibaba-nacos-config/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 597126e8..c9c87261 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-alibaba-nacos-config/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -1,5 +1,16 @@ { "properties": [ + { + "name": "spring.cloud.nacos.server-addr", + "type": "java.lang.String", + "description": "nacos server address." + }, + { + "name": "spring.cloud.nacos.config.server-addr", + "type": "java.lang.String", + "defaultValue": "${spring.cloud.nacos.server-addr}", + "description": "nacos config server address." + }, { "name": "spring.cloud.nacos.config.encode", "type": "java.lang.String", diff --git a/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationExtConfigTests.java b/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationExtConfigTests.java index 46760321..a7a3def2 100644 --- a/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationExtConfigTests.java +++ b/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationExtConfigTests.java @@ -16,12 +16,13 @@ package com.alibaba.cloud.nacos; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; - import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; +import com.alibaba.cloud.nacos.client.NacosPropertySourceLocator; +import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration; +import com.alibaba.nacos.client.config.NacosConfigService; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -31,6 +32,7 @@ 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; @@ -39,9 +41,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.cloud.nacos.client.NacosPropertySourceLocator; -import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration; -import com.alibaba.nacos.client.config.NacosConfigService; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; /** * @author xiaojing diff --git a/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationTests.java b/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationTests.java index 1f80136c..9f6380b5 100644 --- a/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationTests.java +++ b/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationTests.java @@ -16,14 +16,16 @@ package com.alibaba.cloud.nacos; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; - import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.Map; +import com.alibaba.cloud.nacos.client.NacosPropertySourceLocator; +import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpoint; +import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration; +import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; +import com.alibaba.nacos.client.config.NacosConfigService; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -33,6 +35,7 @@ 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; @@ -41,11 +44,9 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.cloud.nacos.client.NacosPropertySourceLocator; -import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpoint; -import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration; -import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; -import com.alibaba.nacos.client.config.NacosConfigService; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; /** * @author xiaojing diff --git a/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosFileExtensionTest.java b/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosFileExtensionTest.java index e4806e66..ef99aaf6 100644 --- a/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosFileExtensionTest.java +++ b/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosFileExtensionTest.java @@ -16,11 +16,12 @@ package com.alibaba.cloud.nacos; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; - import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; +import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration; +import com.alibaba.nacos.client.config.NacosConfigService; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -30,6 +31,7 @@ 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; @@ -38,8 +40,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration; -import com.alibaba.nacos.client.config.NacosConfigService; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; /** * @author xiaojing diff --git a/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpointTests.java b/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpointTests.java index 78b5c13a..635ff65d 100644 --- a/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpointTests.java +++ b/spring-cloud-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpointTests.java @@ -16,16 +16,17 @@ package com.alibaba.cloud.nacos.endpoint; -import static org.junit.Assert.assertEquals; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; - import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; import java.util.Map; -import org.junit.Assert; +import com.alibaba.cloud.nacos.NacosConfigAutoConfiguration; +import com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration; +import com.alibaba.cloud.nacos.NacosConfigManager; +import com.alibaba.cloud.nacos.NacosConfigProperties; +import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; +import com.alibaba.nacos.client.config.NacosConfigService; + import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; @@ -34,6 +35,7 @@ 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.actuate.health.Health.Builder; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -42,11 +44,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.cloud.nacos.NacosConfigAutoConfiguration; -import com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration; -import com.alibaba.cloud.nacos.NacosConfigProperties; -import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; -import com.alibaba.nacos.client.config.NacosConfigService; +import static org.junit.Assert.assertEquals; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; /** * @author xiaojing @@ -91,6 +90,9 @@ public class NacosConfigEndpointTests { @Autowired private NacosConfigProperties properties; + @Autowired + private NacosConfigManager nacosConfigManager; + @Autowired private NacosRefreshHistory refreshHistory; @@ -98,7 +100,7 @@ public class NacosConfigEndpointTests { public void contextLoads() throws Exception { checkoutEndpoint(); - checkoutAcmHealthIndicator(); + // checkoutAcmHealthIndicator(); } @@ -107,18 +109,16 @@ public class NacosConfigEndpointTests { Builder builder = new Builder(); NacosConfigHealthIndicator healthIndicator = new NacosConfigHealthIndicator( - properties, properties.configServiceInstance()); + nacosConfigManager.getConfigService()); healthIndicator.doHealthCheck(builder); Builder builder1 = new Builder(); - List dataIds = new ArrayList<>(); - dataIds.add("test-name.properties"); - builder1.up().withDetail("dataIds", dataIds); + builder1.up(); - Assert.assertTrue(builder.build().equals(builder1.build())); + assertEquals(builder1.build(), builder.build()); } - catch (Exception ignoreE) { + catch (Exception ignore) { } diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryAutoConfiguration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryAutoConfiguration.java index 5d94159e..f60feb5a 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryAutoConfiguration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryAutoConfiguration.java @@ -16,6 +16,10 @@ package com.alibaba.cloud.nacos; +import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration; +import com.alibaba.cloud.nacos.registry.NacosRegistration; +import com.alibaba.cloud.nacos.registry.NacosServiceRegistry; + import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -28,10 +32,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration; -import com.alibaba.cloud.nacos.registry.NacosRegistration; -import com.alibaba.cloud.nacos.registry.NacosServiceRegistry; - /** * @author xiaojing */ @@ -47,16 +47,23 @@ public class NacosDiscoveryAutoConfiguration { @Bean public NacosServiceRegistry nacosServiceRegistry( + NacosNamingManager nacosNamingManager, NacosDiscoveryProperties nacosDiscoveryProperties) { - return new NacosServiceRegistry(nacosDiscoveryProperties); + return new NacosServiceRegistry(nacosNamingManager, nacosDiscoveryProperties); + } + + @Bean + public NacosNamingManager nacosNamingManager() { + return new NacosNamingManager(); } @Bean @ConditionalOnBean(AutoServiceRegistrationProperties.class) - public NacosRegistration nacosRegistration( + public NacosRegistration nacosRegistration(NacosNamingManager nacosNamingManager, NacosDiscoveryProperties nacosDiscoveryProperties, ApplicationContext context) { - return new NacosRegistration(nacosDiscoveryProperties, context); + return new NacosRegistration(nacosNamingManager, nacosDiscoveryProperties, + context); } @Bean diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java index f6cb2506..39ff737c 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java @@ -16,15 +16,6 @@ package com.alibaba.cloud.nacos; -import static com.alibaba.nacos.api.PropertyKeyConst.ACCESS_KEY; -import static com.alibaba.nacos.api.PropertyKeyConst.CLUSTER_NAME; -import static com.alibaba.nacos.api.PropertyKeyConst.ENDPOINT; -import static com.alibaba.nacos.api.PropertyKeyConst.ENDPOINT_PORT; -import static com.alibaba.nacos.api.PropertyKeyConst.NAMESPACE; -import static com.alibaba.nacos.api.PropertyKeyConst.NAMING_LOAD_CACHE_AT_START; -import static com.alibaba.nacos.api.PropertyKeyConst.SECRET_KEY; -import static com.alibaba.nacos.api.PropertyKeyConst.SERVER_ADDR; - import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; @@ -37,8 +28,16 @@ import java.util.Properties; import javax.annotation.PostConstruct; +import com.alibaba.nacos.api.NacosFactory; +import com.alibaba.nacos.api.naming.NamingMaintainFactory; +import com.alibaba.nacos.api.naming.NamingMaintainService; +import com.alibaba.nacos.api.naming.NamingService; +import com.alibaba.nacos.api.naming.PreservedMetadataKeys; +import com.alibaba.nacos.client.naming.utils.UtilAndComs; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -46,12 +45,14 @@ import org.springframework.cloud.commons.util.InetUtils; import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; -import com.alibaba.nacos.api.NacosFactory; -import com.alibaba.nacos.api.naming.NamingMaintainFactory; -import com.alibaba.nacos.api.naming.NamingMaintainService; -import com.alibaba.nacos.api.naming.NamingService; -import com.alibaba.nacos.api.naming.PreservedMetadataKeys; -import com.alibaba.nacos.client.naming.utils.UtilAndComs; +import static com.alibaba.nacos.api.PropertyKeyConst.ACCESS_KEY; +import static com.alibaba.nacos.api.PropertyKeyConst.CLUSTER_NAME; +import static com.alibaba.nacos.api.PropertyKeyConst.ENDPOINT; +import static com.alibaba.nacos.api.PropertyKeyConst.ENDPOINT_PORT; +import static com.alibaba.nacos.api.PropertyKeyConst.NAMESPACE; +import static com.alibaba.nacos.api.PropertyKeyConst.NAMING_LOAD_CACHE_AT_START; +import static com.alibaba.nacos.api.PropertyKeyConst.SECRET_KEY; +import static com.alibaba.nacos.api.PropertyKeyConst.SERVER_ADDR; /** * @author dungu.zpf @@ -66,7 +67,7 @@ public class NacosDiscoveryProperties { .getLogger(NacosDiscoveryProperties.class); /** - * nacos discovery server address + * nacos discovery server address. */ private String serverAddr; @@ -87,12 +88,12 @@ public class NacosDiscoveryProperties { private long watchDelay = 30000; /** - * nacos naming log file name + * nacos naming log file name. */ private String logName; /** - * service name to registry + * service name to registry. */ @Value("${spring.cloud.nacos.discovery.service:${spring.application.name:}}") private String service; @@ -103,12 +104,17 @@ public class NacosDiscoveryProperties { private float weight = 1; /** - * cluster name for nacos server. + * cluster name for nacos . */ private String clusterName = "DEFAULT"; /** - * naming load from local cache at application start. true is load + * group name for nacos. + */ + private String group = "DEFAULT_GROUP"; + + /** + * naming load from local cache at application start. true is load. */ private String namingLoadCacheAtStart = "false"; @@ -130,18 +136,18 @@ public class NacosDiscoveryProperties { private String ip; /** - * which network interface's ip you want to register + * which network interface's ip you want to register. */ private String networkInterface = ""; /** * The port your want to register for your service instance, needn't to set it if the - * auto detect port works well + * auto detect port works well. */ private int port = -1; /** - * whether your service is a https service + * whether your service is a https service. */ private boolean secure = false; @@ -189,7 +195,7 @@ public class NacosDiscoveryProperties { } serverAddr = Objects.toString(serverAddr, ""); - if (serverAddr.lastIndexOf("/") != -1) { + if (serverAddr.endsWith("/")) { serverAddr = serverAddr.substring(0, serverAddr.length() - 1); } endpoint = Objects.toString(endpoint, ""); @@ -394,25 +400,40 @@ public class NacosDiscoveryProperties { this.watchDelay = watchDelay; } + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + @Override public String toString() { return "NacosDiscoveryProperties{" + "serverAddr='" + serverAddr + '\'' + ", endpoint='" + endpoint + '\'' + ", namespace='" + namespace + '\'' + ", watchDelay=" + watchDelay + ", logName='" + logName + '\'' + ", service='" + service + '\'' + ", weight=" + weight - + ", clusterName='" + clusterName + '\'' + ", namingLoadCacheAtStart='" - + namingLoadCacheAtStart + '\'' + ", metadata=" + metadata - + ", registerEnabled=" + registerEnabled + ", ip='" + ip + '\'' - + ", networkInterface='" + networkInterface + '\'' + ", port=" + port - + ", secure=" + secure + ", accessKey='" + accessKey + '\'' - + ", secretKey='" + secretKey + '\'' + '}'; + + ", clusterName='" + clusterName + '\'' + ", group='" + group + '\'' + + ", namingLoadCacheAtStart='" + namingLoadCacheAtStart + '\'' + + ", metadata=" + metadata + ", registerEnabled=" + registerEnabled + + ", ip='" + ip + '\'' + ", networkInterface='" + networkInterface + '\'' + + ", port=" + port + ", secure=" + secure + ", accessKey='" + accessKey + + '\'' + ", secretKey='" + secretKey + '\'' + ", heartBeatInterval=" + + heartBeatInterval + ", heartBeatTimeout=" + heartBeatTimeout + + ", ipDeleteTimeout=" + ipDeleteTimeout + '}'; } public void overrideFromEnv(Environment env) { if (StringUtils.isEmpty(this.getServerAddr())) { - this.setServerAddr(env - .resolvePlaceholders("${spring.cloud.nacos.discovery.server-addr:}")); + String serverAddr = env + .resolvePlaceholders("${spring.cloud.nacos.discovery.server-addr:}"); + if (StringUtils.isEmpty(serverAddr)) { + serverAddr = env + .resolvePlaceholders("${spring.cloud.nacos.server-addr:}"); + } + this.setServerAddr(serverAddr); } if (StringUtils.isEmpty(this.getNamespace())) { this.setNamespace(env @@ -438,8 +459,13 @@ public class NacosDiscoveryProperties { this.setEndpoint( env.resolvePlaceholders("${spring.cloud.nacos.discovery.endpoint:}")); } + if (StringUtils.isEmpty(this.getGroup())) { + this.setGroup( + env.resolvePlaceholders("${spring.cloud.nacos.discovery.group:}")); + } } + @Deprecated public NamingService namingServiceInstance() { if (null != namingService) { @@ -456,6 +482,7 @@ public class NacosDiscoveryProperties { return namingService; } + @Deprecated public NamingMaintainService namingMaintainServiceInstance() { if (null != namingMaintainService) { diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosNamingManager.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosNamingManager.java new file mode 100644 index 00000000..85335c85 --- /dev/null +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosNamingManager.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos; + +import com.alibaba.nacos.api.naming.NamingMaintainService; +import com.alibaba.nacos.api.naming.NamingService; + +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author liaochuntao + */ +public class NacosNamingManager { + + private static NamingService namingService = null; + + private static NamingMaintainService namingMaintainService = null; + + @Autowired + private NacosDiscoveryProperties discoveryProperties; + + public NamingService getNamingService() { + if (namingService == null) { + namingService = discoveryProperties.namingServiceInstance(); + } + return namingService; + } + + public NamingMaintainService getNamingMaintainService() { + if (namingMaintainService == null) { + namingMaintainService = discoveryProperties.namingMaintainServiceInstance(); + } + return namingMaintainService; + } +} diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClient.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClient.java index 7c171787..66ced0ad 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClient.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClient.java @@ -16,23 +16,26 @@ package com.alibaba.cloud.nacos.discovery; +import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.cloud.client.DefaultServiceInstance; -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.discovery.DiscoveryClient; - import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosNamingManager; import com.alibaba.cloud.nacos.NacosServiceInstance; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.api.naming.pojo.ListView; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; + /** * @author xiaojing * @author renhaojun @@ -42,9 +45,12 @@ public class NacosDiscoveryClient implements DiscoveryClient { private static final Logger log = LoggerFactory.getLogger(NacosDiscoveryClient.class); public static final String DESCRIPTION = "Spring Cloud Nacos Discovery Client"; + private NacosNamingManager nacosNamingManager; private NacosDiscoveryProperties discoveryProperties; - public NacosDiscoveryClient(NacosDiscoveryProperties discoveryProperties) { + public NacosDiscoveryClient(NacosNamingManager nacosNamingManager, + NacosDiscoveryProperties discoveryProperties) { + this.nacosNamingManager = nacosNamingManager; this.discoveryProperties = discoveryProperties; } @@ -55,19 +61,45 @@ public class NacosDiscoveryClient implements DiscoveryClient { @Override public ServiceInstance getLocalServiceInstance() { - String serviceId = discoveryProperties.getService(); - String host = discoveryProperties.getIp(); - int port = discoveryProperties.getPort(); - boolean secure = discoveryProperties.isSecure(); - Map metadata = discoveryProperties.getMetadata(); - return new DefaultServiceInstance(serviceId, host, port, secure, metadata); + return new ServiceInstance() { + @Override + public String getServiceId() { + return NacosDiscoveryClient.this.discoveryProperties.getService(); + } + + @Override + public String getHost() { + return NacosDiscoveryClient.this.discoveryProperties.getIp(); + } + + @Override + public int getPort() { + return NacosDiscoveryClient.this.discoveryProperties.getPort(); + } + + @Override + public boolean isSecure() { + return NacosDiscoveryClient.this.discoveryProperties.isSecure(); + } + + @Override + public URI getUri() { + return DefaultServiceInstance.getUri(this); + } + + @Override + public Map getMetadata() { + return NacosDiscoveryClient.this.discoveryProperties.getMetadata(); + } + }; } @Override public List getInstances(String serviceId) { try { - List instances = discoveryProperties.namingServiceInstance() - .selectInstances(serviceId, true); + String group = discoveryProperties.getGroup(); + List instances = nacosNamingManager.getNamingService() + .selectInstances(serviceId, group, true); return hostToServiceInstanceList(instances, serviceId); } catch (Exception e) { @@ -76,8 +108,11 @@ public class NacosDiscoveryClient implements DiscoveryClient { } } - private static ServiceInstance hostToServiceInstance(Instance instance, + public static ServiceInstance hostToServiceInstance(Instance instance, String serviceId) { + if (instance == null || !instance.isEnabled() || !instance.isHealthy()) { + return null; + } NacosServiceInstance nacosServiceInstance = new NacosServiceInstance(); nacosServiceInstance.setHost(instance.getIp()); nacosServiceInstance.setPort(instance.getPort()); @@ -98,11 +133,14 @@ public class NacosDiscoveryClient implements DiscoveryClient { return nacosServiceInstance; } - private static List hostToServiceInstanceList( + public static List hostToServiceInstanceList( List instances, String serviceId) { List result = new ArrayList<>(instances.size()); for (Instance instance : instances) { - result.add(hostToServiceInstance(instance, serviceId)); + ServiceInstance serviceInstance = hostToServiceInstance(instance, serviceId); + if (serviceInstance != null) { + result.add(serviceInstance); + } } return result; } @@ -111,8 +149,9 @@ public class NacosDiscoveryClient implements DiscoveryClient { public List getServices() { try { - ListView services = discoveryProperties.namingServiceInstance() - .getServicesOfServer(1, Integer.MAX_VALUE); + String group = discoveryProperties.getGroup(); + ListView services = nacosNamingManager.getNamingService() + .getServicesOfServer(1, Integer.MAX_VALUE, group); return services.getData(); } catch (Exception e) { diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientAutoConfiguration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientAutoConfiguration.java index 8de3bbae..261402a7 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientAutoConfiguration.java @@ -16,6 +16,10 @@ package com.alibaba.cloud.nacos.discovery; +import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosNamingManager; + import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -25,9 +29,6 @@ import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAu import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; - /** * @author xiaojing */ @@ -44,9 +45,9 @@ public class NacosDiscoveryClientAutoConfiguration { } @Bean - public DiscoveryClient nacosDiscoveryClient( + public DiscoveryClient nacosDiscoveryClient(NacosNamingManager nacosNamingManager, NacosDiscoveryProperties discoveryProperties) { - return new NacosDiscoveryClient(discoveryProperties); + return new NacosDiscoveryClient(nacosNamingManager, discoveryProperties); } @Bean diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java index c721e1e2..29e4c441 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java @@ -23,8 +23,12 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.nacos.api.naming.listener.EventListener; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.cloud.client.discovery.event.HeartbeatEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; @@ -32,9 +36,6 @@ import org.springframework.context.SmartLifecycle; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.nacos.api.naming.listener.EventListener; - /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosConfigServerAutoConfiguration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosConfigServerAutoConfiguration.java index 0cccdcfd..2c916bad 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosConfigServerAutoConfiguration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosConfigServerAutoConfiguration.java @@ -18,6 +18,8 @@ package com.alibaba.cloud.nacos.discovery.configclient; import javax.annotation.PostConstruct; +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -25,8 +27,6 @@ import org.springframework.cloud.config.server.config.ConfigServerProperties; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils; -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; - /** * Extra configuration for config server if it happens to be registered with Nacos. * diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosDiscoveryClientConfigServiceBootstrapConfiguration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosDiscoveryClientConfigServiceBootstrapConfiguration.java index 309439ae..6ee2aaad 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosDiscoveryClientConfigServiceBootstrapConfiguration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosDiscoveryClientConfigServiceBootstrapConfiguration.java @@ -16,15 +16,15 @@ package com.alibaba.cloud.nacos.discovery.configclient; +import com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration; +import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; + import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.config.client.ConfigServicePropertySourceLocator; import org.springframework.context.annotation.Configuration; -import com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration; -import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; - /** * Helper for config client that wants to lookup the config server via discovery. * diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java index cd22e3a2..805ebdc4 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java @@ -21,14 +21,16 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.actuate.endpoint.AbstractEndpoint; - import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosNamingManager; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.ServiceInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.boot.actuate.endpoint.AbstractEndpoint; + /** * Endpoint for nacos discovery, get nacos properties and subscribed services * @author xiaojing @@ -38,10 +40,13 @@ public class NacosDiscoveryEndpoint extends AbstractEndpoint private static final Logger log = LoggerFactory .getLogger(NacosDiscoveryEndpoint.class); + private NacosNamingManager nacosNamingManager; private NacosDiscoveryProperties nacosDiscoveryProperties; - public NacosDiscoveryEndpoint(NacosDiscoveryProperties nacosDiscoveryProperties) { + public NacosDiscoveryEndpoint(NacosNamingManager nacosNamingManager, + NacosDiscoveryProperties nacosDiscoveryProperties) { super("nacos_discovery", false); + this.nacosNamingManager = nacosNamingManager; this.nacosDiscoveryProperties = nacosDiscoveryProperties; } @@ -53,7 +58,7 @@ public class NacosDiscoveryEndpoint extends AbstractEndpoint Map result = new HashMap<>(); result.put("NacosDiscoveryProperties", nacosDiscoveryProperties); - NamingService namingService = nacosDiscoveryProperties.namingServiceInstance(); + NamingService namingService = nacosNamingManager.getNamingService(); List subscribe = Collections.emptyList(); try { diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java index b9f51739..9879c61e 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java @@ -16,14 +16,15 @@ package com.alibaba.cloud.nacos.endpoint; +import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosNamingManager; + import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; - /** * @author xiaojing */ @@ -35,8 +36,9 @@ public class NacosDiscoveryEndpointAutoConfiguration { @Bean @ConditionalOnMissingBean public NacosDiscoveryEndpoint nacosDiscoveryEndpoint( + NacosNamingManager nacosNamingManager, NacosDiscoveryProperties nacosDiscoveryProperties) { - return new NacosDiscoveryEndpoint(nacosDiscoveryProperties); + return new NacosDiscoveryEndpoint(nacosNamingManager, nacosDiscoveryProperties); } } diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistration.java index 064de97b..0a22d976 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistration.java @@ -18,6 +18,7 @@ package com.alibaba.cloud.nacos.registry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration; import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties; import org.springframework.cloud.client.serviceregistry.Registration; diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java index da078747..08220151 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java @@ -21,6 +21,11 @@ import java.util.Map; import javax.annotation.PostConstruct; +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosNamingManager; +import com.alibaba.nacos.api.naming.NamingService; +import com.alibaba.nacos.api.naming.PreservedMetadataKeys; + import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.ManagementServerPortUtils; @@ -29,10 +34,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.nacos.api.naming.NamingService; -import com.alibaba.nacos.api.naming.PreservedMetadataKeys; - /** * @author xiaojing */ @@ -42,12 +43,15 @@ public class NacosRegistration implements Registration, ServiceInstance { public static final String MANAGEMENT_CONTEXT_PATH = "management.context-path"; public static final String MANAGEMENT_ADDRESS = "management.address"; + private NacosNamingManager nacosNamingManager; private NacosDiscoveryProperties nacosDiscoveryProperties; private ApplicationContext context; - public NacosRegistration(NacosDiscoveryProperties nacosDiscoveryProperties, + public NacosRegistration(NacosNamingManager nacosNamingManager, + NacosDiscoveryProperties nacosDiscoveryProperties, ApplicationContext context) { + this.nacosNamingManager = nacosNamingManager; this.nacosDiscoveryProperties = nacosDiscoveryProperties; this.context = context; } @@ -134,7 +138,7 @@ public class NacosRegistration implements Registration, ServiceInstance { } public NamingService getNacosNamingService() { - return nacosDiscoveryProperties.namingServiceInstance(); + return nacosNamingManager.getNamingService(); } @Override diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java index 6a88b1d1..a587707e 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java @@ -18,16 +18,18 @@ package com.alibaba.cloud.nacos.registry; import java.util.List; +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosNamingManager; +import com.alibaba.nacos.api.naming.NamingService; +import com.alibaba.nacos.api.naming.pojo.Instance; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; import org.springframework.util.StringUtils; -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.nacos.api.naming.NamingService; -import com.alibaba.nacos.api.naming.pojo.Instance; - /** * @author xiaojing * @author Mercy @@ -36,13 +38,16 @@ public class NacosServiceRegistry implements ServiceRegistry { private static final Logger log = LoggerFactory.getLogger(NacosServiceRegistry.class); + private final NacosNamingManager nacosNamingManager; private final NacosDiscoveryProperties nacosDiscoveryProperties; private final NamingService namingService; - public NacosServiceRegistry(NacosDiscoveryProperties nacosDiscoveryProperties) { + public NacosServiceRegistry(NacosNamingManager nacosNamingManager, + NacosDiscoveryProperties nacosDiscoveryProperties) { + this.nacosNamingManager = nacosNamingManager; this.nacosDiscoveryProperties = nacosDiscoveryProperties; - this.namingService = nacosDiscoveryProperties.namingServiceInstance(); + this.namingService = nacosNamingManager.getNamingService(); } @Override @@ -54,12 +59,13 @@ public class NacosServiceRegistry implements ServiceRegistry { } String serviceId = registration.getServiceId(); + String group = nacosDiscoveryProperties.getGroup(); Instance instance = getNacosInstanceFromRegistration(registration); try { - namingService.registerInstance(serviceId, instance); - log.info("nacos registry, {} {}:{} register finished", serviceId, + namingService.registerInstance(serviceId, group, instance); + log.info("nacos registry, {} {} {}:{} register finished", group, serviceId, instance.getIp(), instance.getPort()); } catch (Exception e) { @@ -78,11 +84,12 @@ public class NacosServiceRegistry implements ServiceRegistry { return; } - NamingService namingService = nacosDiscoveryProperties.namingServiceInstance(); + NamingService namingService = nacosNamingManager.getNamingService(); String serviceId = registration.getServiceId(); + String group = nacosDiscoveryProperties.getGroup(); try { - namingService.deregisterInstance(serviceId, registration.getHost(), + namingService.deregisterInstance(serviceId, group, registration.getHost(), registration.getPort(), nacosDiscoveryProperties.getClusterName()); } catch (Exception e) { @@ -118,8 +125,8 @@ public class NacosServiceRegistry implements ServiceRegistry { } try { - nacosDiscoveryProperties.namingMaintainServiceInstance() - .updateInstance(serviceId, instance); + nacosNamingManager.getNamingMaintainService().updateInstance(serviceId, + instance); } catch (Exception e) { throw new RuntimeException("update nacos instance status fail", e); @@ -132,7 +139,7 @@ public class NacosServiceRegistry implements ServiceRegistry { String serviceName = registration.getServiceId(); try { - List instances = nacosDiscoveryProperties.namingServiceInstance() + List instances = nacosNamingManager.getNamingService() .getAllInstances(serviceName); for (Instance instance : instances) { if (instance.getIp().equalsIgnoreCase(nacosDiscoveryProperties.getIp()) @@ -153,6 +160,7 @@ public class NacosServiceRegistry implements ServiceRegistry { instance.setWeight(nacosDiscoveryProperties.getWeight()); instance.setClusterName(nacosDiscoveryProperties.getClusterName()); instance.setMetadata(registration.getMetadata()); + return instance; } diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/ExtendBalancer.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/ExtendBalancer.java index 06111263..48424f74 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/ExtendBalancer.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/ExtendBalancer.java @@ -1,3 +1,19 @@ +/* + * 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.ribbon; import java.util.List; diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java index 86d56f24..44af17b5 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java @@ -16,15 +16,16 @@ package com.alibaba.cloud.nacos.ribbon; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosNamingManager; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.ServerList; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + /** * integrated Ribbon by default * @author xiaojing @@ -36,8 +37,10 @@ public class NacosRibbonClientConfiguration { @Bean @ConditionalOnMissingBean public ServerList ribbonServerList(IClientConfig config, + NacosNamingManager nacosNamingManager, NacosDiscoveryProperties nacosDiscoveryProperties) { - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); + NacosServerList serverList = new NacosServerList(nacosNamingManager, + nacosDiscoveryProperties); serverList.initWithNiwsConfig(config); return serverList; } diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java index 663d894b..1845a7ef 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java @@ -1,16 +1,27 @@ +/* + * 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.ribbon; import java.util.ArrayList; import java.util.List; import java.util.Objects; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; - import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosNamingManager; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; @@ -18,6 +29,12 @@ 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.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; /** * Supports preferentially calling the ribbon load balancing rules of the same cluster @@ -31,6 +48,9 @@ public class NacosRule extends AbstractLoadBalancerRule { @Autowired private NacosDiscoveryProperties nacosDiscoveryProperties; + @Autowired + private NacosNamingManager nacosNamingManager; + @Override public Server choose(Object key) { try { @@ -38,8 +58,7 @@ public class NacosRule extends AbstractLoadBalancerRule { DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer(); String name = loadBalancer.getName(); - NamingService namingService = this.nacosDiscoveryProperties - .namingServiceInstance(); + NamingService namingService = this.nacosNamingManager.getNamingService(); List instances = namingService.selectInstances(name, true); if (CollectionUtils.isEmpty(instances)) { LOGGER.warn("no instance in service {}", name); diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerIntrospector.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerIntrospector.java index 481c2d4a..35fc86c4 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerIntrospector.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerIntrospector.java @@ -18,10 +18,10 @@ package com.alibaba.cloud.nacos.ribbon; import java.util.Map; -import org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector; - import com.netflix.loadbalancer.Server; +import org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector; + /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java index 46fe51aa..4be18bd4 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosNamingManager; import com.alibaba.nacos.api.naming.pojo.Instance; import com.netflix.client.config.IClientConfig; @@ -31,11 +32,14 @@ import com.netflix.loadbalancer.AbstractServerList; */ public class NacosServerList extends AbstractServerList { + private NacosNamingManager nacosNamingManager; private NacosDiscoveryProperties discoveryProperties; private String serviceId; - public NacosServerList(NacosDiscoveryProperties discoveryProperties) { + public NacosServerList(NacosNamingManager nacosNamingManager, + NacosDiscoveryProperties discoveryProperties) { + this.nacosNamingManager = nacosNamingManager; this.discoveryProperties = discoveryProperties; } @@ -51,8 +55,9 @@ public class NacosServerList extends AbstractServerList { private List getServers() { try { - List instances = discoveryProperties.namingServiceInstance() - .selectInstances(serviceId, true); + String group = discoveryProperties.getGroup(); + List instances = nacosNamingManager.getNamingService() + .selectInstances(serviceId, group, true); return instancesToServerList(instances); } catch (Exception e) { diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/RibbonNacosAutoConfiguration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/RibbonNacosAutoConfiguration.java index 64a30167..7a6a1225 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/RibbonNacosAutoConfiguration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/RibbonNacosAutoConfiguration.java @@ -16,6 +16,8 @@ package com.alibaba.cloud.nacos.ribbon; +import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; + import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -24,8 +26,6 @@ import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.context.annotation.Configuration; -import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; - /** * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration * Auto-configuration} that sets up Ribbon for Nacos. diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 54c3f79f..2f0718f9 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -1,4 +1,15 @@ {"properties": [ + { + "name": "spring.cloud.nacos.server-addr", + "type": "java.lang.String", + "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", diff --git a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/NacosDiscoveryAutoConfigurationTests.java b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/NacosDiscoveryAutoConfigurationTests.java index 0bb4b761..0491c808 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/NacosDiscoveryAutoConfigurationTests.java +++ b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/NacosDiscoveryAutoConfigurationTests.java @@ -16,10 +16,12 @@ package com.alibaba.cloud.nacos; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; +import com.alibaba.cloud.nacos.registry.NacosRegistration; import org.junit.Before; import org.junit.Test; + import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.builder.SpringApplicationBuilder; @@ -30,8 +32,7 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; -import com.alibaba.cloud.nacos.registry.NacosRegistration; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaojing diff --git a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/NacosDiscoveryClientTests.java b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/NacosDiscoveryClientTests.java index cf94fab9..0b018cf8 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/NacosDiscoveryClientTests.java +++ b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/NacosDiscoveryClientTests.java @@ -16,25 +16,26 @@ package com.alibaba.cloud.nacos; -import static com.alibaba.cloud.nacos.test.NacosMockTest.serviceInstance; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; -import org.junit.Test; -import org.springframework.cloud.client.ServiceInstance; - import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClient; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.api.naming.pojo.ListView; +import org.junit.Test; + +import org.springframework.cloud.client.ServiceInstance; + +import static com.alibaba.cloud.nacos.test.NacosMockTest.serviceInstance; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /** * @author xiaojing */ @@ -53,19 +54,21 @@ public class NacosDiscoveryClientTests { map.put("test-key", "test-value"); map.put("secure", "true"); - instances.add(serviceInstance(serviceName, false, host, port, map)); + instances.add(serviceInstance(serviceName, true, host, port, map)); NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); + NacosNamingManager nacosNamingManager = mock(NacosNamingManager.class); NamingService namingService = mock(NamingService.class); - when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); - when(namingService.selectInstances(eq(serviceName), eq(true))) + when(nacosNamingManager.getNamingService()).thenReturn(namingService); + when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); + when(namingService.selectInstances(eq(serviceName), eq("DEFAULT"), eq(true))) .thenReturn(instances); NacosDiscoveryClient discoveryClient = new NacosDiscoveryClient( - nacosDiscoveryProperties); + nacosNamingManager, nacosDiscoveryProperties); List serviceInstances = discoveryClient .getInstances(serviceName); @@ -97,15 +100,17 @@ public class NacosDiscoveryClientTests { NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); + NacosNamingManager nacosNamingManager = mock(NacosNamingManager.class); NamingService namingService = mock(NamingService.class); NacosDiscoveryClient discoveryClient = new NacosDiscoveryClient( - nacosDiscoveryProperties); + nacosNamingManager, nacosDiscoveryProperties); - when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); - when(namingService.getServicesOfServer(eq(1), eq(Integer.MAX_VALUE))) - .thenReturn(nacosServices); + when(nacosNamingManager.getNamingService()).thenReturn(namingService); + when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); + when(namingService.getServicesOfServer(eq(1), eq(Integer.MAX_VALUE), + eq("DEFAULT"))).thenReturn(nacosServices); List services = discoveryClient.getServices(); diff --git a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationIpNetworkInterfaceTests.java b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationIpNetworkInterfaceTests.java index 0486b851..f2611a66 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationIpNetworkInterfaceTests.java +++ b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationIpNetworkInterfaceTests.java @@ -16,17 +16,18 @@ package com.alibaba.cloud.nacos.registry; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; - import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumeration; +import com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration; +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; + import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -36,9 +37,9 @@ import org.springframework.cloud.commons.util.InetUtils; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration; -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author xiaojing diff --git a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationIpTests.java b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationIpTests.java index 2f0944eb..05ebf753 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationIpTests.java +++ b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationIpTests.java @@ -16,12 +16,13 @@ package com.alibaba.cloud.nacos.registry; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration; +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -30,9 +31,9 @@ import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationC import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration; -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author xiaojing diff --git a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationManagementPortTests.java b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationManagementPortTests.java index 38d6e5ec..caa535af 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationManagementPortTests.java +++ b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationManagementPortTests.java @@ -16,12 +16,13 @@ package com.alibaba.cloud.nacos.registry; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration; +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -30,9 +31,9 @@ import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationC import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration; -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author xiaojing diff --git a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationPortTests.java b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationPortTests.java index 25483a82..0492ea71 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationPortTests.java +++ b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationPortTests.java @@ -16,12 +16,13 @@ package com.alibaba.cloud.nacos.registry; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration; +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -30,9 +31,9 @@ import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationC import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration; -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author xiaojing diff --git a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationTests.java b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationTests.java index 2158a445..de100a40 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationTests.java +++ b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationTests.java @@ -16,15 +16,17 @@ package com.alibaba.cloud.nacos.registry; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; - import java.util.Map; +import com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration; +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosNamingManager; +import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; +import com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpoint; + import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -35,10 +37,10 @@ import org.springframework.cloud.commons.util.InetUtils; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration; -import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientAutoConfiguration; -import com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpoint; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author xiaojing @@ -56,7 +58,10 @@ import com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpoint; "spring.cloud.nacos.discovery.namingLoadCacheAtStart=true", "spring.cloud.nacos.discovery.secure=true", "spring.cloud.nacos.discovery.accessKey=test-accessKey", - "spring.cloud.nacos.discovery.secretKey=test-secretKey" }, webEnvironment = RANDOM_PORT) + "spring.cloud.nacos.discovery.secretKey=test-secretKey", + "spring.cloud.nacos.discovery.heart-beat-interval=3", + "spring.cloud.nacos.discovery.heart-beat-timeout=6", + "spring.cloud.nacos.discovery.ip-delete-timeout=9", }, webEnvironment = RANDOM_PORT) public class NacosAutoServiceRegistrationTests { @Autowired @@ -71,6 +76,9 @@ public class NacosAutoServiceRegistrationTests { @Autowired private NacosDiscoveryProperties properties; + @Autowired + private NacosNamingManager nacosNamingManager; + @Autowired private InetUtils inetUtils; @@ -92,6 +100,9 @@ public class NacosAutoServiceRegistrationTests { checkoutNacosDiscoverySecure(); checkoutNacosDiscoveryAccessKey(); checkoutNacosDiscoverySecrectKey(); + checkoutNacosDiscoveryHeartBeatInterval(); + checkoutNacosDiscoveryHeartBeatTimeout(); + checkoutNacosDiscoveryIpDeleteTimeout(); checkoutNacosDiscoveryServiceName(); checkoutNacosDiscoveryServiceIP(); @@ -162,6 +173,21 @@ public class NacosAutoServiceRegistrationTests { properties.getSecretKey()); } + private void checkoutNacosDiscoveryHeartBeatInterval() { + assertEquals("NacosDiscoveryProperties heart beat interval was wrong", + Integer.valueOf(3), properties.getHeartBeatInterval()); + } + + private void checkoutNacosDiscoveryHeartBeatTimeout() { + assertEquals("NacosDiscoveryProperties heart beat timeout was wrong", + Integer.valueOf(6), properties.getHeartBeatTimeout()); + } + + private void checkoutNacosDiscoveryIpDeleteTimeout() { + assertEquals("NacosDiscoveryProperties ip delete timeout was wrong", + Integer.valueOf(9), properties.getIpDeleteTimeout()); + } + private void checkoutNacosDiscoveryServiceName() { assertEquals("NacosDiscoveryProperties service name was wrong", "myTestService1", properties.getService()); @@ -183,11 +209,11 @@ public class NacosAutoServiceRegistrationTests { private void checkoutEndpoint() throws Exception { NacosDiscoveryEndpoint nacosDiscoveryEndpoint = new NacosDiscoveryEndpoint( - properties); + nacosNamingManager, properties); Map map = nacosDiscoveryEndpoint.invoke(); assertEquals(map.get("NacosDiscoveryProperties"), properties); assertEquals(map.get("subscribe").toString(), - properties.namingServiceInstance().getSubscribeServices().toString()); + nacosNamingManager.getNamingService().getSubscribeServices().toString()); } @Configuration diff --git a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java index bbd1c76c..32fa03a0 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java +++ b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java @@ -16,26 +16,25 @@ package com.alibaba.cloud.nacos.ribbon; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; -import org.junit.Test; - import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosNamingManager; import com.alibaba.cloud.nacos.test.NacosMockTest; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; import com.netflix.client.config.IClientConfig; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; /** * @author xiaojing @@ -48,13 +47,16 @@ public class NacosServerListTests { public void testEmptyInstancesReturnsEmptyList() throws Exception { NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); + NacosNamingManager nacosNamingManager = mock(NacosNamingManager.class); NamingService namingService = mock(NamingService.class); - when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); - when(namingService.selectInstances(anyString(), eq(true))).thenReturn(null); + when(nacosNamingManager.getNamingService()).thenReturn(namingService); + when(namingService.selectInstances(anyString(), eq("DEFAULT"), eq(true))) + .thenReturn(null); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); + NacosServerList serverList = new NacosServerList(nacosNamingManager, + nacosDiscoveryProperties); List servers = serverList.getInitialListOfServers(); assertThat(servers).isEmpty(); } @@ -65,20 +67,24 @@ public class NacosServerListTests { ArrayList instances = new ArrayList<>(); instances.add(NacosMockTest.serviceInstance("test-service", false, - Collections. emptyMap())); + new HashMap())); NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); + NacosNamingManager nacosNamingManager = mock(NacosNamingManager.class); NamingService namingService = mock(NamingService.class); - when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); - when(namingService.selectInstances(eq("test-service"), eq(true))) + when(nacosNamingManager.getNamingService()).thenReturn(namingService); + when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); + when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); + when(namingService.selectInstances(eq("test-service"), eq("DEFAULT"), eq(true))) .thenReturn(instances); IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); + NacosServerList serverList = new NacosServerList(nacosNamingManager, + nacosDiscoveryProperties); serverList.initWithNiwsConfig(clientConfig); List servers = serverList.getInitialListOfServers(); assertThat(servers).hasSize(1); @@ -101,10 +107,12 @@ public class NacosServerListTests { NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); + NacosNamingManager nacosNamingManager = mock(NacosNamingManager.class); NamingService namingService = mock(NamingService.class); - when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); + when(nacosNamingManager.getNamingService()).thenReturn(namingService); + when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); List returnInstances = new LinkedList<>(); @@ -114,12 +122,13 @@ public class NacosServerListTests { } } - when(namingService.selectInstances(eq("test-service"), eq(true))) + when(namingService.selectInstances(eq("test-service"), eq("DEFAULT"), eq(true))) .thenReturn(returnInstances); IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); + NacosServerList serverList = new NacosServerList(nacosNamingManager, + nacosDiscoveryProperties); serverList.initWithNiwsConfig(clientConfig); List servers = serverList.getInitialListOfServers(); assertThat(servers).hasSize(1); @@ -147,9 +156,12 @@ public class NacosServerListTests { NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); + NacosNamingManager nacosNamingManager = mock(NacosNamingManager.class); + NamingService namingService = mock(NamingService.class); - when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); + when(nacosNamingManager.getNamingService()).thenReturn(namingService); + when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); List returnInstances = new LinkedList<>(); for (Instance instance : instances) { @@ -158,12 +170,13 @@ public class NacosServerListTests { } } - when(namingService.selectInstances(eq("test-service"), eq(true))) + when(namingService.selectInstances(eq("test-service"), eq("DEFAULT"), eq(true))) .thenReturn(returnInstances); IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); + NacosServerList serverList = new NacosServerList(nacosNamingManager, + nacosDiscoveryProperties); serverList.initWithNiwsConfig(clientConfig); List servers = serverList.getUpdatedListOfServers(); diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/GlobalTransactionAutoConfiguration.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/GlobalTransactionAutoConfiguration.java index a26aa578..e115f3e0 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/GlobalTransactionAutoConfiguration.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/GlobalTransactionAutoConfiguration.java @@ -16,14 +16,14 @@ package com.alibaba.cloud.seata; +import io.seata.spring.annotation.GlobalTransactionScanner; + import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils; -import io.seata.spring.annotation.GlobalTransactionScanner; - /** * @author xiaojing */ @@ -51,7 +51,7 @@ public class GlobalTransactionAutoConfiguration { String txServiceGroup = seataProperties.getTxServiceGroup(); if (StringUtils.isEmpty(txServiceGroup)) { - txServiceGroup = applicationName + "-fescar-service-group"; + txServiceGroup = applicationName + "-seata-service-group"; seataProperties.setTxServiceGroup(txServiceGroup); } diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/SeataProperties.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/SeataProperties.java index 492d054d..c9531434 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/SeataProperties.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/SeataProperties.java @@ -24,10 +24,10 @@ import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties("spring.cloud.alibaba.seata") public class SeataProperties { - // todo support config Fescar server information + // todo support config Seata server information /** - * Seata tx service group.default is ${spring.application.name}-fescar-service-group. + * Seata tx service group.default is ${spring.application.name}-seata-service-group. */ private String txServiceGroup; diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignBuilder.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignBuilder.java index 0855e358..9a6fd1c3 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignBuilder.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignBuilder.java @@ -16,10 +16,10 @@ package com.alibaba.cloud.seata.feign; -import org.springframework.beans.factory.BeanFactory; - import feign.Feign; +import org.springframework.beans.factory.BeanFactory; + /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignClient.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignClient.java index 9e486120..5b125beb 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignClient.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignClient.java @@ -23,14 +23,14 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.springframework.beans.factory.BeanFactory; -import org.springframework.util.StringUtils; - import feign.Client; import feign.Request; import feign.Response; import io.seata.core.context.RootContext; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.util.StringUtils; + /** * @author xiaojing */ @@ -68,9 +68,9 @@ public class SeataFeignClient implements Client { Map> headers = new HashMap<>(MAP_SIZE); headers.putAll(request.headers()); - List fescarXid = new ArrayList<>(); - fescarXid.add(xid); - headers.put(RootContext.KEY_XID, fescarXid); + List seataXid = new ArrayList<>(); + seataXid.add(xid); + headers.put(RootContext.KEY_XID, seataXid); return Request.create(request.method(), request.url(), headers, request.body(), request.charset()); diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignClientAutoConfiguration.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignClientAutoConfiguration.java index 38a14eae..1f71729a 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignClientAutoConfiguration.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignClientAutoConfiguration.java @@ -16,6 +16,9 @@ package com.alibaba.cloud.seata.feign; +import feign.Client; +import feign.Feign; + import org.springframework.beans.factory.BeanFactory; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -26,9 +29,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; -import feign.Client; -import feign.Feign; - /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignContext.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignContext.java index 4a8bdb64..b19e5303 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignContext.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignContext.java @@ -19,10 +19,10 @@ package com.alibaba.cloud.seata.feign; import java.util.HashMap; import java.util.Map; -import org.springframework.cloud.netflix.feign.FeignContext; - import feign.Client; +import org.springframework.cloud.netflix.feign.FeignContext; + /** * * @author xiaojing diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignObjectWrapper.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignObjectWrapper.java index 206737b1..b929d49d 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignObjectWrapper.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignObjectWrapper.java @@ -16,13 +16,13 @@ package com.alibaba.cloud.seata.feign; +import feign.Client; + import org.springframework.beans.factory.BeanFactory; import org.springframework.cloud.netflix.feign.ribbon.CachingSpringLoadBalancerFactory; import org.springframework.cloud.netflix.feign.ribbon.LoadBalancerFeignClient; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; -import feign.Client; - /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataHystrixFeignBuilder.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataHystrixFeignBuilder.java index f226244a..3ffd78db 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataHystrixFeignBuilder.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataHystrixFeignBuilder.java @@ -16,12 +16,12 @@ package com.alibaba.cloud.seata.feign; -import org.springframework.beans.factory.BeanFactory; - import feign.Feign; import feign.Retryer; import feign.hystrix.HystrixFeign; +import org.springframework.beans.factory.BeanFactory; + /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataLoadBalancerFeignClient.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataLoadBalancerFeignClient.java index bdc9ecb8..051635fe 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataLoadBalancerFeignClient.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataLoadBalancerFeignClient.java @@ -23,17 +23,17 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import feign.Client; +import feign.Request; +import feign.Response; +import io.seata.core.context.RootContext; + import org.springframework.beans.factory.BeanFactory; import org.springframework.cloud.netflix.feign.ribbon.CachingSpringLoadBalancerFactory; import org.springframework.cloud.netflix.feign.ribbon.LoadBalancerFeignClient; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.util.StringUtils; -import feign.Client; -import feign.Request; -import feign.Response; -import io.seata.core.context.RootContext; - /** * @author xiaojing */ @@ -71,9 +71,9 @@ public class SeataLoadBalancerFeignClient extends LoadBalancerFeignClient { Map> headers = new HashMap<>(MAP_SIZE); headers.putAll(request.headers()); - List fescarXid = new ArrayList<>(); - fescarXid.add(xid); - headers.put(RootContext.KEY_XID, fescarXid); + List seataXid = new ArrayList<>(); + seataXid.add(xid); + headers.put(RootContext.KEY_XID, seataXid); return Request.create(request.method(), request.url(), headers, request.body(), request.charset()); diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataSentinelFeignBuilder.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataSentinelFeignBuilder.java index 0f185c2a..9c3615e6 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataSentinelFeignBuilder.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataSentinelFeignBuilder.java @@ -16,13 +16,13 @@ package com.alibaba.cloud.seata.feign; -import org.springframework.beans.factory.BeanFactory; - import com.alibaba.cloud.sentinel.feign.SentinelFeign; import feign.Feign; import feign.Retryer; +import org.springframework.beans.factory.BeanFactory; + /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixAutoConfiguration.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixAutoConfiguration.java index 465ca3e6..a6739269 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixAutoConfiguration.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixAutoConfiguration.java @@ -15,12 +15,12 @@ */ package com.alibaba.cloud.seata.feign.hystrix; +import com.netflix.hystrix.HystrixCommand; + import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.netflix.hystrix.HystrixCommand; - /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java index 0bff8173..c3e11103 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java @@ -19,7 +19,6 @@ import java.util.concurrent.Callable; import com.netflix.hystrix.strategy.HystrixPlugins; import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy; - import io.seata.core.context.RootContext; /** diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/rest/SeataRestTemplateInterceptor.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/rest/SeataRestTemplateInterceptor.java index d90f1255..97680aa0 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/rest/SeataRestTemplateInterceptor.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/rest/SeataRestTemplateInterceptor.java @@ -18,6 +18,8 @@ package com.alibaba.cloud.seata.rest; import java.io.IOException; +import io.seata.core.context.RootContext; + import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; @@ -25,8 +27,6 @@ import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.support.HttpRequestWrapper; import org.springframework.util.StringUtils; -import io.seata.core.context.RootContext; - /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java index 4e057bc4..cb302d2a 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java @@ -19,14 +19,14 @@ package com.alibaba.cloud.seata.web; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import io.seata.core.context.RootContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; -import io.seata.core.context.RootContext; - /** * @author xiaojing * diff --git a/spring-cloud-alibaba-sentinel-datasource/pom.xml b/spring-cloud-alibaba-sentinel-datasource/pom.xml index 2661b1b6..4a6fa3e7 100644 --- a/spring-cloud-alibaba-sentinel-datasource/pom.xml +++ b/spring-cloud-alibaba-sentinel-datasource/pom.xml @@ -53,6 +53,13 @@ true + + com.alibaba.csp + sentinel-datasource-redis + provided + true + + com.fasterxml.jackson.core jackson-databind diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/RuleType.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/RuleType.java index d7677639..69874688 100644 --- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/RuleType.java +++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/RuleType.java @@ -16,8 +16,6 @@ package com.alibaba.cloud.sentinel.datasource; -import org.springframework.util.StringUtils; - import com.alibaba.cloud.sentinel.datasource.config.AbstractDataSourceProperties; import com.alibaba.csp.sentinel.slots.block.AbstractRule; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule; @@ -26,6 +24,8 @@ import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; import com.alibaba.csp.sentinel.slots.system.SystemRule; +import org.springframework.util.StringUtils; + /** * Enum for {@link AbstractRule} class, using in * {@link AbstractDataSourceProperties#ruleType} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/AbstractDataSourceProperties.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/AbstractDataSourceProperties.java index 15040713..cfad5565 100644 --- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/AbstractDataSourceProperties.java +++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/AbstractDataSourceProperties.java @@ -18,8 +18,6 @@ package com.alibaba.cloud.sentinel.datasource.config; import javax.validation.constraints.NotNull; -import org.springframework.core.env.Environment; - import com.alibaba.cloud.sentinel.datasource.RuleType; import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager; import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager; @@ -32,6 +30,8 @@ import com.alibaba.csp.sentinel.slots.system.SystemRuleManager; import com.fasterxml.jackson.annotation.JsonIgnore; +import org.springframework.core.env.Environment; + /** * Abstract class Using by {@link DataSourcePropertiesConfiguration} * diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/DataSourcePropertiesConfiguration.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/DataSourcePropertiesConfiguration.java index f325a9dd..97f647ad 100644 --- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/DataSourcePropertiesConfiguration.java +++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/DataSourcePropertiesConfiguration.java @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.alibaba.cloud.sentinel.datasource.config; import java.lang.reflect.Field; @@ -6,10 +22,10 @@ import java.util.List; import javax.validation.Valid; -import org.springframework.util.ObjectUtils; - import com.fasterxml.jackson.annotation.JsonIgnore; +import org.springframework.util.ObjectUtils; + /** * Using By ConfigurationProperties. * diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/FileDataSourceProperties.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/FileDataSourceProperties.java index 5cd90ded..87a4b687 100644 --- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/FileDataSourceProperties.java +++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/FileDataSourceProperties.java @@ -20,11 +20,11 @@ import java.io.IOException; import javax.validation.constraints.NotNull; +import com.alibaba.cloud.sentinel.datasource.factorybean.FileRefreshableDataSourceFactoryBean; + import org.springframework.util.ResourceUtils; import org.springframework.util.StringUtils; -import com.alibaba.cloud.sentinel.datasource.factorybean.FileRefreshableDataSourceFactoryBean; - /** * File Properties class Using by {@link DataSourcePropertiesConfiguration} and * {@link FileRefreshableDataSourceFactoryBean} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/NacosDataSourceProperties.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/NacosDataSourceProperties.java index 79396ae9..699b97c2 100644 --- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/NacosDataSourceProperties.java +++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/NacosDataSourceProperties.java @@ -18,10 +18,10 @@ package com.alibaba.cloud.sentinel.datasource.config; import javax.validation.constraints.NotNull; -import org.springframework.util.StringUtils; - import com.alibaba.cloud.sentinel.datasource.factorybean.NacosDataSourceFactoryBean; +import org.springframework.util.StringUtils; + /** * Nacos Properties class Using by {@link DataSourcePropertiesConfiguration} and * {@link NacosDataSourceFactoryBean} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/ZookeeperDataSourceProperties.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/ZookeeperDataSourceProperties.java index 4d1755bf..ae24a0e6 100644 --- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/ZookeeperDataSourceProperties.java +++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/ZookeeperDataSourceProperties.java @@ -16,10 +16,10 @@ package com.alibaba.cloud.sentinel.datasource.config; -import org.springframework.util.StringUtils; - import com.alibaba.cloud.sentinel.datasource.factorybean.ZookeeperDataSourceFactoryBean; +import org.springframework.util.StringUtils; + /** * Zookeeper Properties class Using by {@link DataSourcePropertiesConfiguration} and * {@link ZookeeperDataSourceFactoryBean} @@ -32,7 +32,7 @@ public class ZookeeperDataSourceProperties extends AbstractDataSourceProperties super(ZookeeperDataSourceFactoryBean.class.getName()); } - private String serverAddr; + private String serverAddr = "localhost:2181"; private String path; diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/converter/SentinelConverter.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/converter/SentinelConverter.java index 3c739dea..ca8c331d 100644 --- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/converter/SentinelConverter.java +++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/converter/SentinelConverter.java @@ -23,10 +23,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.util.StringUtils; - import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule; @@ -36,6 +32,10 @@ import com.alibaba.csp.sentinel.slots.system.SystemRule; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.util.StringUtils; /** * Convert sentinel rules for json or xml array Using strict mode to parse json or xml diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/ApolloDataSourceFactoryBean.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/ApolloDataSourceFactoryBean.java index 002ddc0a..d203b2e6 100644 --- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/ApolloDataSourceFactoryBean.java +++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/ApolloDataSourceFactoryBean.java @@ -1,10 +1,10 @@ package com.alibaba.cloud.sentinel.datasource.factorybean; -import org.springframework.beans.factory.FactoryBean; - import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.datasource.apollo.ApolloDataSource; +import org.springframework.beans.factory.FactoryBean; + /** * A {@link FactoryBean} for creating {@link ApolloDataSource} instance. * diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/FileRefreshableDataSourceFactoryBean.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/FileRefreshableDataSourceFactoryBean.java index f07a65ca..d0615216 100644 --- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/FileRefreshableDataSourceFactoryBean.java +++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/FileRefreshableDataSourceFactoryBean.java @@ -3,11 +3,11 @@ package com.alibaba.cloud.sentinel.datasource.factorybean; import java.io.File; import java.nio.charset.Charset; -import org.springframework.beans.factory.FactoryBean; - import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.datasource.FileRefreshableDataSource; +import org.springframework.beans.factory.FactoryBean; + /** * A {@link FactoryBean} for creating {@link FileRefreshableDataSource} instance. * diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/NacosDataSourceFactoryBean.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/NacosDataSourceFactoryBean.java index 315f3208..9ec5e934 100644 --- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/NacosDataSourceFactoryBean.java +++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/NacosDataSourceFactoryBean.java @@ -18,13 +18,13 @@ package com.alibaba.cloud.sentinel.datasource.factorybean; import java.util.Properties; -import org.springframework.beans.factory.FactoryBean; -import org.springframework.util.StringUtils; - import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource; import com.alibaba.nacos.api.PropertyKeyConst; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.util.StringUtils; + /** * A {@link FactoryBean} for creating {@link NacosDataSource} instance. * diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/ZookeeperDataSourceFactoryBean.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/ZookeeperDataSourceFactoryBean.java index d5f45498..47191f39 100644 --- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/ZookeeperDataSourceFactoryBean.java +++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/ZookeeperDataSourceFactoryBean.java @@ -1,11 +1,11 @@ package com.alibaba.cloud.sentinel.datasource.factorybean; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.FactoryBean; - import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.datasource.zookeeper.ZookeeperDataSource; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.util.StringUtils; + /** * A {@link FactoryBean} for creating {@link ZookeeperDataSource} instance. * @@ -25,7 +25,7 @@ public class ZookeeperDataSourceFactoryBean implements FactoryBean map = new HashMap(); + + configureDefaultProperties(map); + + addOrReplace(environment.getPropertySources(), map); + } + + private void configureDefaultProperties(Map source) { + // Required Properties + source.put(SENTINEL_FILTER_ENABLED, "false"); + } + + private void addOrReplace(MutablePropertySources propertySources, + Map map) { + MapPropertySource target = null; + if (propertySources.contains(PROPERTY_SOURCE_NAME)) { + PropertySource source = propertySources.get(PROPERTY_SOURCE_NAME); + if (source instanceof MapPropertySource) { + target = (MapPropertySource) source; + for (String key : map.keySet()) { + if (!target.containsProperty(key)) { + target.getSource().put(key, map.get(key)); + } + } + } + } + if (target == null) { + target = new MapPropertySource(PROPERTY_SOURCE_NAME, map); + } + if (!propertySources.contains(PROPERTY_SOURCE_NAME)) { + propertySources.addLast(target); + } + } + +} diff --git a/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/SentinelGatewayAutoConfiguration.java b/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/SentinelGatewayAutoConfiguration.java index bcc7fbf6..6858de08 100644 --- a/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/SentinelGatewayAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/SentinelGatewayAutoConfiguration.java @@ -22,11 +22,6 @@ import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - import com.alibaba.cloud.sentinel.datasource.converter.JsonConverter; import com.alibaba.cloud.sentinel.datasource.converter.XmlConverter; import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition; @@ -46,6 +41,11 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + /** * @author Jim */ diff --git a/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/SentinelZuulAutoConfiguration.java b/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/SentinelZuulAutoConfiguration.java index b6637f45..58239a6a 100644 --- a/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/SentinelZuulAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/SentinelZuulAutoConfiguration.java @@ -18,17 +18,6 @@ package com.alibaba.cloud.sentinel.zuul; import javax.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - import com.alibaba.cloud.sentinel.zuul.handler.FallBackProviderHandler; import com.alibaba.csp.sentinel.adapter.gateway.zuul.callback.RequestOriginParser; import com.alibaba.csp.sentinel.adapter.gateway.zuul.callback.ZuulGatewayCallbackManager; @@ -38,6 +27,17 @@ import com.alibaba.csp.sentinel.adapter.gateway.zuul.filters.SentinelZuulPreFilt import com.alibaba.csp.sentinel.config.SentinelConfig; import com.netflix.zuul.http.ZuulServlet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; /** * Sentinel Spring Cloud Zuul AutoConfiguration diff --git a/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/SentinelZuulProperties.java b/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/SentinelZuulProperties.java index 3d1c7782..2c8c0f1a 100644 --- a/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/SentinelZuulProperties.java +++ b/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/SentinelZuulProperties.java @@ -16,14 +16,14 @@ package com.alibaba.cloud.sentinel.zuul; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; - import com.alibaba.csp.sentinel.adapter.gateway.zuul.constants.ZuulConstant; import com.alibaba.csp.sentinel.adapter.gateway.zuul.filters.SentinelZuulErrorFilter; import com.alibaba.csp.sentinel.adapter.gateway.zuul.filters.SentinelZuulPostFilter; import com.alibaba.csp.sentinel.adapter.gateway.zuul.filters.SentinelZuulPreFilter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.NestedConfigurationProperty; + /** * @author Jim */ diff --git a/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/handler/FallBackProviderHandler.java b/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/handler/FallBackProviderHandler.java index 541d1a24..949e0ab8 100644 --- a/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/handler/FallBackProviderHandler.java +++ b/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/zuul/handler/FallBackProviderHandler.java @@ -2,16 +2,17 @@ package com.alibaba.cloud.sentinel.zuul.handler; import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.SmartInitializingSingleton; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.util.CollectionUtils; - import com.alibaba.csp.sentinel.adapter.gateway.zuul.fallback.DefaultBlockFallbackProvider; import com.alibaba.csp.sentinel.adapter.gateway.zuul.fallback.ZuulBlockFallbackManager; import com.alibaba.csp.sentinel.adapter.gateway.zuul.fallback.ZuulBlockFallbackProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.util.CollectionUtils; + /** * @author tiger */ diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelConstants.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelConstants.java index 921458e3..7501ee49 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelConstants.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelConstants.java @@ -25,6 +25,7 @@ public interface SentinelConstants { String BLOCK_TYPE = "block"; String FALLBACK_TYPE = "fallback"; + String URLCLEANER_TYPE = "urlCleaner"; // commercialization diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelProperties.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelProperties.java index 12f50dac..376de58f 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelProperties.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelProperties.java @@ -22,15 +22,15 @@ import java.util.TreeMap; import javax.validation.Valid; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.core.Ordered; -import org.springframework.validation.annotation.Validated; - import com.alibaba.cloud.sentinel.datasource.config.DataSourcePropertiesConfiguration; import com.alibaba.csp.sentinel.config.SentinelConfig; import com.alibaba.csp.sentinel.log.LogBase; import com.alibaba.csp.sentinel.transport.config.TransportConfig; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.core.Ordered; +import org.springframework.validation.annotation.Validated; + /** * {@link ConfigurationProperties} for Sentinel. * diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelWebAutoConfiguration.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelWebAutoConfiguration.java index a58ce8cb..f85b9ea6 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelWebAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelWebAutoConfiguration.java @@ -21,8 +21,11 @@ import java.util.List; import javax.servlet.Filter; +import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; @@ -31,8 +34,6 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; - /** * @author xiaojing */ diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/annotation/SentinelRestTemplate.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/annotation/SentinelRestTemplate.java index 2638ee33..039c9b16 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/annotation/SentinelRestTemplate.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/annotation/SentinelRestTemplate.java @@ -38,4 +38,7 @@ public @interface SentinelRestTemplate { Class fallbackClass() default void.class; + String urlCleaner() default ""; + + Class urlCleanerClass() default void.class; } diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/BlockClassRegistry.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/BlockClassRegistry.java index 1e5d6c8b..c543802e 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/BlockClassRegistry.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/BlockClassRegistry.java @@ -29,6 +29,7 @@ final class BlockClassRegistry { private static final Map FALLBACK_MAP = new ConcurrentHashMap<>(); private static final Map BLOCK_HANDLER_MAP = new ConcurrentHashMap<>(); + private static final Map URL_CLEANER_MAP = new ConcurrentHashMap<>(); static Method lookupFallback(Class clazz, String name) { return FALLBACK_MAP.get(getKey(clazz, name)); @@ -38,6 +39,10 @@ final class BlockClassRegistry { return BLOCK_HANDLER_MAP.get(getKey(clazz, name)); } + static Method lookupUrlCleaner(Class clazz, String name) { + return URL_CLEANER_MAP.get(getKey(clazz, name)); + } + static void updateFallbackFor(Class clazz, String name, Method method) { if (clazz == null || StringUtil.isBlank(name)) { throw new IllegalArgumentException("Bad argument"); @@ -52,6 +57,13 @@ final class BlockClassRegistry { BLOCK_HANDLER_MAP.put(getKey(clazz, name), method); } + static void updateUrlCleanerFor(Class clazz, String name, Method method) { + if (clazz == null || StringUtil.isBlank(name)) { + throw new IllegalArgumentException("Bad argument"); + } + URL_CLEANER_MAP.put(getKey(clazz, name), method); + } + private static String getKey(Class clazz, String name) { return String.format("%s:%s", clazz.getCanonicalName(), name); } diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java index c6bde5ed..faa2693f 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java @@ -18,19 +18,6 @@ package com.alibaba.cloud.sentinel.custom; import javax.annotation.PostConstruct; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.util.StringUtils; - import com.alibaba.cloud.sentinel.SentinelProperties; import com.alibaba.cloud.sentinel.datasource.converter.JsonConverter; import com.alibaba.cloud.sentinel.datasource.converter.XmlConverter; @@ -55,6 +42,19 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.util.StringUtils; + /** * @author xiaojing * @author jiashuai.xie diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelBeanPostProcessor.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelBeanPostProcessor.java index 8db86ce1..945a9371 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelBeanPostProcessor.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelBeanPostProcessor.java @@ -17,13 +17,16 @@ package com.alibaba.cloud.sentinel.custom; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import java.util.concurrent.ConcurrentHashMap; +import com.alibaba.cloud.sentinel.SentinelConstants; +import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate; +import com.alibaba.csp.sentinel.slots.block.BlockException; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; @@ -40,10 +43,6 @@ import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; import org.springframework.web.client.RestTemplate; -import com.alibaba.cloud.sentinel.SentinelConstants; -import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate; -import com.alibaba.csp.sentinel.slots.block.BlockException; - /** * PostProcessor handle @SentinelRestTemplate Annotation, add interceptor for RestTemplate * @@ -113,14 +112,20 @@ public class SentinelBeanPostProcessor implements MergedBeanDefinitionPostProces throw new IllegalArgumentException(type + " method attribute exists but " + type + " class attribute is not exists in bean[" + beanName + "]"); } - Class[] args = new Class[] { HttpRequest.class, byte[].class, - ClientHttpRequestExecution.class, BlockException.class }; - - List argList = new ArrayList<>(); - for (Class argClazz : args) { - argList.add(argClazz.getSimpleName()); + Class[] args; + if (type.equals(SentinelConstants.URLCLEANER_TYPE)) { + args = new Class[] { String.class }; } - String argsStr = Arrays.toString(argList.toArray()); + else { + args = new Class[] { HttpRequest.class, byte[].class, + ClientHttpRequestExecution.class, BlockException.class }; + } + String[] argsArr = new String[args.length]; + for (int i = 0; i < argsArr.length; i++) { + argsArr[i] = args[i].getSimpleName(); + } + String argsStr = Arrays.toString(argsArr); + Method foundMethod = ClassUtils.getStaticMethod(blockClass, blockMethod, args); if (foundMethod == null) { log.error( @@ -133,21 +138,32 @@ public class SentinelBeanPostProcessor implements MergedBeanDefinitionPostProces + ", please check your class name, method name and arguments"); } - if (!ClientHttpResponse.class.isAssignableFrom(foundMethod.getReturnType())) { - log.error( - "{} method return value in bean[{}] is not ClientHttpResponse: {}#{}{}", - type, beanName, blockClass.getName(), blockMethod, argsStr); + Class standardReturnType; + if (type.equals(SentinelConstants.URLCLEANER_TYPE)) { + standardReturnType = String.class; + } + else { + standardReturnType = ClientHttpResponse.class; + } + + if (!standardReturnType.isAssignableFrom(foundMethod.getReturnType())) { + log.error("{} method return value in bean[{}] is not {}: {}#{}{}", type, + beanName, standardReturnType.getName(), blockClass.getName(), + blockMethod, argsStr); throw new IllegalArgumentException(type + " method return value in bean[" - + beanName + "] is not ClientHttpResponse: " + blockClass.getName() - + "#" + blockMethod + argsStr); + + beanName + "] is not " + standardReturnType.getName() + ": " + + blockClass.getName() + "#" + blockMethod + argsStr); } if (type.equals(SentinelConstants.BLOCK_TYPE)) { BlockClassRegistry.updateBlockHandlerFor(blockClass, blockMethod, foundMethod); } - else { + else if (type.equals(SentinelConstants.FALLBACK_TYPE)) { BlockClassRegistry.updateFallbackFor(blockClass, blockMethod, foundMethod); } + else { + BlockClassRegistry.updateUrlCleanerFor(blockClass, blockMethod, foundMethod); + } } private boolean checkSentinelProtect(RootBeanDefinition beanDefinition, @@ -189,7 +205,9 @@ public class SentinelBeanPostProcessor implements MergedBeanDefinitionPostProces .append(sentinelRestTemplate.blockHandlerClass().getSimpleName()) .append(sentinelRestTemplate.blockHandler()).append("_") .append(sentinelRestTemplate.fallbackClass().getSimpleName()) - .append(sentinelRestTemplate.fallback()); + .append(sentinelRestTemplate.fallback()).append("_") + .append(sentinelRestTemplate.urlCleanerClass().getSimpleName()) + .append(sentinelRestTemplate.urlCleaner()); RestTemplate restTemplate = (RestTemplate) bean; String interceptorBeanName = interceptorBeanNamePrefix + "@" + bean.toString(); diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelCircuitBreakerConfiguration.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelCircuitBreakerConfiguration.java index 25417ffa..af8d2cd2 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelCircuitBreakerConfiguration.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelCircuitBreakerConfiguration.java @@ -25,4 +25,5 @@ import org.springframework.context.annotation.Configuration; */ @Configuration public class SentinelCircuitBreakerConfiguration { + } diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelDataSourceHandler.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelDataSourceHandler.java index 8455c7a4..1fd2fbe5 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelDataSourceHandler.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelDataSourceHandler.java @@ -22,15 +22,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.SmartInitializingSingleton; -import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.core.env.Environment; -import org.springframework.util.ReflectionUtils; -import org.springframework.util.StringUtils; - import com.alibaba.cloud.sentinel.SentinelProperties; import com.alibaba.cloud.sentinel.datasource.config.AbstractDataSourceProperties; import com.alibaba.cloud.sentinel.datasource.config.DataSourcePropertiesConfiguration; @@ -39,6 +30,16 @@ import com.alibaba.cloud.sentinel.datasource.converter.XmlConverter; import com.alibaba.csp.sentinel.datasource.AbstractDataSource; import com.alibaba.csp.sentinel.datasource.ReadableDataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.core.env.Environment; +import org.springframework.util.ReflectionUtils; +import org.springframework.util.StringUtils; + /** * Sentinel {@link ReadableDataSource} Handler Handle the configurations of * 'spring.cloud.sentinel.datasource' diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelProtectInterceptor.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelProtectInterceptor.java index 4594caef..1c81e3ef 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelProtectInterceptor.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelProtectInterceptor.java @@ -21,12 +21,6 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URI; -import org.springframework.http.HttpRequest; -import org.springframework.http.client.ClientHttpRequestExecution; -import org.springframework.http.client.ClientHttpRequestInterceptor; -import org.springframework.http.client.ClientHttpResponse; -import org.springframework.web.client.RestTemplate; - import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate; import com.alibaba.cloud.sentinel.rest.SentinelClientHttpResponse; import com.alibaba.csp.sentinel.Entry; @@ -36,6 +30,12 @@ import com.alibaba.csp.sentinel.Tracer; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.web.client.RestTemplate; + /** * Interceptor using by SentinelRestTemplate * @@ -65,6 +65,14 @@ public class SentinelProtectInterceptor implements ClientHttpRequestInterceptor if (hostResource.equals(hostWithPathResource)) { entryWithPath = false; } + Method urlCleanerMethod = BlockClassRegistry.lookupUrlCleaner( + sentinelRestTemplate.urlCleanerClass(), + sentinelRestTemplate.urlCleaner()); + if (urlCleanerMethod != null) { + hostWithPathResource = (String) methodInvoke(urlCleanerMethod, + hostWithPathResource); + } + Entry hostEntry = null, hostWithPathEntry = null; ClientHttpResponse response = null; try { @@ -105,7 +113,7 @@ public class SentinelProtectInterceptor implements ClientHttpRequestInterceptor Method fallbackMethod = extractFallbackMethod(sentinelRestTemplate.fallback(), sentinelRestTemplate.fallbackClass()); if (fallbackMethod != null) { - return methodInvoke(fallbackMethod, args); + return (ClientHttpResponse) methodInvoke(fallbackMethod, args); } else { return new SentinelClientHttpResponse(); @@ -116,16 +124,16 @@ public class SentinelProtectInterceptor implements ClientHttpRequestInterceptor sentinelRestTemplate.blockHandler(), sentinelRestTemplate.blockHandlerClass()); if (blockHandler != null) { - return methodInvoke(blockHandler, args); + return (ClientHttpResponse) methodInvoke(blockHandler, args); } else { return new SentinelClientHttpResponse(); } } - private ClientHttpResponse methodInvoke(Method method, Object... args) { + private Object methodInvoke(Method method, Object... args) { try { - return (ClientHttpResponse) method.invoke(null, args); + return method.invoke(null, args); } catch (IllegalAccessException e) { throw new RuntimeException(e); diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpoint.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpoint.java index 37134329..0b6dcb46 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpoint.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpoint.java @@ -19,8 +19,6 @@ package com.alibaba.cloud.sentinel.endpoint; import java.util.HashMap; import java.util.Map; -import org.springframework.boot.actuate.endpoint.AbstractEndpoint; - import com.alibaba.cloud.sentinel.SentinelProperties; import com.alibaba.csp.sentinel.adapter.servlet.config.WebServletConfig; import com.alibaba.csp.sentinel.config.SentinelConfig; @@ -33,6 +31,8 @@ import com.alibaba.csp.sentinel.slots.system.SystemRuleManager; import com.alibaba.csp.sentinel.transport.config.TransportConfig; import com.alibaba.csp.sentinel.util.AppNameUtil; +import org.springframework.boot.actuate.endpoint.AbstractEndpoint; + /** * Endpoint for Sentinel, contains ans properties and rules * @author xiaojing diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpointAutoConfiguration.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpointAutoConfiguration.java index a663ba88..91c2c59d 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpointAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpointAutoConfiguration.java @@ -16,6 +16,8 @@ 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.ConditionalOnEnabledHealthIndicator; import org.springframework.boot.actuate.condition.ConditionalOnEnabledEndpoint; @@ -25,8 +27,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import com.alibaba.cloud.sentinel.SentinelProperties; - /** * @author hengyunabc */ diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicator.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicator.java index e5415047..72dc9bf9 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicator.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicator.java @@ -19,6 +19,12 @@ package com.alibaba.cloud.sentinel.endpoint; import java.util.HashMap; import java.util.Map; +import com.alibaba.cloud.sentinel.SentinelProperties; +import com.alibaba.csp.sentinel.datasource.AbstractDataSource; +import com.alibaba.csp.sentinel.heartbeat.HeartbeatSenderProvider; +import com.alibaba.csp.sentinel.transport.HeartbeatSender; +import com.alibaba.csp.sentinel.transport.config.TransportConfig; + import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.Health; @@ -26,12 +32,6 @@ import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.actuate.health.Status; import org.springframework.util.StringUtils; -import com.alibaba.cloud.sentinel.SentinelProperties; -import com.alibaba.csp.sentinel.datasource.AbstractDataSource; -import com.alibaba.csp.sentinel.heartbeat.HeartbeatSenderProvider; -import com.alibaba.csp.sentinel.transport.HeartbeatSender; -import com.alibaba.csp.sentinel.transport.config.TransportConfig; - /** * A {@link HealthIndicator} for Sentinel, which checks the status of Sentinel Dashboard * and DataSource. diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelFeign.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelFeign.java index 878387ad..e9367a60 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelFeign.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelFeign.java @@ -21,12 +21,6 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.Map; -import org.springframework.beans.BeansException; -import org.springframework.cloud.netflix.feign.FeignContext; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.util.ReflectionUtils; - import feign.Contract; import feign.Feign; import feign.InvocationHandlerFactory; @@ -34,6 +28,12 @@ import feign.Target; import feign.hystrix.FallbackFactory; import feign.hystrix.HystrixFeign; +import org.springframework.beans.BeansException; +import org.springframework.cloud.netflix.feign.FeignContext; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.util.ReflectionUtils; + /** * {@link Feign.Builder} like {@link HystrixFeign.Builder} * diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelFeignAutoConfiguration.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelFeignAutoConfiguration.java index 9989c996..5f393e6d 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelFeignAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelFeignAutoConfiguration.java @@ -16,6 +16,10 @@ package com.alibaba.cloud.sentinel.feign; +import com.alibaba.csp.sentinel.SphU; + +import feign.Feign; + import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -23,10 +27,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; -import com.alibaba.csp.sentinel.SphU; - -import feign.Feign; - /** * @author Jim */ diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelInvocationHandler.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelInvocationHandler.java index ef8c6c33..2693a796 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelInvocationHandler.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelInvocationHandler.java @@ -16,8 +16,6 @@ package com.alibaba.cloud.sentinel.feign; -import static feign.Util.checkNotNull; - import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -38,6 +36,8 @@ import feign.MethodMetadata; import feign.Target; import feign.hystrix.FallbackFactory; +import static feign.Util.checkNotNull; + /** * {@link InvocationHandler} handle invocation that protected by Sentinel * diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/rest/SentinelClientHttpResponse.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/rest/SentinelClientHttpResponse.java index a38084e3..36dcab4d 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/rest/SentinelClientHttpResponse.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/rest/SentinelClientHttpResponse.java @@ -24,14 +24,14 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate; +import com.alibaba.cloud.sentinel.custom.SentinelProtectInterceptor; + import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.AbstractClientHttpResponse; -import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate; -import com.alibaba.cloud.sentinel.custom.SentinelProtectInterceptor; - /** * Using by {@link SentinelRestTemplate} and {@link SentinelProtectInterceptor} * diff --git a/spring-cloud-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelAutoConfigurationTests.java b/spring-cloud-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelAutoConfigurationTests.java index 307489d9..5a51ce3f 100644 --- a/spring-cloud-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelAutoConfigurationTests.java +++ b/spring-cloud-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelAutoConfigurationTests.java @@ -16,11 +16,17 @@ package com.alibaba.cloud.sentinel; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate; +import com.alibaba.cloud.sentinel.custom.SentinelAutoConfiguration; +import com.alibaba.cloud.sentinel.custom.SentinelBeanPostProcessor; +import com.alibaba.cloud.sentinel.custom.SentinelProtectInterceptor; +import com.alibaba.cloud.sentinel.rest.SentinelClientHttpResponse; +import com.alibaba.csp.sentinel.slots.block.BlockException; import org.junit.After; import org.junit.Before; import org.junit.Test; + import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; @@ -31,12 +37,7 @@ import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.client.RestTemplate; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate; -import com.alibaba.cloud.sentinel.custom.SentinelAutoConfiguration; -import com.alibaba.cloud.sentinel.custom.SentinelBeanPostProcessor; -import com.alibaba.cloud.sentinel.custom.SentinelProtectInterceptor; -import com.alibaba.cloud.sentinel.rest.SentinelClientHttpResponse; -import com.alibaba.csp.sentinel.slots.block.BlockException; +import static org.assertj.core.api.Assertions.assertThat; /** * @author fangjian diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmAutoConfiguration.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmAutoConfiguration.java index ac82882f..a069add5 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmAutoConfiguration.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmAutoConfiguration.java @@ -16,6 +16,12 @@ package com.alibaba.alicloud.acm; +import com.alibaba.alicloud.acm.refresh.AcmContextRefresher; +import com.alibaba.alicloud.acm.refresh.AcmRefreshHistory; +import com.alibaba.alicloud.context.acm.AcmIntegrationProperties; + +import com.taobao.diamond.client.Diamond; + import org.springframework.beans.BeansException; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -25,12 +31,6 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.alicloud.acm.refresh.AcmContextRefresher; -import com.alibaba.alicloud.acm.refresh.AcmRefreshHistory; -import com.alibaba.alicloud.context.acm.AcmIntegrationProperties; - -import com.taobao.diamond.client.Diamond; - /** * Created on 01/10/2017. * diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmPropertySourceRepository.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmPropertySourceRepository.java index e16d686c..def27cf6 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmPropertySourceRepository.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/AcmPropertySourceRepository.java @@ -19,13 +19,13 @@ package com.alibaba.alicloud.acm; import java.util.ArrayList; import java.util.List; +import com.alibaba.alicloud.acm.bootstrap.AcmPropertySource; + import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.PropertySource; -import com.alibaba.alicloud.acm.bootstrap.AcmPropertySource; - /** * @author juven.xuxb, 5/17/16. */ diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceBuilder.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceBuilder.java index 5c45cfeb..75a1a514 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceBuilder.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceBuilder.java @@ -23,15 +23,16 @@ import java.util.HashMap; import java.util.Map; import java.util.Properties; +import com.alibaba.edas.acm.ConfigService; +import com.alibaba.edas.acm.exception.ConfigException; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.core.io.ByteArrayResource; import org.springframework.util.StringUtils; -import com.alibaba.edas.acm.ConfigService; -import com.alibaba.edas.acm.exception.ConfigException; - /** * @author juven.xuxb * @author xiaolongzuo diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceLocator.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceLocator.java index 3dae0710..a0c9fed6 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceLocator.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/bootstrap/AcmPropertySourceLocator.java @@ -16,6 +16,8 @@ package com.alibaba.alicloud.acm.bootstrap; +import com.alibaba.alicloud.context.acm.AcmIntegrationProperties; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.bootstrap.config.PropertySourceLocator; @@ -23,8 +25,6 @@ import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.Environment; import org.springframework.core.env.PropertySource; -import com.alibaba.alicloud.context.acm.AcmIntegrationProperties; - /** * @author juven.xuxb * @author xiaolongzuo diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpoint.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpoint.java index 7828e713..74f72377 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpoint.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpoint.java @@ -23,13 +23,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.springframework.boot.actuate.endpoint.AbstractEndpoint; - import com.alibaba.alicloud.acm.AcmPropertySourceRepository; import com.alibaba.alicloud.acm.bootstrap.AcmPropertySource; import com.alibaba.alicloud.acm.refresh.AcmRefreshHistory; import com.alibaba.alicloud.context.acm.AcmProperties; +import org.springframework.boot.actuate.endpoint.AbstractEndpoint; + /** * Created on 01/10/2017. * diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointAutoConfiguration.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointAutoConfiguration.java index b57c38c6..05008f70 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointAutoConfiguration.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointAutoConfiguration.java @@ -16,6 +16,10 @@ package com.alibaba.alicloud.acm.endpoint; +import com.alibaba.alicloud.acm.AcmPropertySourceRepository; +import com.alibaba.alicloud.acm.refresh.AcmRefreshHistory; +import com.alibaba.alicloud.context.acm.AcmProperties; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -23,10 +27,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.context.annotation.Bean; -import com.alibaba.alicloud.acm.AcmPropertySourceRepository; -import com.alibaba.alicloud.acm.refresh.AcmRefreshHistory; -import com.alibaba.alicloud.context.acm.AcmProperties; - /** * @author xiaojing */ diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmHealthIndicator.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmHealthIndicator.java index d172baa4..2c4095a8 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmHealthIndicator.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/endpoint/AcmHealthIndicator.java @@ -19,15 +19,15 @@ package com.alibaba.alicloud.acm.endpoint; import java.util.ArrayList; import java.util.List; -import org.springframework.boot.actuate.health.AbstractHealthIndicator; -import org.springframework.boot.actuate.health.Health; -import org.springframework.util.StringUtils; - import com.alibaba.alicloud.acm.AcmPropertySourceRepository; import com.alibaba.alicloud.acm.bootstrap.AcmPropertySource; import com.alibaba.alicloud.context.acm.AcmProperties; import com.alibaba.edas.acm.ConfigService; +import org.springframework.boot.actuate.health.AbstractHealthIndicator; +import org.springframework.boot.actuate.health.Health; +import org.springframework.util.StringUtils; + /** * @author leijuan * @author juven diff --git a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/refresh/AcmContextRefresher.java b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/refresh/AcmContextRefresher.java index c1637efd..282c0ef2 100644 --- a/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/refresh/AcmContextRefresher.java +++ b/spring-cloud-alicloud-acm/src/main/java/com/alibaba/alicloud/acm/refresh/AcmContextRefresher.java @@ -23,8 +23,14 @@ import java.security.NoSuchAlgorithmException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import com.alibaba.alicloud.acm.AcmPropertySourceRepository; +import com.alibaba.alicloud.context.acm.AcmIntegrationProperties; +import com.alibaba.edas.acm.ConfigService; +import com.alibaba.edas.acm.listener.ConfigChangeListener; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.beans.BeansException; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.cloud.context.refresh.ContextRefresher; @@ -34,11 +40,6 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; import org.springframework.util.StringUtils; -import com.alibaba.alicloud.acm.AcmPropertySourceRepository; -import com.alibaba.alicloud.context.acm.AcmIntegrationProperties; -import com.alibaba.edas.acm.ConfigService; -import com.alibaba.edas.acm.listener.ConfigChangeListener; - /** * On application start up, AcmContextRefresher add diamond listeners to all application * level dataIds, when there is a change in the data, listeners will refresh diff --git a/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/AcmConfigurationTests.java b/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/AcmConfigurationTests.java index 038983d9..db9cc369 100644 --- a/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/AcmConfigurationTests.java +++ b/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/AcmConfigurationTests.java @@ -16,14 +16,16 @@ package com.alibaba.alicloud.acm; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; - import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; +import com.alibaba.alicloud.acm.bootstrap.AcmPropertySourceLocator; +import com.alibaba.alicloud.acm.endpoint.AcmEndpointAutoConfiguration; +import com.alibaba.alicloud.context.acm.AcmContextBootstrapConfiguration; +import com.alibaba.alicloud.context.acm.AcmIntegrationProperties; +import com.alibaba.alicloud.context.acm.AcmProperties; +import com.alibaba.edas.acm.ConfigService; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -32,6 +34,7 @@ import org.powermock.api.support.MethodProxy; 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; @@ -40,12 +43,10 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.acm.bootstrap.AcmPropertySourceLocator; -import com.alibaba.alicloud.acm.endpoint.AcmEndpointAutoConfiguration; -import com.alibaba.alicloud.context.acm.AcmContextBootstrapConfiguration; -import com.alibaba.alicloud.context.acm.AcmIntegrationProperties; -import com.alibaba.alicloud.context.acm.AcmProperties; -import com.alibaba.edas.acm.ConfigService; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; /** * @author xiaojing diff --git a/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/AcmFileExtensionTest.java b/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/AcmFileExtensionTest.java index 52daad49..e3469efb 100644 --- a/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/AcmFileExtensionTest.java +++ b/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/AcmFileExtensionTest.java @@ -16,11 +16,13 @@ package com.alibaba.alicloud.acm; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; - import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; +import com.alibaba.alicloud.acm.endpoint.AcmEndpointAutoConfiguration; +import com.alibaba.alicloud.context.acm.AcmContextBootstrapConfiguration; +import com.alibaba.edas.acm.ConfigService; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -29,6 +31,7 @@ import org.powermock.api.support.MethodProxy; 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; @@ -37,9 +40,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.acm.endpoint.AcmEndpointAutoConfiguration; -import com.alibaba.alicloud.context.acm.AcmContextBootstrapConfiguration; -import com.alibaba.edas.acm.ConfigService; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; /** * @author xiaojing diff --git a/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/AcmGroupConfigurationTest.java b/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/AcmGroupConfigurationTest.java index ba25f8db..b6629dfa 100644 --- a/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/AcmGroupConfigurationTest.java +++ b/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/AcmGroupConfigurationTest.java @@ -16,11 +16,13 @@ package com.alibaba.alicloud.acm; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; - import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; +import com.alibaba.alicloud.acm.endpoint.AcmEndpointAutoConfiguration; +import com.alibaba.alicloud.context.acm.AcmContextBootstrapConfiguration; +import com.alibaba.edas.acm.ConfigService; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -29,6 +31,7 @@ import org.powermock.api.support.MethodProxy; 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; @@ -37,9 +40,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.acm.endpoint.AcmEndpointAutoConfiguration; -import com.alibaba.alicloud.context.acm.AcmContextBootstrapConfiguration; -import com.alibaba.edas.acm.ConfigService; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; /** * @author xiaojing diff --git a/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointTests.java b/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointTests.java index 36376ae9..0263c9a7 100644 --- a/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointTests.java +++ b/spring-cloud-alicloud-acm/src/test/java/com/alibaba/alicloud/acm/endpoint/AcmEndpointTests.java @@ -16,15 +16,19 @@ package com.alibaba.alicloud.acm.endpoint; -import static org.junit.Assert.assertEquals; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; - import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Map; +import com.alibaba.alicloud.acm.AcmAutoConfiguration; +import com.alibaba.alicloud.acm.AcmPropertySourceRepository; +import com.alibaba.alicloud.acm.refresh.AcmRefreshHistory; +import com.alibaba.alicloud.context.acm.AcmContextBootstrapConfiguration; +import com.alibaba.alicloud.context.acm.AcmProperties; +import com.alibaba.edas.acm.ConfigService; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -33,6 +37,7 @@ import org.powermock.api.support.MethodProxy; 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.actuate.health.Health.Builder; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -41,12 +46,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.acm.AcmAutoConfiguration; -import com.alibaba.alicloud.acm.AcmPropertySourceRepository; -import com.alibaba.alicloud.acm.refresh.AcmRefreshHistory; -import com.alibaba.alicloud.context.acm.AcmContextBootstrapConfiguration; -import com.alibaba.alicloud.context.acm.AcmProperties; -import com.alibaba.edas.acm.ConfigService; +import static org.junit.Assert.assertEquals; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; /** * @author xiaojing diff --git a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/AnsAutoConfiguration.java b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/AnsAutoConfiguration.java index f6818451..af36ce05 100644 --- a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/AnsAutoConfiguration.java +++ b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/AnsAutoConfiguration.java @@ -16,6 +16,11 @@ package com.alibaba.alicloud.ans; +import com.alibaba.alicloud.ans.registry.AnsAutoServiceRegistration; +import com.alibaba.alicloud.ans.registry.AnsRegistration; +import com.alibaba.alicloud.ans.registry.AnsServiceRegistry; +import com.alibaba.alicloud.context.ans.AnsProperties; + import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -28,11 +33,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.alicloud.ans.registry.AnsAutoServiceRegistration; -import com.alibaba.alicloud.ans.registry.AnsRegistration; -import com.alibaba.alicloud.ans.registry.AnsServiceRegistry; -import com.alibaba.alicloud.context.ans.AnsProperties; - /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/AnsDiscoveryClient.java b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/AnsDiscoveryClient.java index 7c3e90b4..bcd7e577 100644 --- a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/AnsDiscoveryClient.java +++ b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/AnsDiscoveryClient.java @@ -23,13 +23,13 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.discovery.DiscoveryClient; - import com.alibaba.alicloud.ans.registry.AnsRegistration; import com.alibaba.ans.core.NamingService; import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; + /** * @author xiaolongzuo * @author pbting diff --git a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/AnsDiscoveryClientAutoConfiguration.java b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/AnsDiscoveryClientAutoConfiguration.java index 40d6fd27..5cabd918 100644 --- a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/AnsDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/AnsDiscoveryClientAutoConfiguration.java @@ -16,6 +16,8 @@ package com.alibaba.alicloud.ans; +import com.alibaba.alicloud.ans.registry.AnsRegistration; + import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -24,8 +26,6 @@ import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAu import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.alicloud.ans.registry.AnsRegistration; - /** * @author xiaolongzuo * @author pbting diff --git a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/endpoint/AnsEndpoint.java b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/endpoint/AnsEndpoint.java index 091e5163..7f90c67b 100644 --- a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/endpoint/AnsEndpoint.java +++ b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/endpoint/AnsEndpoint.java @@ -21,14 +21,15 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.actuate.endpoint.AbstractEndpoint; - import com.alibaba.alicloud.context.ans.AnsProperties; import com.alibaba.ans.core.NamingService; import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.boot.actuate.endpoint.AbstractEndpoint; + /** * @author xiaolongzuo * @author pbting diff --git a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/endpoint/AnsEndpointAutoConfiguration.java b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/endpoint/AnsEndpointAutoConfiguration.java index 1c5b27f8..714df824 100644 --- a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/endpoint/AnsEndpointAutoConfiguration.java +++ b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/endpoint/AnsEndpointAutoConfiguration.java @@ -16,13 +16,13 @@ package com.alibaba.alicloud.ans.endpoint; +import com.alibaba.alicloud.context.ans.AnsProperties; + import org.springframework.boot.actuate.endpoint.AbstractEndpoint; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.context.annotation.Bean; -import com.alibaba.alicloud.context.ans.AnsProperties; - /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistration.java b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistration.java index 1126d960..b84cb826 100644 --- a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistration.java +++ b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistration.java @@ -18,6 +18,7 @@ package com.alibaba.alicloud.ans.registry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration; import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; diff --git a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/registry/AnsRegistration.java b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/registry/AnsRegistration.java index 13128e2d..3a89b4ee 100644 --- a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/registry/AnsRegistration.java +++ b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/registry/AnsRegistration.java @@ -21,6 +21,8 @@ import java.util.Map; import javax.annotation.PostConstruct; +import com.alibaba.alicloud.context.ans.AnsProperties; + import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.ManagementServerPortUtils; @@ -29,8 +31,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; -import com.alibaba.alicloud.context.ans.AnsProperties; - /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/registry/AnsServiceRegistry.java b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/registry/AnsServiceRegistry.java index fda95738..647ea12b 100644 --- a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/registry/AnsServiceRegistry.java +++ b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/registry/AnsServiceRegistry.java @@ -20,13 +20,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import com.alibaba.ans.core.NamingService; +import com.alibaba.ans.shaded.com.taobao.vipserver.client.ipms.NodeReactor; + import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.cloud.client.serviceregistry.ServiceRegistry; -import com.alibaba.ans.core.NamingService; -import com.alibaba.ans.shaded.com.taobao.vipserver.client.ipms.NodeReactor; +import org.springframework.cloud.client.serviceregistry.ServiceRegistry; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/ribbon/AnsRibbonClientConfiguration.java b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/ribbon/AnsRibbonClientConfiguration.java index 59ba3fa6..afde04b6 100644 --- a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/ribbon/AnsRibbonClientConfiguration.java +++ b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/ribbon/AnsRibbonClientConfiguration.java @@ -16,13 +16,13 @@ package com.alibaba.alicloud.ans.ribbon; +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.ServerList; + import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.ServerList; - /** * @author xiaolongzuo * @author pbting diff --git a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/ribbon/RibbonAnsAutoConfiguration.java b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/ribbon/RibbonAnsAutoConfiguration.java index 5c4ddb88..e73052d5 100644 --- a/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/ribbon/RibbonAnsAutoConfiguration.java +++ b/spring-cloud-alicloud-ans/src/main/java/com/alibaba/alicloud/ans/ribbon/RibbonAnsAutoConfiguration.java @@ -16,6 +16,8 @@ package com.alibaba.alicloud.ans.ribbon; +import com.alibaba.alicloud.ans.ConditionalOnAnsEnabled; + import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -24,8 +26,6 @@ import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.context.annotation.Configuration; -import com.alibaba.alicloud.ans.ConditionalOnAnsEnabled; - /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/AnsDiscoveryClientTests.java b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/AnsDiscoveryClientTests.java index 2922e244..28d70925 100644 --- a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/AnsDiscoveryClientTests.java +++ b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/AnsDiscoveryClientTests.java @@ -16,28 +16,29 @@ package com.alibaba.alicloud.ans; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; +import com.alibaba.alicloud.ans.registry.AnsRegistration; +import com.alibaba.alicloud.ans.test.AnsMockTest; +import com.alibaba.ans.core.NamingService; +import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; + import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; + import org.springframework.cloud.client.ServiceInstance; -import com.alibaba.alicloud.ans.registry.AnsRegistration; -import com.alibaba.alicloud.ans.test.AnsMockTest; -import com.alibaba.ans.core.NamingService; -import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; /** * @author xiaojing diff --git a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationEnabledTests.java b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationEnabledTests.java index 21c78b6b..8ebd43e8 100644 --- a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationEnabledTests.java +++ b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationEnabledTests.java @@ -16,12 +16,13 @@ package com.alibaba.alicloud.ans.registry; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import com.alibaba.alicloud.ans.AnsAutoConfiguration; +import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; +import com.alibaba.alicloud.context.ans.AnsProperties; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -30,9 +31,9 @@ import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationC import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.ans.AnsAutoConfiguration; -import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; -import com.alibaba.alicloud.context.ans.AnsProperties; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author xiaojing diff --git a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationIpNetworkInterfaceTests.java b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationIpNetworkInterfaceTests.java index ebfbf090..4211aec8 100644 --- a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationIpNetworkInterfaceTests.java +++ b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationIpNetworkInterfaceTests.java @@ -16,17 +16,18 @@ package com.alibaba.alicloud.ans.registry; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; - import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumeration; +import com.alibaba.alicloud.ans.AnsAutoConfiguration; +import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; +import com.alibaba.alicloud.context.ans.AnsProperties; + import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -36,9 +37,9 @@ import org.springframework.cloud.commons.util.InetUtils; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.ans.AnsAutoConfiguration; -import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; -import com.alibaba.alicloud.context.ans.AnsProperties; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author xiaojing diff --git a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationIpTests.java b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationIpTests.java index ed185a98..7386fbb8 100644 --- a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationIpTests.java +++ b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationIpTests.java @@ -16,12 +16,13 @@ package com.alibaba.alicloud.ans.registry; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import com.alibaba.alicloud.ans.AnsAutoConfiguration; +import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; +import com.alibaba.alicloud.context.ans.AnsProperties; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -30,9 +31,9 @@ import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationC import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.ans.AnsAutoConfiguration; -import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; -import com.alibaba.alicloud.context.ans.AnsProperties; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author xiaojing diff --git a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationManagementPortTests.java b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationManagementPortTests.java index e1df53e2..717a2c1c 100644 --- a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationManagementPortTests.java +++ b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationManagementPortTests.java @@ -16,14 +16,13 @@ package com.alibaba.alicloud.ans.registry; -import static com.alibaba.alicloud.ans.registry.AnsRegistration.MANAGEMENT_CONTEXT_PATH; -import static com.alibaba.alicloud.ans.registry.AnsRegistration.MANAGEMENT_PORT; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import com.alibaba.alicloud.ans.AnsAutoConfiguration; +import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; +import com.alibaba.alicloud.context.ans.AnsProperties; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -32,9 +31,11 @@ import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationC import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.ans.AnsAutoConfiguration; -import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; -import com.alibaba.alicloud.context.ans.AnsProperties; +import static com.alibaba.alicloud.ans.registry.AnsRegistration.MANAGEMENT_CONTEXT_PATH; +import static com.alibaba.alicloud.ans.registry.AnsRegistration.MANAGEMENT_PORT; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author xiaojing diff --git a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationPortTests.java b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationPortTests.java index 46ed81b2..4d3fa817 100644 --- a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationPortTests.java +++ b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationPortTests.java @@ -16,12 +16,13 @@ package com.alibaba.alicloud.ans.registry; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import com.alibaba.alicloud.ans.AnsAutoConfiguration; +import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; +import com.alibaba.alicloud.context.ans.AnsProperties; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -30,9 +31,9 @@ import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationC import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.ans.AnsAutoConfiguration; -import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; -import com.alibaba.alicloud.context.ans.AnsProperties; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author xiaojing diff --git a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationTests.java b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationTests.java index 4d610f8d..1f65808e 100644 --- a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationTests.java +++ b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/registry/AnsAutoServiceRegistrationTests.java @@ -16,18 +16,21 @@ package com.alibaba.alicloud.ans.registry; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; - import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import com.alibaba.alicloud.ans.AnsAutoConfiguration; +import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; +import com.alibaba.alicloud.ans.endpoint.AnsEndpoint; +import com.alibaba.alicloud.context.ans.AnsProperties; +import com.alibaba.ans.core.NamingService; +import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; + import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -38,12 +41,10 @@ import org.springframework.cloud.commons.util.InetUtils; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.ans.AnsAutoConfiguration; -import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; -import com.alibaba.alicloud.ans.endpoint.AnsEndpoint; -import com.alibaba.alicloud.context.ans.AnsProperties; -import com.alibaba.ans.core.NamingService; -import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author xiaojing diff --git a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/ribbon/AnsRibbonClientConfigurationTests.java b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/ribbon/AnsRibbonClientConfigurationTests.java index f5d1587e..b1470c00 100644 --- a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/ribbon/AnsRibbonClientConfigurationTests.java +++ b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/ribbon/AnsRibbonClientConfigurationTests.java @@ -16,11 +16,14 @@ package com.alibaba.alicloud.ans.ribbon; -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import com.alibaba.alicloud.ans.AnsAutoConfiguration; +import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; +import com.netflix.client.config.DefaultClientConfigImpl; +import com.netflix.client.config.IClientConfig; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -32,11 +35,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.client.RestTemplate; -import com.alibaba.alicloud.ans.AnsAutoConfiguration; -import com.alibaba.alicloud.ans.AnsDiscoveryClientAutoConfiguration; - -import com.netflix.client.config.DefaultClientConfigImpl; -import com.netflix.client.config.IClientConfig; +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author xiaojing diff --git a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/ribbon/AnsServerListTests.java b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/ribbon/AnsServerListTests.java index 3c8cdef0..9331e322 100644 --- a/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/ribbon/AnsServerListTests.java +++ b/spring-cloud-alicloud-ans/src/test/java/com/alibaba/alicloud/ans/ribbon/AnsServerListTests.java @@ -16,29 +16,28 @@ package com.alibaba.alicloud.ans.ribbon; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import com.alibaba.alicloud.ans.test.AnsMockTest; +import com.alibaba.ans.core.NamingService; +import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; + +import com.netflix.client.config.IClientConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; -import com.alibaba.alicloud.ans.test.AnsMockTest; -import com.alibaba.ans.core.NamingService; -import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; - -import com.netflix.client.config.IClientConfig; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; /** * @author xiaojing diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/AliCloudProperties.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/AliCloudProperties.java index a43c695d..1b498c96 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/AliCloudProperties.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/AliCloudProperties.java @@ -16,10 +16,10 @@ package com.alibaba.alicloud.context; -import org.springframework.boot.context.properties.ConfigurationProperties; - import com.alibaba.cloud.context.AliCloudConfiguration; +import org.springframework.boot.context.properties.ConfigurationProperties; + /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/acm/AcmContextBootstrapConfiguration.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/acm/AcmContextBootstrapConfiguration.java index 0be77f62..16605a70 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/acm/AcmContextBootstrapConfiguration.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/acm/AcmContextBootstrapConfiguration.java @@ -18,6 +18,11 @@ package com.alibaba.alicloud.context.acm; import javax.annotation.PostConstruct; +import com.alibaba.alicloud.context.AliCloudProperties; +import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; +import com.alibaba.alicloud.context.edas.EdasProperties; +import com.alibaba.cloud.context.acm.AliCloudAcmInitializer; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -28,11 +33,6 @@ import org.springframework.core.env.Environment; import org.springframework.util.Assert; import org.springframework.util.StringUtils; -import com.alibaba.alicloud.context.AliCloudProperties; -import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; -import com.alibaba.alicloud.context.edas.EdasProperties; -import com.alibaba.cloud.context.acm.AliCloudAcmInitializer; - /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/acm/AcmProperties.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/acm/AcmProperties.java index f66ba230..48a50f7d 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/acm/AcmProperties.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/acm/AcmProperties.java @@ -16,11 +16,11 @@ package com.alibaba.alicloud.context.acm; -import org.springframework.boot.context.properties.ConfigurationProperties; - import com.alibaba.cloud.context.AliCloudServerMode; import com.alibaba.cloud.context.acm.AcmConfiguration; +import org.springframework.boot.context.properties.ConfigurationProperties; + /** * acm properties * diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/ans/AnsContextApplicationListener.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/ans/AnsContextApplicationListener.java index 6d028331..415e2a47 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/ans/AnsContextApplicationListener.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/ans/AnsContextApplicationListener.java @@ -16,15 +16,15 @@ package com.alibaba.alicloud.context.ans; -import org.springframework.context.ApplicationContext; -import org.springframework.context.event.ContextRefreshedEvent; - import com.alibaba.alicloud.context.AliCloudProperties; import com.alibaba.alicloud.context.edas.EdasProperties; import com.alibaba.alicloud.context.listener.AbstractOnceApplicationListener; import com.alibaba.cloud.context.ans.AliCloudAnsInitializer; import com.alibaba.cloud.context.edas.AliCloudEdasSdk; +import org.springframework.context.ApplicationContext; +import org.springframework.context.event.ContextRefreshedEvent; + /** * Init {@link com.alibaba.ans.core.NamingService} properties. * diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/ans/AnsContextAutoConfiguration.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/ans/AnsContextAutoConfiguration.java index b51fb165..211cee0b 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/ans/AnsContextAutoConfiguration.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/ans/AnsContextAutoConfiguration.java @@ -16,6 +16,8 @@ package com.alibaba.alicloud.context.ans; +import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; + import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -25,8 +27,6 @@ import org.springframework.cloud.commons.util.InetUtilsProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; - /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/ans/AnsProperties.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/ans/AnsProperties.java index 99aa4a69..5a541cbf 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/ans/AnsProperties.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/ans/AnsProperties.java @@ -26,15 +26,15 @@ import java.util.Map; import javax.annotation.PostConstruct; +import com.alibaba.cloud.context.AliCloudServerMode; +import com.alibaba.cloud.context.ans.AnsConfiguration; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.commons.util.InetUtils; import org.springframework.util.StringUtils; -import com.alibaba.cloud.context.AliCloudServerMode; -import com.alibaba.cloud.context.ans.AnsConfiguration; - /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/edas/EdasContextAutoConfiguration.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/edas/EdasContextAutoConfiguration.java index 61a8e1da..dcf9f28b 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/edas/EdasContextAutoConfiguration.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/edas/EdasContextAutoConfiguration.java @@ -16,6 +16,11 @@ package com.alibaba.alicloud.context.edas; +import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; +import com.alibaba.alicloud.context.AliCloudProperties; +import com.alibaba.cloud.context.edas.AliCloudEdasSdk; +import com.alibaba.cloud.context.edas.AliCloudEdasSdkFactory; + import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -23,11 +28,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; -import com.alibaba.alicloud.context.AliCloudProperties; -import com.alibaba.cloud.context.edas.AliCloudEdasSdk; -import com.alibaba.cloud.context.edas.AliCloudEdasSdkFactory; - /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/edas/EdasProperties.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/edas/EdasProperties.java index c34979c9..2c99b417 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/edas/EdasProperties.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/edas/EdasProperties.java @@ -16,11 +16,11 @@ package com.alibaba.alicloud.context.edas; +import com.alibaba.cloud.context.edas.EdasConfiguration; + import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; -import com.alibaba.cloud.context.edas.EdasConfiguration; - /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/nacos/NacosConfigParameterInitListener.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/nacos/NacosConfigParameterInitListener.java index c6b5b590..532dc01c 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/nacos/NacosConfigParameterInitListener.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/nacos/NacosConfigParameterInitListener.java @@ -1,13 +1,14 @@ package com.alibaba.alicloud.context.nacos; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; - import com.alibaba.alicloud.context.listener.AbstractOnceApplicationListener; import com.alibaba.cloud.context.edas.EdasChangeOrderConfiguration; import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; + /** * @author pbting */ diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/nacos/NacosDiscoveryParameterInitListener.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/nacos/NacosDiscoveryParameterInitListener.java index 24758c9d..d17bf952 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/nacos/NacosDiscoveryParameterInitListener.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/nacos/NacosDiscoveryParameterInitListener.java @@ -17,14 +17,15 @@ package com.alibaba.alicloud.context.nacos; import java.util.Properties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; - import com.alibaba.alicloud.context.listener.AbstractOnceApplicationListener; import com.alibaba.cloud.context.edas.EdasChangeOrderConfiguration; import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; + /** * @author pbting * @date 2019-02-14 11:12 AM diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/oss/OssContextAutoConfiguration.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/oss/OssContextAutoConfiguration.java index 6015088b..ca7525fe 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/oss/OssContextAutoConfiguration.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/oss/OssContextAutoConfiguration.java @@ -16,6 +16,13 @@ package com.alibaba.alicloud.context.oss; +import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; +import com.alibaba.alicloud.context.AliCloudProperties; +import com.alibaba.cloud.context.AliCloudAuthorizationMode; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; + import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -26,13 +33,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.util.Assert; import org.springframework.util.StringUtils; -import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; -import com.alibaba.alicloud.context.AliCloudProperties; -import com.alibaba.cloud.context.AliCloudAuthorizationMode; - -import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSClientBuilder; - /** * OSS Auto {@link Configuration} * diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/oss/OssProperties.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/oss/OssProperties.java index a261e6ad..33c46092 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/oss/OssProperties.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/oss/OssProperties.java @@ -16,13 +16,13 @@ package com.alibaba.alicloud.context.oss; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; - import com.alibaba.cloud.context.AliCloudAuthorizationMode; import com.aliyun.oss.ClientBuilderConfiguration; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; + /** * {@link ConfigurationProperties} for configuring OSS. * diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/scx/ScxContextAutoConfiguration.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/scx/ScxContextAutoConfiguration.java index 69504bb9..7b154521 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/scx/ScxContextAutoConfiguration.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/scx/ScxContextAutoConfiguration.java @@ -16,6 +16,13 @@ package com.alibaba.alicloud.context.scx; +import com.alibaba.alicloud.context.AliCloudProperties; +import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; +import com.alibaba.alicloud.context.edas.EdasProperties; +import com.alibaba.cloud.context.edas.AliCloudEdasSdk; +import com.alibaba.cloud.context.scx.AliCloudScxInitializer; +import com.alibaba.edas.schedulerx.SchedulerXClient; + import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -24,13 +31,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.alicloud.context.AliCloudProperties; -import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; -import com.alibaba.alicloud.context.edas.EdasProperties; -import com.alibaba.cloud.context.edas.AliCloudEdasSdk; -import com.alibaba.cloud.context.scx.AliCloudScxInitializer; -import com.alibaba.edas.schedulerx.SchedulerXClient; - /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/scx/ScxProperties.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/scx/ScxProperties.java index e0671705..93002ce3 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/scx/ScxProperties.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/scx/ScxProperties.java @@ -16,10 +16,10 @@ package com.alibaba.alicloud.context.scx; -import org.springframework.boot.context.properties.ConfigurationProperties; - import com.alibaba.cloud.context.scx.ScxConfiguration; +import org.springframework.boot.context.properties.ConfigurationProperties; + /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/statistics/StatisticsTaskStarter.java b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/statistics/StatisticsTaskStarter.java index c3e64a66..fbb81e23 100644 --- a/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/statistics/StatisticsTaskStarter.java +++ b/spring-cloud-alicloud-context/src/main/java/com/alibaba/alicloud/context/statistics/StatisticsTaskStarter.java @@ -19,11 +19,6 @@ package com.alibaba.alicloud.context.statistics; import java.util.ArrayList; import java.util.List; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.context.annotation.Configuration; - import com.alibaba.alicloud.context.acm.AcmContextBootstrapConfiguration; import com.alibaba.alicloud.context.acm.AcmProperties; import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; @@ -37,6 +32,11 @@ import com.alibaba.cloud.context.AliCloudServerMode; import com.alibaba.cloud.context.edas.AliCloudEdasSdk; import com.alibaba.cloud.context.statistics.StatisticsTask; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.context.annotation.Configuration; + /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/AliCloudPropertiesDefaultTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/AliCloudPropertiesDefaultTests.java index 7c33701b..6b566106 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/AliCloudPropertiesDefaultTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/AliCloudPropertiesDefaultTests.java @@ -16,16 +16,17 @@ package com.alibaba.alicloud.context; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; +import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; -import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/AliCloudPropertiesLoadTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/AliCloudPropertiesLoadTests.java index 04f0c653..40e752dd 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/AliCloudPropertiesLoadTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/AliCloudPropertiesLoadTests.java @@ -16,16 +16,17 @@ package com.alibaba.alicloud.context; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; +import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; -import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/BaseAliCloudSpringApplication.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/BaseAliCloudSpringApplication.java index 72fe9d28..7cd533bf 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/BaseAliCloudSpringApplication.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/BaseAliCloudSpringApplication.java @@ -20,6 +20,7 @@ import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunnerDelegate; + import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmIntegrationPropertiesLoad2Tests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmIntegrationPropertiesLoad2Tests.java index 249a2a1a..bf29f0ef 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmIntegrationPropertiesLoad2Tests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmIntegrationPropertiesLoad2Tests.java @@ -16,17 +16,18 @@ package com.alibaba.alicloud.context.acm; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; +import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; +import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; -import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; -import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmIntegrationPropertiesLoadTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmIntegrationPropertiesLoadTests.java index b5a42209..9b3814b4 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmIntegrationPropertiesLoadTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmIntegrationPropertiesLoadTests.java @@ -16,17 +16,18 @@ package com.alibaba.alicloud.context.acm; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; +import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; +import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; -import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; -import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmPropertiesDefaultTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmPropertiesDefaultTests.java index 48cb94bf..66971a66 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmPropertiesDefaultTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmPropertiesDefaultTests.java @@ -16,19 +16,20 @@ package com.alibaba.alicloud.context.acm; -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; import com.alibaba.cloud.context.AliCloudServerMode; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmPropertiesLoadTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmPropertiesLoadTests.java index cd06ac38..5fd9d1c3 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmPropertiesLoadTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/acm/AcmPropertiesLoadTests.java @@ -16,19 +16,20 @@ package com.alibaba.alicloud.context.acm; -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; import com.alibaba.cloud.context.AliCloudServerMode; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/ans/AnsContextApplicationListenerTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/ans/AnsContextApplicationListenerTests.java index 2eabf2d6..72a839dc 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/ans/AnsContextApplicationListenerTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/ans/AnsContextApplicationListenerTests.java @@ -16,11 +16,11 @@ package com.alibaba.alicloud.context.ans; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.alicloud.context.BaseAliCloudSpringApplication; import org.junit.Test; -import com.alibaba.alicloud.context.BaseAliCloudSpringApplication; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/ans/AnsPropertiesDefaultTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/ans/AnsPropertiesDefaultTests.java index 9fc37b77..19fc5aa2 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/ans/AnsPropertiesDefaultTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/ans/AnsPropertiesDefaultTests.java @@ -16,15 +16,16 @@ package com.alibaba.alicloud.context.ans; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.cloud.context.AliCloudServerMode; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.cloud.context.AliCloudServerMode; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/ans/AnsPropertiesLoadTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/ans/AnsPropertiesLoadTests.java index 5413f66a..50ea313f 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/ans/AnsPropertiesLoadTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/ans/AnsPropertiesLoadTests.java @@ -16,22 +16,6 @@ package com.alibaba.alicloud.context.ans; -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -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.AutoConfigureBefore; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.junit4.SpringRunner; - import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; import com.alibaba.cloud.context.AliCloudServerMode; @@ -40,6 +24,22 @@ import com.alibaba.cloud.context.edas.AliCloudEdasSdk; import com.aliyuncs.edas.model.v20170801.GetSecureTokenResponse; import com.aliyuncs.edas.model.v20170801.InsertApplicationResponse; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +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.AutoConfigureBefore; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/edas/EdasPropertiesDefaultTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/edas/EdasPropertiesDefaultTests.java index b200618a..e21f8461 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/edas/EdasPropertiesDefaultTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/edas/EdasPropertiesDefaultTests.java @@ -16,16 +16,17 @@ package com.alibaba.alicloud.context.edas; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; +import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; -import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/edas/EdasPropertiesLoad2Tests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/edas/EdasPropertiesLoad2Tests.java index 1015a7d9..5bb5bd20 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/edas/EdasPropertiesLoad2Tests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/edas/EdasPropertiesLoad2Tests.java @@ -16,16 +16,17 @@ package com.alibaba.alicloud.context.edas; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; +import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; -import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/edas/EdasPropertiesLoadTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/edas/EdasPropertiesLoadTests.java index 3d296e69..be5eee62 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/edas/EdasPropertiesLoadTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/edas/EdasPropertiesLoadTests.java @@ -16,16 +16,17 @@ package com.alibaba.alicloud.context.edas; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; +import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; -import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/nacos/NacosConfigParameterInitListenerTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/nacos/NacosConfigParameterInitListenerTests.java index 5b8a82af..d4723a92 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/nacos/NacosConfigParameterInitListenerTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/nacos/NacosConfigParameterInitListenerTests.java @@ -16,16 +16,16 @@ package com.alibaba.alicloud.context.nacos; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.alicloud.context.BaseAliCloudSpringApplication; +import com.alibaba.alicloud.utils.ChangeOrderUtils; +import com.alibaba.cloud.context.ans.AliCloudAnsInitializer; +import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory; import org.junit.BeforeClass; import org.junit.Test; import org.powermock.core.classloader.annotations.PrepareForTest; -import com.alibaba.alicloud.context.BaseAliCloudSpringApplication; -import com.alibaba.alicloud.utils.ChangeOrderUtils; -import com.alibaba.cloud.context.ans.AliCloudAnsInitializer; -import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/nacos/NacosDiscoveryParameterInitListenerTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/nacos/NacosDiscoveryParameterInitListenerTests.java index 923fdcfd..4b714f4d 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/nacos/NacosDiscoveryParameterInitListenerTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/nacos/NacosDiscoveryParameterInitListenerTests.java @@ -16,16 +16,16 @@ package com.alibaba.alicloud.context.nacos; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.alicloud.context.BaseAliCloudSpringApplication; +import com.alibaba.alicloud.utils.ChangeOrderUtils; +import com.alibaba.cloud.context.ans.AliCloudAnsInitializer; +import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory; import org.junit.BeforeClass; import org.junit.Test; import org.powermock.core.classloader.annotations.PrepareForTest; -import com.alibaba.alicloud.context.BaseAliCloudSpringApplication; -import com.alibaba.alicloud.utils.ChangeOrderUtils; -import com.alibaba.cloud.context.ans.AliCloudAnsInitializer; -import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/oss/OssLoadTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/oss/OssLoadTests.java index d82cb3ee..f6ddd32a 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/oss/OssLoadTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/oss/OssLoadTests.java @@ -16,20 +16,20 @@ package com.alibaba.alicloud.context.oss; -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; import com.alibaba.alicloud.context.AliCloudProperties; import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; import com.aliyun.oss.OSSClient; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/scx/ScxPropertiesLoadTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/scx/ScxPropertiesLoadTests.java index 6cb1b207..90c3e740 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/scx/ScxPropertiesLoadTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/scx/ScxPropertiesLoadTests.java @@ -16,19 +16,20 @@ package com.alibaba.alicloud.context.scx; -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; import com.alibaba.alicloud.context.edas.EdasProperties; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/sms/SmsPropertiesDefaultTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/sms/SmsPropertiesDefaultTests.java index 909a6057..95df79fa 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/sms/SmsPropertiesDefaultTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/sms/SmsPropertiesDefaultTests.java @@ -16,12 +16,13 @@ package com.alibaba.alicloud.context.sms; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.alicloud.context.BaseAliCloudSpringApplication; import org.junit.Test; + import org.springframework.beans.factory.annotation.Autowired; -import com.alibaba.alicloud.context.BaseAliCloudSpringApplication; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/sms/SmsPropertiesLoadTests.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/sms/SmsPropertiesLoadTests.java index c2f1a410..f668c17e 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/sms/SmsPropertiesLoadTests.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/context/sms/SmsPropertiesLoadTests.java @@ -16,17 +16,18 @@ package com.alibaba.alicloud.context.sms; -import static org.assertj.core.api.Assertions.assertThat; +import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; +import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; +import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.alibaba.alicloud.context.AliCloudContextAutoConfiguration; -import com.alibaba.alicloud.context.ans.AnsContextAutoConfiguration; -import com.alibaba.alicloud.context.edas.EdasContextAutoConfiguration; +import static org.assertj.core.api.Assertions.assertThat; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/utils/ChangeOrderUtils.java b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/utils/ChangeOrderUtils.java index 316f1758..f03bd41f 100644 --- a/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/utils/ChangeOrderUtils.java +++ b/spring-cloud-alicloud-context/src/test/java/com/alibaba/alicloud/utils/ChangeOrderUtils.java @@ -16,11 +16,11 @@ package com.alibaba.alicloud.utils; -import org.powermock.api.mockito.PowerMockito; - import com.alibaba.cloud.context.edas.EdasChangeOrderConfiguration; import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory; +import org.powermock.api.mockito.PowerMockito; + /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/OssApplicationListener.java b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/OssApplicationListener.java index 61e26df3..0108f95e 100644 --- a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/OssApplicationListener.java +++ b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/OssApplicationListener.java @@ -18,13 +18,13 @@ package com.alibaba.alicloud.oss; import java.util.Map; +import com.aliyun.oss.OSS; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextClosedEvent; -import com.aliyun.oss.OSS; - /** * Shutdown All OSS Clients when {@code ApplicationContext} gets closed * {@link ApplicationListener} diff --git a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/OssAutoConfiguration.java b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/OssAutoConfiguration.java index 0cbf049e..d8fd479d 100644 --- a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/OssAutoConfiguration.java +++ b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/OssAutoConfiguration.java @@ -16,16 +16,16 @@ package com.alibaba.alicloud.oss; +import com.alibaba.alicloud.oss.resource.OssStorageProtocolResolver; + +import com.aliyun.oss.OSS; + import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.alicloud.oss.resource.OssStorageProtocolResolver; - -import com.aliyun.oss.OSS; - /** * OSS Auto {@link Configuration} * diff --git a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/OssConstants.java b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/OssConstants.java index d018b892..8bee73f6 100644 --- a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/OssConstants.java +++ b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/OssConstants.java @@ -17,13 +17,29 @@ package com.alibaba.alicloud.oss; /** - * OSS constants + * OSS constants. * * @author Jim */ -public interface OssConstants { +public final class OssConstants { - String PREFIX = "spring.cloud.alibaba.oss"; - String ENABLED = PREFIX + ".enabled"; + /** + * Prefix of OSSConfigurationProperties. + */ + public static final String PREFIX = "spring.cloud.alibaba.oss"; + + /** + * Enable OSS. + */ + public static final String ENABLED = PREFIX + ".enabled"; + + /** + * OSS ThreadPool bean name. + */ + public static final String OSS_TASK_EXECUTOR_BEAN_NAME = "ossTaskExecutor"; + + private OssConstants() { + throw new AssertionError("Must not instantiate constant utility class"); + } } diff --git a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/endpoint/OssEndpoint.java b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/endpoint/OssEndpoint.java index 1e9caedb..c6ff8891 100644 --- a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/endpoint/OssEndpoint.java +++ b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/endpoint/OssEndpoint.java @@ -21,12 +21,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.aliyun.oss.OSSClient; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.endpoint.AbstractEndpoint; import org.springframework.context.ApplicationContext; -import com.aliyun.oss.OSSClient; - /** * Actuator Endpoint to expose OSS Meta Data * diff --git a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/endpoint/OssEndpointAutoConfiguration.java b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/endpoint/OssEndpointAutoConfiguration.java index c4003ed7..6c79d2b7 100644 --- a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/endpoint/OssEndpointAutoConfiguration.java +++ b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/endpoint/OssEndpointAutoConfiguration.java @@ -16,6 +16,8 @@ package com.alibaba.alicloud.oss.endpoint; +import com.alibaba.alicloud.context.oss.OssProperties; + import org.springframework.boot.actuate.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -24,8 +26,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.alicloud.context.oss.OssProperties; - /** * OSS {@link Endpoint} Auto-{@link Configuration} * diff --git a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/resource/OssStorageProtocolResolver.java b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/resource/OssStorageProtocolResolver.java index 2d1f2d50..0a372e1d 100644 --- a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/resource/OssStorageProtocolResolver.java +++ b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/resource/OssStorageProtocolResolver.java @@ -16,8 +16,10 @@ package com.alibaba.alicloud.oss.resource; +import com.aliyun.oss.OSS; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; @@ -27,8 +29,6 @@ import org.springframework.core.io.ProtocolResolver; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; -import com.aliyun.oss.OSS; - /** * A {@link ProtocolResolver} implementation for the {@code oss://} protocol. * @@ -37,6 +37,9 @@ import com.aliyun.oss.OSS; public class OssStorageProtocolResolver implements ProtocolResolver, BeanFactoryPostProcessor, ResourceLoaderAware { + /** + * protocol of oss resource. + */ public static final String PROTOCOL = "oss://"; private static final Logger log = LoggerFactory @@ -63,7 +66,7 @@ public class OssStorageProtocolResolver if (!location.startsWith(PROTOCOL)) { return null; } - return new OssStorageResource(getOSS(), location); + return new OssStorageResource(getOSS(), location, beanFactory); } @Override @@ -82,4 +85,5 @@ public class OssStorageProtocolResolver throws BeansException { this.beanFactory = beanFactory; } + } diff --git a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/resource/OssStorageResource.java b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/resource/OssStorageResource.java index a7308fdc..bfb98e58 100644 --- a/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/resource/OssStorageResource.java +++ b/spring-cloud-alicloud-oss/src/main/java/com/alibaba/alicloud/oss/resource/OssStorageResource.java @@ -20,19 +20,29 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.List; - -import org.springframework.core.io.Resource; -import org.springframework.util.Assert; +import java.util.concurrent.ExecutorService; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.Bucket; import com.aliyun.oss.model.OSSObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.core.io.Resource; +import org.springframework.core.io.WritableResource; +import org.springframework.util.Assert; + +import static com.alibaba.alicloud.oss.OssConstants.OSS_TASK_EXECUTOR_BEAN_NAME; /** * Implements {@link Resource} for reading and writing objects in Aliyun Object Storage @@ -44,18 +54,40 @@ import com.aliyun.oss.model.OSSObject; * @see Bucket * @see OSSObject */ -public class OssStorageResource implements Resource { +public class OssStorageResource implements WritableResource { + + private static final Logger logger = LoggerFactory + .getLogger(OssStorageResource.class); + + private static final String MESSAGE_KEY_NOT_EXIST = "The specified key does not exist."; private final OSS oss; + private final String bucketName; + private final String objectKey; + private final URI location; - public OssStorageResource(OSS oss, String location) { + private final boolean autoCreateFiles; + + private final ExecutorService ossTaskExecutor; + + private final ConfigurableListableBeanFactory beanFactory; + + public OssStorageResource(OSS oss, String location, + ConfigurableListableBeanFactory beanFactory) { + this(oss, location, beanFactory, false); + } + + public OssStorageResource(OSS oss, String location, + ConfigurableListableBeanFactory beanFactory, boolean autoCreateFiles) { Assert.notNull(oss, "Object Storage Service can not be null"); Assert.isTrue(location.startsWith(OssStorageProtocolResolver.PROTOCOL), "Location must start with " + OssStorageProtocolResolver.PROTOCOL); this.oss = oss; + this.autoCreateFiles = autoCreateFiles; + this.beanFactory = beanFactory; try { URI locationUri = new URI(location); this.bucketName = locationUri.getAuthority(); @@ -71,6 +103,13 @@ public class OssStorageResource implements Resource { catch (URISyntaxException e) { throw new IllegalArgumentException("Invalid location: " + location, e); } + + this.ossTaskExecutor = this.beanFactory.getBean(OSS_TASK_EXECUTOR_BEAN_NAME, + ExecutorService.class); + } + + public boolean isAutoCreateFiles() { + return this.autoCreateFiles; } @Override @@ -136,7 +175,7 @@ public class OssStorageResource implements Resource { @Override public Resource createRelative(String relativePath) throws IOException { return new OssStorageResource(this.oss, - this.location.resolve(relativePath).toString()); + this.location.resolve(relativePath).toString(), this.beanFactory); } @Override @@ -208,4 +247,73 @@ public class OssStorageResource implements Resource { } } + /** + * create a bucket. + * @return OSS Bucket + */ + public Bucket createBucket() { + return this.oss.createBucket(this.bucketName); + } + + @Override + public boolean isWritable() { + return !isBucket() && (this.autoCreateFiles || exists()); + } + + /** + * acquire an OutputStream for write. Note: please close the stream after writing is + * done + * @return OutputStream of OSS resource + * @throws IOException throw by oss operation + */ + @Override + public OutputStream getOutputStream() throws IOException { + if (isBucket()) { + throw new IllegalStateException( + "Cannot open an output stream to a bucket: '" + getURI() + "'"); + } + else { + OSSObject ossObject; + + try { + ossObject = this.getOSSObject(); + } + catch (OSSException ex) { + if (ex.getMessage() != null + && ex.getMessage().startsWith(MESSAGE_KEY_NOT_EXIST)) { + ossObject = null; + } + else { + throw ex; + } + } + + if (ossObject == null) { + if (!this.autoCreateFiles) { + throw new FileNotFoundException( + "The object was not found: " + getURI()); + } + + } + + final PipedInputStream in = new PipedInputStream(); + final PipedOutputStream out = new PipedOutputStream(in); + + ossTaskExecutor.submit(new Runnable() { + @Override + public void run() { + try { + OssStorageResource.this.oss.putObject(bucketName, objectKey, in); + } + catch (Exception ex) { + logger.error("Failed to put object", ex); + } + } + }); + + return out; + } + + } + } diff --git a/spring-cloud-alicloud-schedulerx/src/main/java/com/alibaba/alicloud/scx/endpoint/ScxEndpoint.java b/spring-cloud-alicloud-schedulerx/src/main/java/com/alibaba/alicloud/scx/endpoint/ScxEndpoint.java index 79a7c4ed..ecf9f220 100644 --- a/spring-cloud-alicloud-schedulerx/src/main/java/com/alibaba/alicloud/scx/endpoint/ScxEndpoint.java +++ b/spring-cloud-alicloud-schedulerx/src/main/java/com/alibaba/alicloud/scx/endpoint/ScxEndpoint.java @@ -19,13 +19,14 @@ package com.alibaba.alicloud.scx.endpoint; import java.util.HashMap; import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.actuate.endpoint.AbstractEndpoint; - import com.alibaba.alicloud.context.edas.EdasProperties; import com.alibaba.alicloud.context.scx.ScxProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.boot.actuate.endpoint.AbstractEndpoint; + /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-schedulerx/src/main/java/com/alibaba/alicloud/scx/endpoint/ScxEndpointAutoConfiguration.java b/spring-cloud-alicloud-schedulerx/src/main/java/com/alibaba/alicloud/scx/endpoint/ScxEndpointAutoConfiguration.java index 3231fd40..079b0f1a 100644 --- a/spring-cloud-alicloud-schedulerx/src/main/java/com/alibaba/alicloud/scx/endpoint/ScxEndpointAutoConfiguration.java +++ b/spring-cloud-alicloud-schedulerx/src/main/java/com/alibaba/alicloud/scx/endpoint/ScxEndpointAutoConfiguration.java @@ -16,13 +16,13 @@ package com.alibaba.alicloud.scx.endpoint; +import com.alibaba.alicloud.context.edas.EdasProperties; +import com.alibaba.alicloud.context.scx.ScxProperties; + import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.context.annotation.Bean; -import com.alibaba.alicloud.context.edas.EdasProperties; -import com.alibaba.alicloud.context.scx.ScxProperties; - /** * @author xiaolongzuo */ diff --git a/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/SmsInitializer.java b/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/SmsInitializer.java index 13bae561..d2d6d213 100644 --- a/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/SmsInitializer.java +++ b/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/SmsInitializer.java @@ -15,16 +15,16 @@ */ package com.alibaba.alicloud.sms; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.SmartInitializingSingleton; -import org.springframework.beans.factory.config.BeanPostProcessor; - import com.alibaba.alicloud.context.sms.SmsProperties; import com.alibaba.alicloud.sms.base.MessageListener; import com.aliyuncs.profile.DefaultProfile; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.beans.factory.config.BeanPostProcessor; /** * @author pbting diff --git a/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/SmsServiceImpl.java b/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/SmsServiceImpl.java index b7e6ea3b..79dc7800 100644 --- a/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/SmsServiceImpl.java +++ b/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/SmsServiceImpl.java @@ -17,9 +17,6 @@ package com.alibaba.alicloud.sms; import java.text.ParseException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.alibaba.alicloud.context.AliCloudProperties; import com.alibaba.alicloud.context.sms.SmsProperties; import com.alibaba.alicloud.sms.base.DefaultAlicomMessagePuller; @@ -34,6 +31,8 @@ import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author pbting diff --git a/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/base/DefaultAlicomMessagePuller.java b/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/base/DefaultAlicomMessagePuller.java index 655ce8b2..d265e129 100755 --- a/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/base/DefaultAlicomMessagePuller.java +++ b/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/base/DefaultAlicomMessagePuller.java @@ -25,14 +25,13 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; -import org.apache.commons.lang3.concurrent.BasicThreadFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.aliyun.mns.client.CloudQueue; import com.aliyun.mns.common.ClientException; import com.aliyun.mns.common.ServiceException; import com.aliyun.mns.model.Message; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * 阿里通信官方消息默认拉取工具类 diff --git a/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/base/TokenGetterForAlicom.java b/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/base/TokenGetterForAlicom.java index 2176b708..c28d9e73 100755 --- a/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/base/TokenGetterForAlicom.java +++ b/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/base/TokenGetterForAlicom.java @@ -21,9 +21,6 @@ import java.util.TimeZone; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.aliyun.mns.client.CloudAccount; import com.aliyun.mns.client.CloudQueue; import com.aliyun.mns.client.MNSClient; @@ -36,6 +33,8 @@ import com.aliyuncs.http.MethodType; import com.aliyuncs.http.ProtocolType; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * 获取接收云通信消息的临时token diff --git a/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/config/SmsAutoConfiguration.java b/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/config/SmsAutoConfiguration.java index 8bc98a4a..ac725e37 100644 --- a/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/config/SmsAutoConfiguration.java +++ b/spring-cloud-alicloud-sms/src/main/java/com/alibaba/alicloud/sms/config/SmsAutoConfiguration.java @@ -15,12 +15,6 @@ */ package com.alibaba.alicloud.sms.config; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - import com.alibaba.alicloud.context.AliCloudProperties; import com.alibaba.alicloud.context.sms.SmsProperties; import com.alibaba.alicloud.sms.ISmsService; @@ -29,6 +23,12 @@ import com.alibaba.alicloud.sms.SmsServiceImpl; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + /** * @author pbting */ diff --git a/spring-cloud-starter-alibaba/spring-cloud-starter-bus-rocketmq/src/main/java/com/alibaba/cloud/bus/rocketmq/env/RocketMQBusEnvironmentPostProcessor.java b/spring-cloud-starter-alibaba/spring-cloud-starter-bus-rocketmq/src/main/java/com/alibaba/cloud/bus/rocketmq/env/RocketMQBusEnvironmentPostProcessor.java index 4895741c..ffb28a1c 100644 --- a/spring-cloud-starter-alibaba/spring-cloud-starter-bus-rocketmq/src/main/java/com/alibaba/cloud/bus/rocketmq/env/RocketMQBusEnvironmentPostProcessor.java +++ b/spring-cloud-starter-alibaba/spring-cloud-starter-bus-rocketmq/src/main/java/com/alibaba/cloud/bus/rocketmq/env/RocketMQBusEnvironmentPostProcessor.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 + * Copyright (C) 2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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, diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQBinderConstants.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQBinderConstants.java index 72c97420..e2a527dd 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQBinderConstants.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQBinderConstants.java @@ -16,8 +16,11 @@ package com.alibaba.cloud.stream.binder.rocketmq; +import static org.apache.rocketmq.spring.support.RocketMQHeaders.PREFIX; + /** * @author Jim + * @author Xiejiashuai */ public interface RocketMQBinderConstants { @@ -31,6 +34,11 @@ public interface RocketMQBinderConstants { */ String DEFAULT_NAME_SERVER = "127.0.0.1:9876"; - String DEFAULT_GROUP = "rocketmq_binder_default_group_name"; + String DEFAULT_GROUP = PREFIX + "binder_default_group_name"; + + /** + * RocketMQ re-consume times + */ + String ROCKETMQ_RECONSUME_TIMES = PREFIX + "RECONSUME_TIMES"; } diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQBinderUtils.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQBinderUtils.java index 673d3370..db982da6 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQBinderUtils.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQBinderUtils.java @@ -16,11 +16,12 @@ package com.alibaba.cloud.stream.binder.rocketmq; -import org.apache.rocketmq.spring.autoconfigure.RocketMQProperties; -import org.springframework.util.StringUtils; - import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQBinderConfigurationProperties; +import org.apache.rocketmq.spring.autoconfigure.RocketMQProperties; + +import org.springframework.util.StringUtils; + /** * @author Jim */ diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQMessageChannelBinder.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQMessageChannelBinder.java index 046b9f8b..34a6f925 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQMessageChannelBinder.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQMessageChannelBinder.java @@ -16,27 +16,11 @@ package com.alibaba.cloud.stream.binder.rocketmq; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.Map; - -import org.apache.rocketmq.acl.common.AclClientRPCHook; -import org.apache.rocketmq.acl.common.SessionCredentials; -import org.apache.rocketmq.client.producer.DefaultMQProducer; -import org.apache.rocketmq.common.UtilAll; -import org.apache.rocketmq.remoting.RPCHook; -import org.apache.rocketmq.spring.autoconfigure.RocketMQProperties; -import org.apache.rocketmq.spring.core.RocketMQTemplate; -import org.apache.rocketmq.spring.support.RocketMQUtil; -import org.springframework.cloud.stream.binder.AbstractMessageChannelBinder; -import org.springframework.cloud.stream.binder.ExtendedConsumerProperties; -import org.springframework.cloud.stream.binder.ExtendedProducerProperties; -import org.springframework.cloud.stream.binder.ExtendedPropertiesBinder; -import org.springframework.cloud.stream.provisioning.ConsumerDestination; -import org.springframework.cloud.stream.provisioning.ProducerDestination; -import org.springframework.integration.core.MessageProducer; -import org.springframework.messaging.MessageChannel; -import org.springframework.messaging.MessageHandler; -import org.springframework.util.StringUtils; +import java.util.Set; import com.alibaba.cloud.stream.binder.rocketmq.consuming.RocketMQListenerBindingContainer; import com.alibaba.cloud.stream.binder.rocketmq.integration.RocketMQInboundChannelAdapter; @@ -47,8 +31,29 @@ import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQConsumerPrope import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQExtendedBindingProperties; import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQProducerProperties; import com.alibaba.cloud.stream.binder.rocketmq.provisioning.RocketMQTopicProvisioner; +import com.alibaba.cloud.stream.binder.rocketmq.support.JacksonRocketMQHeaderMapper; +import com.alibaba.cloud.stream.binder.rocketmq.support.RocketMQHeaderMapper; import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.rocketmq.acl.common.AclClientRPCHook; +import org.apache.rocketmq.acl.common.SessionCredentials; +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.common.UtilAll; +import org.apache.rocketmq.remoting.RPCHook; +import org.apache.rocketmq.spring.autoconfigure.RocketMQProperties; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.apache.rocketmq.spring.support.RocketMQUtil; + +import org.springframework.cloud.stream.binder.AbstractMessageChannelBinder; +import org.springframework.cloud.stream.binder.ExtendedConsumerProperties; +import org.springframework.cloud.stream.binder.ExtendedProducerProperties; +import org.springframework.cloud.stream.binder.ExtendedPropertiesBinder; +import org.springframework.cloud.stream.provisioning.ConsumerDestination; +import org.springframework.cloud.stream.provisioning.ProducerDestination; +import org.springframework.integration.core.MessageProducer; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.MessageHandler; +import org.springframework.util.StringUtils; /** * @author Jim @@ -149,10 +154,10 @@ public class RocketMQMessageChannelBinder extends RocketMQMessageHandler messageHandler = new RocketMQMessageHandler( rocketMQTemplate, destination.getName(), producerGroup, producerProperties.getExtension().getTransactional(), - instrumentationManager); + instrumentationManager, producerProperties); messageHandler.setBeanFactory(this.getApplicationContext().getBeanFactory()); messageHandler.setSync(producerProperties.getExtension().getSync()); - + messageHandler.setHeaderMapper(createHeaderMapper(producerProperties)); if (errorChannel != null) { messageHandler.setSendFailureChannel(errorChannel); } @@ -220,4 +225,28 @@ public class RocketMQMessageChannelBinder extends public Map getTopicInUse() { return topicInUse; } + + private RocketMQHeaderMapper createHeaderMapper( + final ExtendedConsumerProperties extendedConsumerProperties) { + Set trustedPackages = extendedConsumerProperties.getExtension() + .getTrustedPackages(); + return createHeaderMapper(trustedPackages); + } + + private RocketMQHeaderMapper createHeaderMapper( + final ExtendedProducerProperties producerProperties) { + return createHeaderMapper(new ArrayList()); + } + + private RocketMQHeaderMapper createHeaderMapper(Collection trustedPackages) { + ObjectMapper objectMapper = this.getApplicationContext() + .getBeansOfType(ObjectMapper.class).values().iterator().next(); + JacksonRocketMQHeaderMapper headerMapper = new JacksonRocketMQHeaderMapper( + objectMapper); + if (!StringUtils.isEmpty(trustedPackages)) { + headerMapper.addTrustedPackages(trustedPackages); + } + return headerMapper; + } + } diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/actuator/RocketMQBinderHealthIndicator.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/actuator/RocketMQBinderHealthIndicator.java index 15d194ca..259fb03a 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/actuator/RocketMQBinderHealthIndicator.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/actuator/RocketMQBinderHealthIndicator.java @@ -16,13 +16,13 @@ package com.alibaba.cloud.stream.binder.rocketmq.actuator; +import com.alibaba.cloud.stream.binder.rocketmq.metrics.Instrumentation; +import com.alibaba.cloud.stream.binder.rocketmq.metrics.InstrumentationManager; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.Health; -import com.alibaba.cloud.stream.binder.rocketmq.metrics.Instrumentation; -import com.alibaba.cloud.stream.binder.rocketmq.metrics.InstrumentationManager; - /** * @author Timur Valiev * @author Jim diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/config/RocketMQBinderAutoConfiguration.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/config/RocketMQBinderAutoConfiguration.java index ac1512e6..651ed100 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/config/RocketMQBinderAutoConfiguration.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/config/RocketMQBinderAutoConfiguration.java @@ -16,20 +16,21 @@ package com.alibaba.cloud.stream.binder.rocketmq.config; -import org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration; -import org.apache.rocketmq.spring.autoconfigure.RocketMQProperties; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - import com.alibaba.cloud.stream.binder.rocketmq.RocketMQMessageChannelBinder; import com.alibaba.cloud.stream.binder.rocketmq.metrics.InstrumentationManager; import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQBinderConfigurationProperties; import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQExtendedBindingProperties; import com.alibaba.cloud.stream.binder.rocketmq.provisioning.RocketMQTopicProvisioner; +import org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration; +import org.apache.rocketmq.spring.autoconfigure.RocketMQProperties; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + /** * @author Timur Valiev * @author Jim diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/config/RocketMQBinderHealthIndicatorAutoConfiguration.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/config/RocketMQBinderHealthIndicatorAutoConfiguration.java index ea801062..bf0f52f6 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/config/RocketMQBinderHealthIndicatorAutoConfiguration.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/config/RocketMQBinderHealthIndicatorAutoConfiguration.java @@ -16,12 +16,12 @@ package com.alibaba.cloud.stream.binder.rocketmq.config; +import com.alibaba.cloud.stream.binder.rocketmq.actuator.RocketMQBinderHealthIndicator; + import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.cloud.stream.binder.rocketmq.actuator.RocketMQBinderHealthIndicator; - /** * @author Jim */ diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/config/RocketMQComponent4BinderAutoConfiguration.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/config/RocketMQComponent4BinderAutoConfiguration.java index 282d6efe..85bba257 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/config/RocketMQComponent4BinderAutoConfiguration.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/config/RocketMQComponent4BinderAutoConfiguration.java @@ -16,6 +16,9 @@ package com.alibaba.cloud.stream.binder.rocketmq.config; +import com.alibaba.cloud.stream.binder.rocketmq.RocketMQBinderConstants; + +import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.rocketmq.acl.common.AclClientRPCHook; import org.apache.rocketmq.acl.common.SessionCredentials; import org.apache.rocketmq.client.producer.DefaultMQProducer; @@ -24,6 +27,7 @@ import org.apache.rocketmq.spring.config.RocketMQConfigUtils; import org.apache.rocketmq.spring.config.RocketMQTransactionAnnotationProcessor; import org.apache.rocketmq.spring.config.TransactionHandlerRegistry; import org.apache.rocketmq.spring.core.RocketMQTemplate; + import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -32,10 +36,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; -import com.alibaba.cloud.stream.binder.rocketmq.RocketMQBinderConstants; - -import com.fasterxml.jackson.databind.ObjectMapper; - /** * @author Jim */ diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/consuming/RocketMQListenerBindingContainer.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/consuming/RocketMQListenerBindingContainer.java index 89f21214..53064cfd 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/consuming/RocketMQListenerBindingContainer.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/consuming/RocketMQListenerBindingContainer.java @@ -18,6 +18,11 @@ package com.alibaba.cloud.stream.binder.rocketmq.consuming; import java.util.List; +import com.alibaba.cloud.stream.binder.rocketmq.RocketMQMessageChannelBinder; +import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQBinderConfigurationProperties; +import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQConsumerProperties; +import com.alibaba.cloud.stream.binder.rocketmq.support.RocketMQHeaderMapper; + import org.apache.rocketmq.acl.common.AclClientRPCHook; import org.apache.rocketmq.acl.common.SessionCredentials; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; @@ -42,15 +47,16 @@ import org.apache.rocketmq.spring.support.RocketMQListenerContainer; import org.apache.rocketmq.spring.support.RocketMQUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.beans.factory.InitializingBean; import org.springframework.cloud.stream.binder.ExtendedConsumerProperties; import org.springframework.context.SmartLifecycle; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.messaging.Message; import org.springframework.util.Assert; import org.springframework.util.StringUtils; -import com.alibaba.cloud.stream.binder.rocketmq.RocketMQMessageChannelBinder; -import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQBinderConfigurationProperties; -import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQConsumerProperties; +import static com.alibaba.cloud.stream.binder.rocketmq.RocketMQBinderConstants.ROCKETMQ_RECONSUME_TIMES; /** * @author Jim @@ -83,6 +89,8 @@ public class RocketMQListenerBindingContainer private RocketMQListener rocketMQListener; + private RocketMQHeaderMapper headerMapper; + private DefaultMQPushConsumer consumer; private boolean running; @@ -90,12 +98,16 @@ public class RocketMQListenerBindingContainer private final ExtendedConsumerProperties rocketMQConsumerProperties; private final RocketMQMessageChannelBinder rocketMQMessageChannelBinder; + private final RocketMQBinderConfigurationProperties rocketBinderConfigurationProperties; // The following properties came from RocketMQConsumerProperties. private ConsumeMode consumeMode; + private SelectorType selectorType; + private String selectorExpression; + private MessageModel messageModel; public RocketMQListenerBindingContainer( @@ -364,10 +376,35 @@ public class RocketMQListenerBindingContainer return messageModel; } + public RocketMQHeaderMapper getHeaderMapper() { + return headerMapper; + } + + public void setHeaderMapper(RocketMQHeaderMapper headerMapper) { + this.headerMapper = headerMapper; + } + + /** + * Convert rocketmq {@link MessageExt} to Spring {@link Message}. + * @param messageExt the rocketmq message + * @return the converted Spring {@link Message} + */ + @SuppressWarnings("unchecked") + private Message convertToSpringMessage(MessageExt messageExt) { + + // add reconsume-times header to messageExt + int reconsumeTimes = messageExt.getReconsumeTimes(); + messageExt.putUserProperty(ROCKETMQ_RECONSUME_TIMES, + String.valueOf(reconsumeTimes)); + Message message = RocketMQUtil.convertToSpringMessage(messageExt); + return MessageBuilder.fromMessage(message) + .copyHeaders(headerMapper.toHeaders(messageExt.getProperties())).build(); + } + public class DefaultMessageListenerConcurrently implements MessageListenerConcurrently { - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "Duplicates" }) @Override public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { @@ -375,10 +412,10 @@ public class RocketMQListenerBindingContainer log.debug("received msg: {}", messageExt); try { long now = System.currentTimeMillis(); - rocketMQListener - .onMessage(RocketMQUtil.convertToSpringMessage(messageExt)); + rocketMQListener.onMessage(convertToSpringMessage(messageExt)); long costTime = System.currentTimeMillis() - now; - log.debug("consume {} cost: {} ms", messageExt.getMsgId(), costTime); + log.debug("consume {} message key:[{}] cost: {} ms", + messageExt.getMsgId(), messageExt.getKeys(), costTime); } catch (Exception e) { log.warn("consume message failed. messageExt:{}", messageExt, e); @@ -389,11 +426,12 @@ public class RocketMQListenerBindingContainer return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } + } public class DefaultMessageListenerOrderly implements MessageListenerOrderly { - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "Duplicates" }) @Override public ConsumeOrderlyStatus consumeMessage(List msgs, ConsumeOrderlyContext context) { @@ -401,10 +439,10 @@ public class RocketMQListenerBindingContainer log.debug("received msg: {}", messageExt); try { long now = System.currentTimeMillis(); - rocketMQListener - .onMessage(RocketMQUtil.convertToSpringMessage(messageExt)); + rocketMQListener.onMessage(convertToSpringMessage(messageExt)); long costTime = System.currentTimeMillis() - now; - log.info("consume {} cost: {} ms", messageExt.getMsgId(), costTime); + log.info("consume {} message key:[{}] cost: {} ms", + messageExt.getMsgId(), messageExt.getKeys(), costTime); } catch (Exception e) { log.warn("consume message failed. messageExt:{}", messageExt, e); diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/integration/RocketMQInboundChannelAdapter.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/integration/RocketMQInboundChannelAdapter.java index 0743b536..05c634c9 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/integration/RocketMQInboundChannelAdapter.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/integration/RocketMQInboundChannelAdapter.java @@ -16,9 +16,15 @@ package com.alibaba.cloud.stream.binder.rocketmq.integration; +import com.alibaba.cloud.stream.binder.rocketmq.consuming.RocketMQListenerBindingContainer; +import com.alibaba.cloud.stream.binder.rocketmq.metrics.Instrumentation; +import com.alibaba.cloud.stream.binder.rocketmq.metrics.InstrumentationManager; +import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQConsumerProperties; + import org.apache.rocketmq.spring.core.RocketMQListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.cloud.stream.binder.ExtendedConsumerProperties; import org.springframework.integration.endpoint.MessageProducerSupport; import org.springframework.integration.support.MessageBuilder; @@ -31,11 +37,6 @@ import org.springframework.retry.RetryListener; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; -import com.alibaba.cloud.stream.binder.rocketmq.consuming.RocketMQListenerBindingContainer; -import com.alibaba.cloud.stream.binder.rocketmq.metrics.Instrumentation; -import com.alibaba.cloud.stream.binder.rocketmq.metrics.InstrumentationManager; -import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQConsumerProperties; - /** * @author Jim */ diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/integration/RocketMQMessageHandler.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/integration/RocketMQMessageHandler.java index 34f2d35b..5ccfdfb6 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/integration/RocketMQMessageHandler.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/integration/RocketMQMessageHandler.java @@ -16,30 +16,39 @@ package com.alibaba.cloud.stream.binder.rocketmq.integration; +import java.util.List; + +import com.alibaba.cloud.stream.binder.rocketmq.RocketMQBinderConstants; +import com.alibaba.cloud.stream.binder.rocketmq.metrics.Instrumentation; +import com.alibaba.cloud.stream.binder.rocketmq.metrics.InstrumentationManager; +import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQProducerProperties; +import com.alibaba.cloud.stream.binder.rocketmq.support.RocketMQHeaderMapper; + import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.producer.SendCallback; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.client.producer.SendStatus; import org.apache.rocketmq.common.message.MessageConst; +import org.apache.rocketmq.common.message.MessageQueue; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.apache.rocketmq.spring.support.RocketMQHeaders; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + +import org.springframework.cloud.stream.binder.BinderHeaders; +import org.springframework.cloud.stream.binder.ExtendedProducerProperties; import org.springframework.context.Lifecycle; import org.springframework.integration.handler.AbstractMessageHandler; import org.springframework.integration.support.DefaultErrorMessageStrategy; import org.springframework.integration.support.ErrorMessageStrategy; import org.springframework.integration.support.MessageBuilder; +import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessagingException; import org.springframework.messaging.support.ErrorMessage; import org.springframework.util.Assert; import org.springframework.util.StringUtils; -import com.alibaba.cloud.stream.binder.rocketmq.RocketMQBinderConstants; -import com.alibaba.cloud.stream.binder.rocketmq.metrics.Instrumentation; -import com.alibaba.cloud.stream.binder.rocketmq.metrics.InstrumentationManager; - /** * @author Jim */ @@ -54,6 +63,8 @@ public class RocketMQMessageHandler extends AbstractMessageHandler implements Li private final RocketMQTemplate rocketMQTemplate; + private RocketMQHeaderMapper headerMapper; + private final Boolean transactional; private final String destination; @@ -66,12 +77,15 @@ public class RocketMQMessageHandler extends AbstractMessageHandler implements Li private volatile boolean running = false; + private ExtendedProducerProperties producerProperties; + public RocketMQMessageHandler(RocketMQTemplate rocketMQTemplate, String destination, - String group, Boolean transactional, - InstrumentationManager instrumentationManager) { + String groupName, Boolean transactional, + InstrumentationManager instrumentationManager, + ExtendedProducerProperties producerProperties) { this.rocketMQTemplate = rocketMQTemplate; this.destination = destination; - this.groupName = group; + this.groupName = groupName; this.transactional = transactional; this.instrumentationManager = instrumentationManager; } @@ -95,6 +109,22 @@ public class RocketMQMessageHandler extends AbstractMessageHandler implements Li .build(), e); } } + if (producerProperties.isPartitioned()) { + try { + List messageQueues = rocketMQTemplate.getProducer() + .fetchPublishMessageQueues(destination); + if (producerProperties.getPartitionCount() != messageQueues.size()) { + logger.info(String.format( + "The partition count of topic '%s' will change from '%s' to '%s'", + destination, producerProperties.getPartitionCount(), + messageQueues.size())); + producerProperties.setPartitionCount(messageQueues.size()); + } + } + catch (MQClientException e) { + logger.error("fetch publish message queues fail", e); + } + } running = true; } @@ -145,36 +175,52 @@ public class RocketMQMessageHandler extends AbstractMessageHandler implements Li catch (Exception e) { // ignore } + boolean needSelectQueue = message.getHeaders() + .containsKey(BinderHeaders.PARTITION_HEADER); if (sync) { - sendRes = rocketMQTemplate.syncSend(topicWithTags.toString(), message, - rocketMQTemplate.getProducer().getSendMsgTimeout(), - delayLevel); + if (needSelectQueue) { + sendRes = rocketMQTemplate.syncSendOrderly( + topicWithTags.toString(), message, "", + rocketMQTemplate.getProducer().getSendMsgTimeout()); + } + else { + sendRes = rocketMQTemplate.syncSend(topicWithTags.toString(), + message, + rocketMQTemplate.getProducer().getSendMsgTimeout(), + delayLevel); + } log.debug("sync send to topic " + topicWithTags + " " + sendRes); } else { - rocketMQTemplate.asyncSend(topicWithTags.toString(), message, - new SendCallback() { - @Override - public void onSuccess(SendResult sendResult) { - log.debug("async send to topic " + topicWithTags + " " - + sendResult); - } + final Message finalMessage = message; + SendCallback sendCallback = new SendCallback() { + @Override + public void onSuccess(SendResult sendResult) { + log.debug("async send to topic " + topicWithTags + " " + + sendResult); + } - @Override - public void onException(Throwable e) { - log.error( - "RocketMQ Message hasn't been sent. Caused by " - + e.getMessage()); - if (getSendFailureChannel() != null) { - getSendFailureChannel().send( - RocketMQMessageHandler.this.errorMessageStrategy - .buildErrorMessage( - new MessagingException( - message, e), - null)); - } - } - }); + @Override + public void onException(Throwable e) { + log.error("RocketMQ Message hasn't been sent. Caused by " + + e.getMessage()); + if (getSendFailureChannel() != null) { + getSendFailureChannel().send( + RocketMQMessageHandler.this.errorMessageStrategy + .buildErrorMessage(new MessagingException( + finalMessage, e), null)); + } + } + }; + if (needSelectQueue) { + rocketMQTemplate.asyncSendOrderly(topicWithTags.toString(), + message, "", sendCallback, + rocketMQTemplate.getProducer().getSendMsgTimeout()); + } + else { + rocketMQTemplate.asyncSend(topicWithTags.toString(), message, + sendCallback); + } } } if (sendRes != null && !sendRes.getSendStatus().equals(SendStatus.SEND_OK)) { @@ -229,4 +275,12 @@ public class RocketMQMessageHandler extends AbstractMessageHandler implements Li public void setSync(boolean sync) { this.sync = sync; } + + public RocketMQHeaderMapper getHeaderMapper() { + return headerMapper; + } + + public void setHeaderMapper(RocketMQHeaderMapper headerMapper) { + this.headerMapper = headerMapper; + } } \ No newline at end of file diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/properties/RocketMQBinderConfigurationProperties.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/properties/RocketMQBinderConfigurationProperties.java index 4fda8c8f..e06a8690 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/properties/RocketMQBinderConfigurationProperties.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/properties/RocketMQBinderConfigurationProperties.java @@ -16,21 +16,26 @@ package com.alibaba.cloud.stream.binder.rocketmq.properties; -import org.apache.rocketmq.common.MixAll; -import org.springframework.boot.context.properties.ConfigurationProperties; +import javax.validation.constraints.Pattern; import com.alibaba.cloud.stream.binder.rocketmq.RocketMQBinderConstants; +import org.apache.rocketmq.common.MixAll; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; /** * @author Timur Valiev * @author Jim */ @ConfigurationProperties(prefix = "spring.cloud.stream.rocketmq.binder") +@Validated public class RocketMQBinderConfigurationProperties { /** * The name server for rocketMQ, formats: `host:port;host:port`. */ + @Pattern(regexp = "^[\\d.:;]+$", message = "nameServer needs to match expression \"host:port;host:port\"") private String nameServer = RocketMQBinderConstants.DEFAULT_NAME_SERVER; /** @@ -93,4 +98,5 @@ public class RocketMQBinderConfigurationProperties { public void setCustomizedTraceTopic(String customizedTraceTopic) { this.customizedTraceTopic = customizedTraceTopic; } + } diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/properties/RocketMQConsumerProperties.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/properties/RocketMQConsumerProperties.java index 720c3eac..854c4f47 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/properties/RocketMQConsumerProperties.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/properties/RocketMQConsumerProperties.java @@ -16,8 +16,13 @@ package com.alibaba.cloud.stream.binder.rocketmq.properties; +import java.util.Set; + +import com.alibaba.cloud.stream.binder.rocketmq.support.JacksonRocketMQHeaderMapper; + import org.apache.rocketmq.client.consumer.MQPushConsumer; import org.apache.rocketmq.client.consumer.MessageSelector; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly; import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; @@ -51,7 +56,9 @@ public class RocketMQConsumerProperties { private Boolean orderly = false; /** - * for concurrently listener. message consume retry strategy + * for concurrently listener. message consume retry strategy. see + * {@link ConsumeConcurrentlyContext#delayLevelWhenNextConsume}. -1 means dlq(or + * discard, see {@link this#shouldRequeue}), others means requeue */ private int delayLevelWhenNextConsume = 0; @@ -62,6 +69,19 @@ public class RocketMQConsumerProperties { private Boolean enabled = true; + /** + * {@link JacksonRocketMQHeaderMapper#addTrustedPackages(String...)} + */ + private Set trustedPackages; + + // ------------ For Pull Consumer ------------ + + private long pullTimeout = 10 * 1000; + + private boolean fromStore; + + // ------------ For Pull Consumer ------------ + public String getTags() { return tags; } @@ -117,4 +137,32 @@ public class RocketMQConsumerProperties { public void setSuspendCurrentQueueTimeMillis(long suspendCurrentQueueTimeMillis) { this.suspendCurrentQueueTimeMillis = suspendCurrentQueueTimeMillis; } + + public long getPullTimeout() { + return pullTimeout; + } + + public void setPullTimeout(long pullTimeout) { + this.pullTimeout = pullTimeout; + } + + public boolean isFromStore() { + return fromStore; + } + + public void setFromStore(boolean fromStore) { + this.fromStore = fromStore; + } + + public boolean shouldRequeue() { + return delayLevelWhenNextConsume != -1; + } + + public Set getTrustedPackages() { + return trustedPackages; + } + + public void setTrustedPackages(Set trustedPackages) { + this.trustedPackages = trustedPackages; + } } diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/provisioning/RocketMQTopicProvisioner.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/provisioning/RocketMQTopicProvisioner.java index 00216574..c62c31bc 100644 --- a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/provisioning/RocketMQTopicProvisioner.java +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/provisioning/RocketMQTopicProvisioner.java @@ -16,10 +16,14 @@ package com.alibaba.cloud.stream.binder.rocketmq.provisioning; +import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQConsumerProperties; +import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQProducerProperties; + import org.apache.rocketmq.client.Validators; import org.apache.rocketmq.client.exception.MQClientException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.cloud.stream.binder.ExtendedConsumerProperties; import org.springframework.cloud.stream.binder.ExtendedProducerProperties; import org.springframework.cloud.stream.provisioning.ConsumerDestination; @@ -27,9 +31,6 @@ import org.springframework.cloud.stream.provisioning.ProducerDestination; import org.springframework.cloud.stream.provisioning.ProvisioningException; import org.springframework.cloud.stream.provisioning.ProvisioningProvider; -import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQConsumerProperties; -import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQProducerProperties; - /** * @author Timur Valiev * @author Jim diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/provisioning/selector/PartitionMessageQueueSelector.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/provisioning/selector/PartitionMessageQueueSelector.java new file mode 100644 index 00000000..effa183b --- /dev/null +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/provisioning/selector/PartitionMessageQueueSelector.java @@ -0,0 +1,55 @@ +/* + * 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.stream.binder.rocketmq.provisioning.selector; + +import java.util.List; + +import org.apache.rocketmq.client.producer.MessageQueueSelector; +import org.apache.rocketmq.common.message.Message; +import org.apache.rocketmq.common.message.MessageQueue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.cloud.stream.binder.BinderHeaders; + +/** + * @author wangxing + */ +public class PartitionMessageQueueSelector implements MessageQueueSelector { + + private static final Logger LOGGER = LoggerFactory + .getLogger(PartitionMessageQueueSelector.class); + + @Override + public MessageQueue select(List mqs, Message msg, Object arg) { + Integer partition = 0; + try { + partition = Math.abs( + Integer.parseInt(msg.getProperty(BinderHeaders.PARTITION_HEADER))); + if (partition >= mqs.size()) { + LOGGER.warn( + "the partition '{}' is greater than the number of queues '{}'.", + partition, mqs.size()); + partition = partition % mqs.size(); + } + } + catch (NumberFormatException ignored) { + } + return mqs.get(partition); + } + +} \ No newline at end of file diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/support/AbstractRocketMQHeaderMapper.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/support/AbstractRocketMQHeaderMapper.java new file mode 100644 index 00000000..34221b95 --- /dev/null +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/support/AbstractRocketMQHeaderMapper.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.stream.binder.rocketmq.support; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +import org.apache.rocketmq.common.message.MessageConst; + +import org.springframework.messaging.MessageHeaders; +import org.springframework.util.Assert; + +/** + * Base for RocketMQ header mappers. + * + * @author caotc + * @since 1.5.1.RELEASE + */ +public abstract class AbstractRocketMQHeaderMapper implements RocketMQHeaderMapper { + private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; + + private Charset charset; + + public AbstractRocketMQHeaderMapper() { + this(DEFAULT_CHARSET); + } + + public AbstractRocketMQHeaderMapper(Charset charset) { + Assert.notNull(charset, "'charset' cannot be null"); + this.charset = charset; + } + + protected boolean matches(String headerName) { + return !MessageConst.STRING_HASH_SET.contains(headerName) + && !MessageHeaders.ID.equals(headerName) + && !MessageHeaders.TIMESTAMP.equals(headerName) + && !MessageHeaders.CONTENT_TYPE.equals(headerName) + && !MessageHeaders.REPLY_CHANNEL.equals(headerName) + && !MessageHeaders.ERROR_CHANNEL.equals(headerName); + } + + public Charset getCharset() { + return charset; + } + + public void setCharset(Charset charset) { + Assert.notNull(charset, "'charset' cannot be null"); + this.charset = charset; + } +} diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/support/JacksonRocketMQHeaderMapper.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/support/JacksonRocketMQHeaderMapper.java new file mode 100644 index 00000000..5e87736c --- /dev/null +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/support/JacksonRocketMQHeaderMapper.java @@ -0,0 +1,289 @@ +/* + * Copyright (C) 2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.stream.binder.rocketmq.support; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.messaging.MessageHeaders; +import org.springframework.util.ClassUtils; + +/** + * jackson header mapper for RocketMQ. Header types are added to a special header + * {@link #JSON_TYPES}. + * + * @author caotc + * @since 1.5.1.RELEASE + */ +public class JacksonRocketMQHeaderMapper extends AbstractRocketMQHeaderMapper { + + private final static Logger log = LoggerFactory + .getLogger(JacksonRocketMQHeaderMapper.class); + + private static final List DEFAULT_TRUSTED_PACKAGES = Arrays + .asList("java.lang", "java.net", "java.util", "org.springframework.util"); + + /** + * Header name for java types of other headers. + */ + public static final String JSON_TYPES = "spring_json_header_types"; + + private final ObjectMapper objectMapper; + private final Set trustedPackages = new LinkedHashSet<>( + DEFAULT_TRUSTED_PACKAGES); + + public JacksonRocketMQHeaderMapper(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + } + + public JacksonRocketMQHeaderMapper(Charset charset, ObjectMapper objectMapper) { + super(charset); + this.objectMapper = objectMapper; + } + + @Override + public Map fromHeaders(MessageHeaders headers) { + final Map target = new HashMap<>(); + final Map jsonHeaders = new HashMap<>(); + + for (String key : headers.keySet()) { + Object value = headers.get(key); + if (matches(key)) { + if (value instanceof String) { + target.put(key, (String) value); + } + else { + try { + String className = value.getClass().getName(); + target.put(key, objectMapper.writeValueAsString(value)); + jsonHeaders.put(key, className); + } + catch (Exception e) { + log.debug("Could not map " + key + " with type " + + value.getClass().getName(), e); + } + } + } + } + + if (jsonHeaders.size() > 0) { + try { + target.put(JSON_TYPES, objectMapper.writeValueAsString(jsonHeaders)); + } + catch (IllegalStateException | JsonProcessingException e) { + log.error("Could not add json types header", e); + } + } + return target; + } + + @Override + public MessageHeaders toHeaders(Map source) { + final Map target = new HashMap<>(); + final Map jsonTypes = decodeJsonTypes(source); + + for (String key : source.keySet()) { + String value = source.get(key); + if (matches(key) && !(key.equals(JSON_TYPES))) { + if (jsonTypes != null && jsonTypes.containsKey(key)) { + Class type = Object.class; + String requestedType = jsonTypes.get(key); + boolean trusted = trusted(requestedType); + if (trusted) { + try { + type = ClassUtils.forName(requestedType, null); + } + catch (Exception e) { + log.error("Could not load class for header: " + key, e); + } + } + + if (trusted) { + try { + Object val = decodeValue(value, type); + target.put(key, val); + } + catch (IOException e) { + log.error("Could not decode json type: " + value + + " for key: " + key, e); + target.put(key, value); + } + } + else { + target.put(key, new NonTrustedHeaderType(value, requestedType)); + } + } + else { + target.put(key, value); + } + } + } + + return new MessageHeaders(target); + } + + /** + * @param packagesToTrust the packages to trust. + * @see #addTrustedPackages(Collection) + */ + public void addTrustedPackages(String... packagesToTrust) { + if (packagesToTrust != null) { + addTrustedPackages(Arrays.asList(packagesToTrust)); + } + } + + /** + * Add packages to the trusted packages list (default {@code java.util, java.lang}) + * used when constructing objects from JSON. If any of the supplied packages is + * {@code "*"}, all packages are trusted. If a class for a non-trusted package is + * encountered, the header is returned to the application with value of type + * {@link NonTrustedHeaderType}. + * @param packagesToTrust the packages to trust. + */ + public void addTrustedPackages(Collection packagesToTrust) { + if (packagesToTrust != null) { + for (String whiteList : packagesToTrust) { + if ("*".equals(whiteList)) { + this.trustedPackages.clear(); + break; + } + else { + this.trustedPackages.add(whiteList); + } + } + } + } + + public Set getTrustedPackages() { + return this.trustedPackages; + } + + public ObjectMapper getObjectMapper() { + return objectMapper; + } + + private Object decodeValue(String jsonString, Class type) + throws IOException, LinkageError { + Object value = objectMapper.readValue(jsonString, type); + if (type.equals(NonTrustedHeaderType.class)) { + // Upstream NTHT propagated; may be trusted here... + NonTrustedHeaderType nth = (NonTrustedHeaderType) value; + if (trusted(nth.getUntrustedType())) { + try { + value = objectMapper.readValue(nth.getHeaderValue(), + ClassUtils.forName(nth.getUntrustedType(), null)); + } + catch (Exception e) { + log.error("Could not decode header: " + nth, e); + } + } + } + return value; + } + + private Map decodeJsonTypes(Map source) { + if (source.containsKey(JSON_TYPES)) { + String value = source.get(JSON_TYPES); + try { + return objectMapper.readValue(value, + new TypeReference>() { + }); + } + catch (IOException e) { + log.error("Could not decode json types: " + value, e); + } + } + return null; + } + + protected boolean trusted(String requestedType) { + if (requestedType.equals(NonTrustedHeaderType.class.getName())) { + return true; + } + if (!this.trustedPackages.isEmpty()) { + int lastDot = requestedType.lastIndexOf('.'); + if (lastDot < 0) { + return false; + } + String packageName = requestedType.substring(0, lastDot); + for (String trustedPackage : this.trustedPackages) { + if (packageName.equals(trustedPackage) + || packageName.startsWith(trustedPackage + ".")) { + return true; + } + } + return false; + } + return true; + } + + /** + * Represents a header that could not be decoded due to an untrusted type. + */ + public static class NonTrustedHeaderType { + + private String headerValue; + + private String untrustedType; + + public NonTrustedHeaderType() { + super(); + } + + NonTrustedHeaderType(String headerValue, String untrustedType) { + this.headerValue = headerValue; + this.untrustedType = untrustedType; + } + + public void setHeaderValue(String headerValue) { + this.headerValue = headerValue; + } + + public String getHeaderValue() { + return this.headerValue; + } + + public void setUntrustedType(String untrustedType) { + this.untrustedType = untrustedType; + } + + public String getUntrustedType() { + return this.untrustedType; + } + + @Override + public String toString() { + return "NonTrustedHeaderType [headerValue=" + headerValue + ", untrustedType=" + + this.untrustedType + "]"; + } + + } + +} diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/support/RocketMQHeaderMapper.java b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/support/RocketMQHeaderMapper.java new file mode 100644 index 00000000..29700a60 --- /dev/null +++ b/spring-cloud-stream-binder-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/support/RocketMQHeaderMapper.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.stream.binder.rocketmq.support; + +import java.util.Map; + +import org.springframework.messaging.MessageHeaders; + +/** + * header value mapper for RocketMQ + * + * @author caotc + * @since 1.5.1.RELEASE + */ +public interface RocketMQHeaderMapper { + /** + * Map from the given {@link MessageHeaders} to the specified target message. + * @param headers the abstracted MessageHeaders. + * @return the native target message. + */ + Map fromHeaders(MessageHeaders headers); + + /** + * Map from the given target message to abstracted {@link MessageHeaders}. + * @param source the native target message. + * @return the target headers. + */ + MessageHeaders toHeaders(Map source); +} diff --git a/spring-cloud-stream-binder-rocketmq/src/test/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQAutoConfigurationTests.java b/spring-cloud-stream-binder-rocketmq/src/test/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQAutoConfigurationTests.java index 03f1ff3d..44dfd689 100644 --- a/spring-cloud-stream-binder-rocketmq/src/test/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQAutoConfigurationTests.java +++ b/spring-cloud-stream-binder-rocketmq/src/test/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQAutoConfigurationTests.java @@ -16,17 +16,18 @@ package com.alibaba.cloud.stream.binder.rocketmq; -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Before; -import org.junit.Test; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.ConfigurableApplicationContext; - import com.alibaba.cloud.stream.binder.rocketmq.config.RocketMQBinderAutoConfiguration; import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQBinderConfigurationProperties; import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQExtendedBindingProperties; +import org.junit.Before; +import org.junit.Test; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.ConfigurableApplicationContext; + +import static org.assertj.core.api.Assertions.assertThat; + /** * @author Jim */