SpringCloud应用接入


功能简介

Spring Cloud 是 Java 语言生态下的分布式微服务架构的一站式解决方案,为了方便 Spring Cloud 用户快速接入北极星,我们通过以下几个示例帮助用户如何在 Spring Cloud 中体验北极星的相关功能。

快速入门

前提条件

您需要先下载 Polaris Server,具体操作参见 Polaris 服务端安装

确定 Spring Cloud 版本

确认自己项目的 Spring Boot 版本
  1. mvn dependency:tree | grep "org.springframework.boot:spring-boot-starter:jar"
  2. [INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.6.9:compile

根据命令查询到的 spring boot 版本信息,我们在根据下面的版本列表对应关系选择合适的 Spring Cloud 以及 Spring Cloud Tencent 版本

版本列表

这里列出了不同 Spring Cloud 版本相对应的 Spring Cloud Tencent 版本。 您需要先查看您当前使用的 Spring Cloud 版本,从而确定需要引入的 Spring Cloud Tencent 版本。

Spring Boot 兼容版本Spring Cloud 版本Spring Cloud Tencent 版本
2.6.x2021.0.31.7.0-2021.0.3
2.4.x, 2.5.x2020.0.51.7.0-2020.0.5
2.2.x, 2.3.xHoxton.SR121.7.1-Hoxton.SR12
2.1.xGreenwich.SR61.5.3-Greenwich.SR6

接下来所有的示例我们将基于 Spring Cloud 版本为 2021.0.3、Spring Cloud Tencent 版本为 1.7.0-2021.0.3 开展。

服务注册

项目初始化

使用 jetbrain idea 等工具初始化一个 maven 项目

引入依赖

在上一步初始化好一个 maven 项目之后,我们在 pom.xml 中引入 Spring Cloud Tencent 相关依赖。

  • 引入 spring-boot-starter-web 进行启动一个 Web 服务,Spring Cloud 的项目要完成服务注册首先的是一个 Web 服务。
  • 引入 spring-cloud-tencent-dependencies 进行管理 Spring Cloud Tencent 相关组件的依赖版本。
  • 引入 spring-cloud-starter-tencent-polaris-discovery 实现 Spring Cloud 服务注册到北极星中。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.9</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. ...
  12. <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.tencent.cloud</groupId>
  16. <artifactId>spring-cloud-tencent-dependencies</artifactId>
  17. <version>1.7.0-2021.0.3</version>
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-dependencies</artifactId>
  24. <version>2021.0.3</version>
  25. <type>pom</type>
  26. <scope>import</scope>
  27. </dependency>
  28. </dependencies>
  29. </dependencyManagement>
  30. <dependencies>
  31. <!-- 简单的 Spring Cloud Web 依赖 -->
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-web</artifactId>
  35. </dependency>
  36. <!-- 引入 Spring Cloud Tencent 的服务注册发现依赖 -->
  37. <dependency>
  38. <groupId>com.tencent.cloud</groupId>
  39. <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
  40. </dependency>
  41. </dependencies>
  42. ...
  43. </project>
配置 application.yml

在 resources 目录下创建 application.yml 文件,并按照如下进行配置

  1. .
  2. ├── java
  3. └── com
  4. └── example
  5. └── springcloudpolarisquickstart
  6. └── SpringCloudProviderApplication.java
  7. └── resources
  8. └── application.yml

配置 application.yml

  1. server:
  2. port: 28888
  3. spring:
  4. application:
  5. name: EchoServer
  6. cloud:
  7. polaris:
  8. address: grpc://127.0.0.1:8091
  9. discovery:
  10. enabled: true
  11. stat:
  12. enabled: true
  13. port: 28082
示例代码
  1. @SpringBootApplication
  2. public class SpringCloudProviderApplication {
  3. @RestController
  4. static class EchoController {
  5. private final PolarisDiscoveryProperties properties;
  6. EchoController(PolarisDiscoveryProperties properties) {
  7. this.properties = properties;
  8. }
  9. @GetMapping(value = "/echo/{string}")
  10. public String echo(@PathVariable String string) {
  11. return "Hello PolarisMesh " + string + ", I'm " + properties.getService();
  12. }
  13. }
  14. public static void main(String[] args) {
  15. SpringApplication.run(SpringCloudProviderApplication.class, args);
  16. }
  17. }
验证
  1. 启动 Spring Cloud 应用
  2. 在 Spring Cloud 启动日志中,找到如下日志信息, 则表示 Spring Cloud 应用已经成功注册到北极星中。
  1. polaris registry, default EchoServer 10.21.6.17:28888 {} register finished
  1. 可以通过 curl 命令查询服务端是否有该实例。
  1. curl --location --request POST '127.0.0.1:8090/v1/Discover' \
  2. --header 'Content-Type: application/json' \
  3. --data-raw '{
  4. "type": 1,
  5. "service": {
  6. "name": "EchoServer",
  7. "namespace": "default"
  8. }
  9. }'

服务发现

项目初始化

使用 jetbrain idea 等工具初始化一个 maven 项目

引入依赖

在上一步初始化好一个 maven 项目之后,我们在 pom.xml 中引入 Spring Cloud Tencent 相关依赖。

  • 引入 spring-cloud-tencent-dependencies 进行管理 Spring Cloud Tencent 相关组件的依赖版本。
  • 引入 spring-cloud-starter-tencent-polaris-discovery 实现从北极星中发现服务。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.9</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. ...
  12. <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.tencent.cloud</groupId>
  16. <artifactId>spring-cloud-tencent-dependencies</artifactId>
  17. <version>1.7.0-2021.0.3</version>
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-dependencies</artifactId>
  24. <version>2021.0.3</version>
  25. <type>pom</type>
  26. <scope>import</scope>
  27. </dependency>
  28. </dependencies>
  29. </dependencyManagement>
  30. <dependencies>
  31. <!-- 简单的 Spring Cloud Web 依赖 -->
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-web</artifactId>
  35. </dependency>
  36. <!-- 引入 Spring Cloud Tencent 的服务注册发现依赖 -->
  37. <dependency>
  38. <groupId>com.tencent.cloud</groupId>
  39. <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
  40. </dependency>
  41. <!-- 引入 Feign 依赖实现 Feign 调用 -->
  42. <dependency>
  43. <groupId>org.springframework.cloud</groupId>
  44. <artifactId>spring-cloud-starter-openfeign</artifactId>
  45. </dependency>
  46. </dependencies>
  47. ...
  48. </project>
配置 application.yml

在 resources 目录下创建 application.yml 文件,并按照如下进行配置

  1. .
  2. ├── java
  3. └── com
  4. └── example
  5. └── spingcloudpolarisconsumer
  6. └── SpringCloudConsumerApplication.java
  7. └── resources
  8. └── application.yml

配置 application.yml

  1. server:
  2. port: 38888
  3. spring:
  4. application:
  5. name: EchoConsumer
  6. cloud:
  7. polaris:
  8. address: grpc://127.0.0.1:8091
  9. discovery:
  10. enabled: true
  11. stat:
  12. enabled: true
  13. port: 38082
示例代码

基于 RestTemplate 的服务发现调用

  1. @SpringBootApplication
  2. public class SpringCloudConsumerApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(SpringCloudConsumerApplication.class, args);
  5. }
  6. @LoadBalanced
  7. @Bean
  8. public RestTemplate restTemplate() {
  9. return new RestTemplate();
  10. }
  11. @RestController
  12. class EchoController {
  13. private final RestTemplate template;
  14. EchoController(RestTemplate template) {
  15. this.template = template;
  16. }
  17. @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
  18. public String echo(@PathVariable String val) {
  19. return template.getForObject("http://EchoServer/echo/" + val, String.class);
  20. }
  21. }
  22. }

基于 Feign 的服务发现调用

  1. @SpringBootApplication
  2. @EnableFeignClients
  3. public class SpringCloudPolarisConsumerApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(SpringCloudPolarisConsumerApplication.class, args);
  6. }
  7. @RestController
  8. static class EchoController {
  9. private final EchoServerClient client;
  10. EchoController(EchoServerClient client) {
  11. this.client = client;
  12. }
  13. @GetMapping(value = "/echo")
  14. public String echo(@RequestParam(name = "value") String val) {
  15. return client.echo(val);
  16. }
  17. }
  18. @FeignClient(name = "EchoServer")
  19. public interface EchoServerClient {
  20. @GetMapping("/echo/{value}")
  21. String echo(@PathVariable("value") String value);
  22. }
  23. }
验证

通过 curl 命令对服务消费者发起调用。

  1. curl --location --request GET '127.0.0.1:38888/echo?value=SCT'

预期的结果如下

  1. Hello PolarisMesh SCT, I'm EchoServer

动态配置

项目初始化

使用 jetbrain idea 等工具初始化一个 maven 项目

引入依赖

在上一步初始化好一个 maven 项目之后,我们在 pom.xml 中引入 Spring Cloud Tencent 相关依赖。

  • 引入 spring-cloud-tencent-dependencies 进行管理 Spring Cloud Tencent 相关组件的依赖版本。
  • 引入 spring-cloud-starter-tencent-polaris-config 实现 Spring Cloud 配置的动态管理。
  • 引入 spring-cloud-starter-bootstrap 以便可以支持 bootstrap.yml 的识别与加载
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-parent</artifactId>
  9. <version>2.6.10</version>
  10. <relativePath/> <!-- lookup parent from repository -->
  11. </parent>
  12. ...
  13. <dependencyManagement>
  14. <dependencies>
  15. <dependency>
  16. <groupId>com.tencent.cloud</groupId>
  17. <artifactId>spring-cloud-tencent-dependencies</artifactId>
  18. <version>1.7.0-2021.0.3</version>
  19. <type>pom</type>
  20. <scope>import</scope>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.cloud</groupId>
  24. <artifactId>spring-cloud-dependencies</artifactId>
  25. <version>2021.0.3</version>
  26. <type>pom</type>
  27. <scope>import</scope>
  28. </dependency>
  29. </dependencies>
  30. </dependencyManagement>
  31. <dependencies>
  32. ...
  33. <dependency>
  34. <groupId>com.tencent.cloud</groupId>
  35. <artifactId>spring-cloud-starter-tencent-polaris-config</artifactId>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.cloud</groupId>
  39. <artifactId>spring-cloud-starter-bootstrap</artifactId>
  40. </dependency>
  41. </dependencies>
  42. ...
  43. </project>
配置 bootstrap.yml

在 resources 目录下创建 bootstrap.yml 文件,并按照如下进行配置

  1. .
  2. ├── java
  3. └── com
  4. └── example
  5. └── springcloudtencentconfigdemo
  6. └── SpringCloudTencentConfigDemoApplication.java
  7. └── resources
  8. └── bootstrap.yml

配置 bootstrap.yml

  1. server:
  2. port: 48084
  3. spring:
  4. application:
  5. name: ConfigExample
  6. cloud:
  7. polaris:
  8. address: grpc://127.0.0.1:8091
  9. namespace: default
  10. config:
  11. auto-refresh: true # auto refresh when config file changed
  12. groups:
  13. - name: ${spring.application.name} # group name
  14. files: [ "config/user.properties" ]
示例代码
  1. @SpringBootApplication
  2. public class SpringCloudTencentConfigDemoApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(SpringCloudTencentConfigDemoApplication.class, args);
  5. }
  6. @RestController
  7. @RefreshScope
  8. public static class UserController{
  9. @Value("${name}")
  10. private String name;
  11. @GetMapping(value = "/name")
  12. public String name() {
  13. return name;
  14. }
  15. }
  16. }
创建配置分组以及配置文件
  • 创建配置分组 ConfigExample
  • 创建配置文件 config/user.properties

SpringCloud应用接入 - 图1

  • 编辑并发布配置文件 config/user.properties

SpringCloud应用接入 - 图2

验证
  1. 调用 curl —location —request GET ‘127.0.0.1:48084/name’ 查看返回值,预期返回 polarismesh
  2. 在线修改配置并发布

SpringCloud应用接入 - 图3

  1. 调用 curl —location —request GET ‘127.0.0.1:48084/name’ 查看返回值,预期返回 polarismesh@2021

服务路由

服务提供者

项目初始化

使用 jetbrain idea 等工具初始化一个 maven 项目

引入依赖

在上一步初始化好一个 maven 项目之后,我们在 pom.xml 中引入 Spring Cloud Tencent 相关依赖。

  • 引入 spring-cloud-tencent-dependencies 进行管理 Spring Cloud Tencent 相关组件的依赖版本。
  • 引入 spring-cloud-starter-tencent-polaris-discovery 实现 Spring Cloud 服务注册到北极星中。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.9</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. ...
  12. <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.tencent.cloud</groupId>
  16. <artifactId>spring-cloud-tencent-dependencies</artifactId>
  17. <version>1.7.0-2021.0.3</version>
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-dependencies</artifactId>
  24. <version>2021.0.3</version>
  25. <type>pom</type>
  26. <scope>import</scope>
  27. </dependency>
  28. </dependencies>
  29. </dependencyManagement>
  30. <dependencies>
  31. <!-- 简单的 Spring Cloud Web 依赖 -->
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-web</artifactId>
  35. </dependency>
  36. <!-- 引入 Spring Cloud Tencent 的服务注册发现依赖 -->
  37. <dependency>
  38. <groupId>com.tencent.cloud</groupId>
  39. <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
  40. </dependency>
  41. </dependencies>
  42. ...
  43. </project>
配置 application.yml

在 resources 目录下创建 application.yml 文件,并按照如下进行配置

  1. .
  2. ├── java
  3. └── com
  4. └── example
  5. └── springcloudpolarisquickstart
  6. └── SpringCloudProviderApplication.java
  7. └── resources
  8. └── application.yml

配置 application.yml

  1. server:
  2. port: 28888
  3. spring:
  4. application:
  5. name: RouterEchoServer
  6. cloud:
  7. tencent:
  8. metadata:
  9. content:
  10. env: dev1
  11. polaris:
  12. discovery:
  13. enabled: true
  14. stat:
  15. enabled: true
  16. port: 28082
  17. address: grpc://127.0.0.1:8091
示例代码
  1. @SpringBootApplication
  2. public class SpringCloudProviderApplication {
  3. @RestController
  4. static class EchoController {
  5. private final PolarisDiscoveryProperties properties;
  6. EchoController(PolarisDiscoveryProperties properties) {
  7. this.properties = properties;
  8. }
  9. @GetMapping(value = "/echo/{string}")
  10. public String echo(@PathVariable String string) {
  11. return "Hello PolarisMesh " + string + ", I'm " + properties.getService() + ":" + properties.getPort();
  12. }
  13. }
  14. public static void main(String[] args) {
  15. SpringApplication.run(SpringCloudProviderApplication.class, args);
  16. }
  17. }
运行
  1. 执行 mvn clean install 构建出 jar 运行包
  2. 按照以下命令启动两个服务提供者进程

启动第一个服务提供者

  1. java -Dspring.cloud.tencent.metadata.content.env=dev1 -Dserver.port=20001 -Dspring.cloud.polaris.stat.port=21001 -jar xxx.jar

启动第二个服务提供者

  1. java -Dspring.cloud.tencent.metadata.content.env=dev2 -Dserver.port=20002 -Dspring.cloud.polaris.stat.port=21002 -jar xxx.jar
确认实例注册情况

执行以下命令,查看该服务下的实例信息

  1. curl --location --request POST '127.0.0.1:8090/v1/Discover' \
  2. --header 'Content-Type: application/json' \
  3. --data-raw '{
  4. "type": 1,
  5. "service": {
  6. "name": "RouterEchoServer",
  7. "namespace": "default"
  8. }
  9. }'

服务调用者

项目初始化

使用 jetbrain idea 等工具初始化一个 maven 项目

引入依赖

在上一步初始化好一个 maven 项目之后,我们在 pom.xml 中引入 Spring Cloud Tencent 相关依赖。

  • 引入 spring-cloud-tencent-dependencies 进行管理 Spring Cloud Tencent 相关组件的依赖版本。
  • 引入 spring-cloud-starter-tencent-polaris-discovery 实现 Spring Cloud 服务注册到北极星中。
  • 引入 spring-cloud-starter-tencent-polaris-router 实现 Spring Cloud 的服务路由。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.9</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. ...
  12. <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.tencent.cloud</groupId>
  16. <artifactId>spring-cloud-tencent-dependencies</artifactId>
  17. <version>1.7.0-2021.0.3</version>
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-dependencies</artifactId>
  24. <version>2021.0.3</version>
  25. <type>pom</type>
  26. <scope>import</scope>
  27. </dependency>
  28. </dependencies>
  29. </dependencyManagement>
  30. <dependencies>
  31. <!-- 简单的 Spring Cloud Web 依赖 -->
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-web</artifactId>
  35. </dependency>
  36. <!-- 引入 Spring Cloud Tencent 的服务注册发现依赖 -->
  37. <dependency>
  38. <groupId>com.tencent.cloud</groupId>
  39. <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
  40. </dependency>
  41. <!-- 引入 Spring Cloud Tencent 的服务路由依赖 -->
  42. <dependency>
  43. <groupId>com.tencent.cloud</groupId>
  44. <artifactId>spring-cloud-starter-tencent-polaris-router</artifactId>
  45. </dependency>
  46. </dependencies>
  47. ...
  48. </project>
配置 application.yml

在 resources 目录下创建 application.yml 文件,并按照如下进行配置

  1. .
  2. ├── java
  3. └── com
  4. └── example
  5. └── springcloudpolarisquickstart
  6. └── SpringCloudConsumerApplication.java
  7. └── resources
  8. └── application.yml

配置 application.yml

  1. server:
  2. port: 38888
  3. spring:
  4. application:
  5. name: RouterEchoConsumer
  6. cloud:
  7. polaris:
  8. address: grpc://127.0.0.1:8091
  9. discovery:
  10. enabled: true
  11. stat:
  12. enabled: true
  13. port: 38082
示例代码
  1. @SpringBootApplication
  2. public class SpringCloudConsumerApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(SpringCloudConsumerApplication.class, args);
  5. }
  6. @LoadBalanced
  7. @Bean
  8. public RestTemplate restTemplate() {
  9. return new RestTemplate();
  10. }
  11. @RestController
  12. static class EchoController {
  13. private final RestTemplate restTemplate;
  14. EchoController(RestTemplate restTemplate) {
  15. this.restTemplate = restTemplate;
  16. }
  17. @GetMapping(value = "/echo")
  18. public String echo(@RequestHeader HttpHeaders headers, @RequestParam(name = "value") String val) {
  19. HttpEntity<String> entity = new HttpEntity<>(headers);
  20. ResponseEntity<String> response = restTemplate.exchange("http://RouterEchoServer/echo/" + val, HttpMethod.GET, entity, String.class);
  21. return response.getBody();
  22. }
  23. }
  24. }
设置 RouterEchoServer 的被调路由规则

SpringCloud应用接入 - 图4

验证
  • 携带 http header 信息为 ‘env: dev1’,可以观察到所有的请求只可被端口为20001的服务进程进行响应
  1. ~ curl -H 'env: dev1' http://127.0.0.1:38888/echo\?value\=hello
  2. Hello PolarisMesh hello, I'm RouterEchoServer:20001%
  3. ➜ ~ curl -H 'env: dev1' http://127.0.0.1:38888/echo\?value\=hello
  4. Hello PolarisMesh hello, I'm RouterEchoServer:20001%
  5. ~ curl -H 'env: dev1' http://127.0.0.1:38888/echo\?value\=hello
  6. Hello PolarisMesh hello, I'm RouterEchoServer:20001%
  7. ➜ ~ curl -H 'env: dev1' http://127.0.0.1:38888/echo\?value\=hello
  8. Hello PolarisMesh hello, I'm RouterEchoServer:20001%
  • 携带 http header 信息为 ‘env: dev2’,可以观察到所有的请求可被任意一个服务提供者进程进行响应
  1. ~ curl -H 'env: dev2' http://127.0.0.1:38888/echo\?value\=hello
  2. Hello PolarisMesh hello, I'm RouterEchoServer:20001%
  3. ➜ ~ curl -H 'env: dev2' http://127.0.0.1:38888/echo\?value\=hello
  4. Hello PolarisMesh hello, I'm RouterEchoServer:20002%
  5. ~ curl -H 'env: dev2' http://127.0.0.1:38888/echo\?value\=hello
  6. Hello PolarisMesh hello, I'm RouterEchoServer:20001%
  7. ➜ ~ curl -H 'env: dev2' http://127.0.0.1:38888/echo\?value\=hello
  8. Hello PolarisMesh hello, I'm RouterEchoServer:20002%
  9. ~ curl -H 'env: dev2' http://127.0.0.1:38888/echo\?value\=hello
  10. Hello PolarisMesh hello, I'm RouterEchoServer:20001%

单机服务限流

项目初始化

使用 jetbrain idea 等工具初始化一个 Spring Cloud 项目

引入依赖

在上一步初始化好一个 maven 项目之后,我们在 pom.xml 中引入 Spring Cloud Tencent 相关依赖。

  • 引入 spring-cloud-tencent-dependencies 进行管理 Spring Cloud Tencent 相关组件的依赖版本。
  • 引入 spring-cloud-starter-tencent-polaris-discovery 实现通过 Feign 或者 RestTemplate 完成服务调用。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.11</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. ...
  12. <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.tencent.cloud</groupId>
  16. <artifactId>spring-cloud-tencent-dependencies</artifactId>
  17. <version>1.7.0-2021.0.3</version>
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-dependencies</artifactId>
  24. <version>2021.0.3</version>
  25. <type>pom</type>
  26. <scope>import</scope>
  27. </dependency>
  28. </dependencies>
  29. </dependencyManagement>
  30. <dependencies>
  31. ...
  32. <!-- 北极星服务注册发现依赖 -->
  33. <dependency>
  34. <groupId>com.tencent.cloud</groupId>
  35. <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
  36. </dependency>
  37. <!-- 北极星服务限流依赖 -->
  38. <dependency>
  39. <groupId>com.tencent.cloud</groupId>
  40. <artifactId>spring-cloud-starter-tencent-polaris-ratelimit</artifactId>
  41. </dependency>
  42. ...
  43. </dependencies>
  44. ...
  45. </project>
配置 application.yml

在 resources 目录下创建 application.yml 文件,并按照如下进行配置

  1. .
  2. ├── java
  3. └── com
  4. └── example
  5. └── spingcloudpolarisratelimit
  6. └── SpringCloudRateLimitApplication.java
  7. └── resources
  8. └── application.yaml

配置 application.yml

  1. server:
  2. port: 38888
  3. spring:
  4. application:
  5. name: RateLimitEchoServer
  6. cloud:
  7. polaris:
  8. address: grpc://127.0.0.1:8091
  9. discovery:
  10. enabled: true
  11. stat:
  12. enabled: true
  13. port: 38082
示例代码
  1. @SpringBootApplication
  2. public class SpringCloudRateLimitApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(SpringCloudRateLimitApplication.class, args);
  5. }
  6. @RestController
  7. static class EchoController {
  8. @GetMapping(value = "/echo")
  9. public String echo() {
  10. return "Hello PolarisMesh , I'm RateLimit Demo";
  11. }
  12. }
  13. }
配置限流规则

为服务 EchoServer 创建一条限流规则

SpringCloud应用接入 - 图5

验证

通过 curl 命令快速发起多次查询,查看是否触发限流

  1. curl --location --request GET '127.0.0.1:38888/echo'

预期的结果如下

  1. curl --location --request GET '127.0.0.1:38888/echo'
  2. Hello PolarisMesh , I'm RateLimit Demo%
  3. ➜ curl --location --request GET '127.0.0.1:38888/echo'
  4. The request is denied by rate limit because the throttling threshold is reached%
  5. ➜ curl --location --request GET '127.0.0.1:38888/echo'
  6. Hello PolarisMesh , I'm RateLimit Demo%

分布式服务限流

安装北极星分布式限流服务端

具体操作参见 Polaris 分布式限流服务端安装

项目初始化

使用 jetbrain idea 等工具初始化一个 Spring Cloud 项目

引入依赖

在上一步初始化好一个 maven 项目之后,我们在 pom.xml 中引入 Spring Cloud Tencent 相关依赖。

  • 引入 spring-cloud-tencent-dependencies 进行管理 Spring Cloud Tencent 相关组件的依赖版本。
  • 引入 spring-cloud-starter-tencent-polaris-discovery 实现通过 Feign 或者 RestTemplate 完成服务调用。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.11</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. ...
  12. <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.tencent.cloud</groupId>
  16. <artifactId>spring-cloud-tencent-dependencies</artifactId>
  17. <version>1.7.0-2021.0.3</version>
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-dependencies</artifactId>
  24. <version>2021.0.3</version>
  25. <type>pom</type>
  26. <scope>import</scope>
  27. </dependency>
  28. </dependencies>
  29. </dependencyManagement>
  30. <dependencies>
  31. ...
  32. <!-- 北极星服务注册发现依赖 -->
  33. <dependency>
  34. <groupId>com.tencent.cloud</groupId>
  35. <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
  36. </dependency>
  37. <!-- 北极星服务限流依赖 -->
  38. <dependency>
  39. <groupId>com.tencent.cloud</groupId>
  40. <artifactId>spring-cloud-starter-tencent-polaris-ratelimit</artifactId>
  41. </dependency>
  42. ...
  43. </dependencies>
  44. ...
  45. </project>
配置 application.yml

在 resources 目录下创建 application.yml 文件 文件以及 polaris.yml,并按照如下进行配置

  1. .
  2. ├── java
  3. └── com
  4. └── example
  5. └── spingcloudpolarisratelimit
  6. └── SpringCloudRateLimitApplication.java
  7. └── resources
  8. ├── polaris.yml
  9. └── application.yaml

配置 application.yml

  1. server:
  2. port: 38888
  3. spring:
  4. application:
  5. name: RateLimitEchoServer
  6. cloud:
  7. polaris:
  8. address: grpc://127.0.0.1:8091
  9. discovery:
  10. enabled: true
  11. stat:
  12. enabled: true
  13. port: 38082

配置 polaris.yml

  1. # 被调方配置
  2. provider:
  3. rateLimit:
  4. # 是否开启限流功能
  5. enable: true
  6. # 限流服务的命名空间
  7. limiterNamespace: Polaris
  8. # 限流服务名
  9. limiterService: polaris.limiter
示例代码
  1. @SpringBootApplication
  2. public class SpringCloudRateLimitApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(SpringCloudRateLimitApplication.class, args);
  5. }
  6. @RestController
  7. static class EchoController {
  8. @GetMapping(value = "/echo")
  9. public String echo() {
  10. return "Hello PolarisMesh , I'm RateLimit Demo";
  11. }
  12. }
  13. }
配置限流规则

为服务 EchoServer 创建一条限流规则

SpringCloud应用接入 - 图6

验证

通过 curl 命令快速发起多次查询,查看是否触发限流

  1. curl --location --request GET '127.0.0.1:38888/echo'

预期的结果如下

  1. curl --location --request GET '127.0.0.1:38888/echo'
  2. Hello PolarisMesh , I'm RateLimit Demo%
  3. ➜ curl --location --request GET '127.0.0.1:38888/echo'
  4. The request is denied by rate limit because the throttling threshold is reached%
  5. ➜ curl --location --request GET '127.0.0.1:38888/echo'
  6. Hello PolarisMesh , I'm RateLimit Demo%

服务熔断

服务提供者

项目初始化

使用 jetbrain idea 等工具初始化一个 maven 项目

引入依赖

在上一步初始化好一个 maven 项目之后,我们在 pom.xml 中引入 Spring Cloud Tencent 相关依赖。

  • 引入 spring-cloud-tencent-dependencies 进行管理 Spring Cloud Tencent 相关组件的依赖版本。
  • 引入 spring-cloud-starter-tencent-polaris-discovery 实现 Spring Cloud 服务注册到北极星中。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.9</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. ...
  12. <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.tencent.cloud</groupId>
  16. <artifactId>spring-cloud-tencent-dependencies</artifactId>
  17. <version>1.7.0-2021.0.3</version>
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-dependencies</artifactId>
  24. <version>2021.0.3</version>
  25. <type>pom</type>
  26. <scope>import</scope>
  27. </dependency>
  28. </dependencies>
  29. </dependencyManagement>
  30. <dependencies>
  31. <!-- 简单的 Spring Cloud Web 依赖 -->
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-web</artifactId>
  35. </dependency>
  36. <!-- 引入 Spring Cloud Tencent 的服务注册发现依赖 -->
  37. <dependency>
  38. <groupId>com.tencent.cloud</groupId>
  39. <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
  40. </dependency>
  41. </dependencies>
  42. ...
  43. </project>
配置 application.yml

在 resources 目录下创建 application.yml,并按照如下进行配置

  1. .
  2. ├── java
  3. └── com
  4. └── example
  5. └── springcloudpolarisquickstart
  6. └── SpringCloudProviderApplication.java
  7. └── resources
  8. └── application.yml

配置 application.yml

  1. server:
  2. port: 28888
  3. spring:
  4. application:
  5. name: CircuitBreakerEchoServer
  6. cloud:
  7. tencent:
  8. metadata:
  9. content:
  10. env: dev1
  11. polaris:
  12. discovery:
  13. enabled: true
  14. stat:
  15. enabled: true
  16. port: 28082
  17. address: grpc://127.0.0.1:8091
示例代码
  1. @SpringBootApplication
  2. public class SpringCloudProviderApplication {
  3. @RestController
  4. static class EchoController {
  5. private final PolarisDiscoveryProperties properties;
  6. EchoController(PolarisDiscoveryProperties properties) {
  7. this.properties = properties;
  8. }
  9. @GetMapping(value = "/echo/{string}")
  10. public ResponseEntity<String> echo(@PathVariable String string) {
  11. String badService = System.getProperty("BAD_SERVICE");
  12. if (Objects.equals(badService, "true")) {
  13. return new ResponseEntity<>("I'm bad, " + properties.getService() + ":" + properties.getPort(), HttpStatus.BAD_GATEWAY);
  14. }
  15. String val = "Hello PolarisMesh " + string + ", I'm " + properties.getService() + ":" + properties.getPort();
  16. return new ResponseEntity<>(val, HttpStatus.OK);
  17. }
  18. }
  19. public static void main(String[] args) {
  20. SpringApplication.run(SpringCloudProviderApplication.class, args);
  21. }
  22. }
运行
  1. 执行 mvn clean install 构建出 jar 运行包
  2. 按照以下命令启动两个服务提供者进程

启动第一个服务提供者

  1. java -DBAD_SERVICE=false -Dserver.port=20001 -Dspring.cloud.polaris.stat.port=21001 -jar xxx.jar

启动第二个服务提供者

  1. java -DBAD_SERVICE=true -Dserver.port=20002 -Dspring.cloud.polaris.stat.port=21002 -jar xxx.jar
确认实例注册情况

执行以下命令,查看该服务下的实例信息

  1. curl --location --request POST '127.0.0.1:8090/v1/Discover' \
  2. --header 'Content-Type: application/json' \
  3. --data-raw '{
  4. "type": 1,
  5. "service": {
  6. "name": "CircuitBreakerEchoServer",
  7. "namespace": "default"
  8. }
  9. }'

服务调用者

项目初始化

使用 jetbrain idea 等工具初始化一个 maven 项目

引入依赖

在上一步初始化好一个 maven 项目之后,我们在 pom.xml 中引入 Spring Cloud Tencent 相关依赖。

  • 引入 spring-cloud-tencent-dependencies 进行管理 Spring Cloud Tencent 相关组件的依赖版本。
  • 引入 spring-cloud-starter-tencent-polaris-discovery 实现 Spring Cloud 服务注册到北极星中。
  • 引入 spring-cloud-starter-tencent-polaris-circuitbreaker 实现 Spring Cloud 的服务调用熔断。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.9</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. ...
  12. <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.tencent.cloud</groupId>
  16. <artifactId>spring-cloud-tencent-dependencies</artifactId>
  17. <version>1.7.0-2021.0.3</version>
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-dependencies</artifactId>
  24. <version>2021.0.3</version>
  25. <type>pom</type>
  26. <scope>import</scope>
  27. </dependency>
  28. </dependencies>
  29. </dependencyManagement>
  30. <dependencies>
  31. <!-- 简单的 Spring Cloud Web 依赖 -->
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-web</artifactId>
  35. </dependency>
  36. <!-- 引入 Spring Cloud Tencent 的服务注册发现依赖 -->
  37. <dependency>
  38. <groupId>com.tencent.cloud</groupId>
  39. <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
  40. </dependency>
  41. <!-- 引入 Spring Cloud Tencent 的服务熔断依赖 -->
  42. <dependency>
  43. <groupId>com.tencent.cloud</groupId>
  44. <artifactId>spring-cloud-starter-tencent-polaris-circuitbreaker</artifactId>
  45. </dependency>
  46. <!-- 引入 Spring Cloud 的 LoadBalancer 定义 -->
  47. <dependency>
  48. <groupId>org.springframework.cloud</groupId>
  49. <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  50. </dependency>
  51. </dependencies>
  52. ...
  53. </project>
配置 application.yml

在 resources 目录下创建 application.yml 文件,并按照如下进行配置

  1. .
  2. ├── java
  3. └── com
  4. └── example
  5. └── springcloudpolarisquickstart
  6. └── SpringCloudConsumerApplication.java
  7. └── resources
  8. └── application.yml

配置 application.yml

  1. server:
  2. port: 38888
  3. spring:
  4. application:
  5. name: CircuitBreakerEchoConsumer
  6. cloud:
  7. polaris:
  8. address: grpc://127.0.0.1:8091
  9. discovery:
  10. enabled: true
  11. stat:
  12. enabled: true
  13. port: 38082
  14. loadbalancer:
  15. configurations: polaris
  16. tencent:
  17. rpc-enhancement:
  18. enabled: true
  19. reporter:
  20. ignore-internal-server-error: true
  21. series: server_error
  22. statuses: gateway_timeout, bad_gateway, service_unavailable
示例代码
  1. @SpringBootApplication
  2. public class SpringCloudConsumerApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(SpringCloudConsumerApplication.class, args);
  5. }
  6. @LoadBalanced
  7. @Bean
  8. public RestTemplate restTemplate() {
  9. return new RestTemplate();
  10. }
  11. @RestController
  12. static class EchoController {
  13. private final RestTemplate restTemplate;
  14. EchoController(RestTemplate restTemplate) {
  15. this.restTemplate = restTemplate;
  16. }
  17. @GetMapping(value = "/echo")
  18. public String echo(@RequestHeader HttpHeaders headers, @RequestParam(name = "value") String val) {
  19. HttpEntity<String> entity = new HttpEntity<>(headers);
  20. ResponseEntity<String> response = restTemplate.exchange("http://CircuitBreakerEchoServer/echo/" + val, HttpMethod.GET, entity, String.class);
  21. return response.getBody();
  22. }
  23. }
  24. }
设置 CircuitBreakerEchoServer 的被调熔断规则

SpringCloud应用接入 - 图7

验证
  • 快速发起多次 curl 命令调用,出现过几次错误请求响应之后,所有的请求将全部由端口为20001的进程进行响应
  1. ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  2. Hello PolarisMesh hello, I'm EchoServer:20001%
  3. ➜ ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  4. I'm bad, EchoServer:20002%
  5. ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  6. Hello PolarisMesh hello, I'm EchoServer:20001%
  7. ➜ ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  8. I'm bad, EchoServer:20002%
  9. ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  10. Hello PolarisMesh hello, I'm EchoServer:20001%
  11. ➜ ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  12. I'm bad, EchoServer:20002%
  13. ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  14. Hello PolarisMesh hello, I'm EchoServer:20001%
  15. ➜ ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  16. Hello PolarisMesh hello, I'm EchoServer:20001%
  17. ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  18. Hello PolarisMesh hello, I'm EchoServer:20001%
  19. ➜ ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  20. Hello PolarisMesh hello, I'm EchoServer:20001%
  21. ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  22. Hello PolarisMesh hello, I'm EchoServer:20001%
  23. ➜ ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  24. Hello PolarisMesh hello, I'm EchoServer:20001%
  25. ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'
  26. Hello PolarisMesh hello, I'm EchoServer:20001%
  27. ➜ ~ curl --location --request GET '127.0.0.1:38888/echo?value=hello'

常见问题(FAQ)

Spring Cloud 或者 Spring Cloud Tencent 的依赖无法拉到本地

  • pom.xml 的 <dependencyManagement></dependencyManagement> 标签内部务必按照下面的示例加上。
  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-dependencies</artifactId>
  6. <version>${ Spring Cloud 的版本 }</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. <dependency>
  11. <groupId>com.tencent.cloud</groupId>
  12. <artifactId>spring-cloud-tencent-dependencies</artifactId>
  13. <version>${ 与 Spring Cloud 版本对应的 SCT 版本 }</version>
  14. <type>pom</type>
  15. <scope>import</scope>
  16. </dependency>
  17. </dependencies>
  18. </dependencyManagement>
  • 确认 Maven 的 setting.xml 中是否正确配置了 release 仓库地址以及 snapshot 仓库地址,
  1. <settings>
  2. ...
  3. <profiles>
  4. <profile>
  5. <id>sonatype</id>
  6. <properties>
  7. <downloadSources>true</downloadSources>
  8. <downloadJavadocs>true</downloadJavadocs>
  9. </properties>
  10. <repositories>
  11. <repository>
  12. <id>nexus-snapshots</id>
  13. <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
  14. <releases>
  15. <enabled>false</enabled>
  16. </releases>
  17. <snapshots>
  18. <enabled>true</enabled>
  19. </snapshots>
  20. </repository>
  21. <repository>
  22. <id>nexus-releases</id>
  23. <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
  24. <releases>
  25. <enabled>true</enabled>
  26. </releases>
  27. <snapshots>
  28. <enabled>false</enabled>
  29. </snapshots>
  30. </repository>
  31. </repositories>
  32. </profile>
  33. </profiles>
  34. ...
  35. </settings>
  • 确认 jetbrains IDEA 开启了拉取 maven 的 snapshot 依赖

步骤:在IntelliJ IDEA的 File -> Settings -> Build,Execution,Deployment -> Build Tools -> Maven 配置中勾选上 Always update snapshots 选项然后保存后再重新 Maven Reimport 即可

SpringCloud应用接入 - 图8

Spring Cloud 应用无法注册到北极星

  • 确保项目引入了 spring-boot-starter-web 或者引入 spring-boot-starter-webflux
  • 确保项目引入了 spring-cloud-tencent-dependencies 以及 spring-cloud-starter-tencent-polaris-discovery

由于在 Spring Cloud 的设计中,一个 Spring Cloud 服务要触发注册动作,必须要有 WebServerInitializedEvent 事件。

无法通过 RestTemplate 从北极星发现服务并发起调用

  • 确保项目引入了 spring-cloud-tencent-dependencies 以及 spring-cloud-starter-tencent-polaris-discovery
  • 确保按照如下代码对 RestTemple 创建 bean 以及引入 LoadBalancer 能力
  1. @LoadBalanced
  2. @Bean
  3. public RestTemplate restTemplate() {
  4. return new RestTemplate();
  5. }

无法通过 Feign 从北极星发现服务并发起调用

  • 确保 @FeignClient 注解中的 url 不要指定任何路径

错误示例

  1. @FeignClient(name = "EchoServer", url = "https://172.0.0.1")
  2. public interface EchoServerClient {
  3. @RequestMapping(value = "/search/users", method = RequestMethod.GET)
  4. String searchUsers(@RequestParam("q") String queryStr);
  5. }

为什么无法识别我配置的 bootstrap.yml 文件,并且 profile 不生效

Spring Cloud 官方文档介绍SpringCloud应用接入 - 图9 (opens new window)

Spring Boot 2.4, the bootstrap context initialization (bootstrap.yml, bootstrap.properties) of property sources was deprecated.

因此,如果用户希望继续在 Spring Boot 2.4 之上使用 bootstrap.yml 的话,可以通过添加 spring-cloud-starter-bootstrap 进行解决

  • 添加 bootstrap 的依赖
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-bootstrap</artifactId>
  4. </dependency>

对于 profile 不生效的问题,请确保尊从以下使用方式

  • 使用 application.yml

如果一开始使用了 application.yml 的话,则 profile 的文件名称只能为 application-{profile}.yml

  • 使用 bootstrap.yml

如果一开始使用了 bootstrap.yml 的话,则 profile 的文件名称只能为 bootstrap-{profile}.yml

注意事项

如果使用 application.yml,但是 profile 文件名称为 bootstrap-{profile}.yml,那么 profile 是无法生效的