Spring Cloud 配置中心详解:微服务动态读取与案例示范

news/2024/10/19 7:34:02/

微服务架构中,每个微服务往往都有其独立的配置,这些配置可能会根据环境的不同(开发、测试、生产)进行调整和变化。Spring Cloud 配置中心提供了一种集中化管理和动态更新微服务配置的解决方案。在本文中,我们将详细介绍 Spring Cloud 配置中心的基本原理、配置方式以及案例示范实现微服务的动态读取。


1. 什么是 Spring Cloud 配置中心

Spring Cloud Config(配置中心)是一个为分布式系统提供集中式外部配置的工具。它可以让你将配置文件存储在一个集中化的服务器上,并且可以实时更新微服务的配置,而无需重新启动服务。

Spring Cloud 配置中心的特点

  • 集中式配置管理:支持将配置文件集中存储在版本控制系统(如 Git)中。
  • 动态更新配置:通过 Spring Cloud Bus 实现配置的实时更新,无需重启服务。
  • 支持多环境:根据不同的环境(如开发、测试、生产)动态加载不同的配置。

在一个典型的微服务架构中,配置中心通常用于集中管理服务之间的公共配置(如数据库连接、消息队列配置等)以及个性化配置。


2. 电商交易系统中的配置中心应用

在电商交易系统中,配置中心的应用主要体现在集中管理各个微服务的配置信息,如数据库连接、消息队列、支付系统配置等。通过 Spring Cloud Config 配置中心,电商交易系统中的微服务可以动态获取并实时更新配置,而无需手动修改每个微服务的配置文件。

2.1 配置中心的搭建与配置

首先,我们需要搭建 Spring Cloud Config 服务器,并将配置文件集中存储在 Git 仓库中。接下来,我们配置电商系统中的各个微服务作为配置中心的客户端,从服务器中获取配置。

2.2 配置中心的完整代码示例
2.2.1 配置中心服务器的配置

1. 引入 Spring Cloud Config Server 依赖

config-server 项目的 pom.xml 中,加入以下依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId>
</dependency>

2. 启用配置中心服务

ConfigServerApplication.java 中,启用配置中心服务:

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);}
}

3. 配置中心服务器的 Git 仓库配置

application.yml 中,配置 Git 仓库地址和分支:

server:port: 8888spring:cloud:config:server:git:uri: https://github.com/your-repo/config-repo.git  # 配置文件存储的 Git 仓库地址clone-on-start: true  # 启动时拉取 Git 仓库的内容search-paths: "{application}"  # 搜索配置文件的路径

config-repo 仓库中,假设有一个电商系统的订单服务配置文件 order-service.yml

spring:datasource:url: jdbc:mysql://localhost:3306/ordersusername: rootpassword: rootorder:service:tax-rate: 0.08  # 订单的默认税率
2.2.2 配置中心客户端(微服务)的配置

现在,我们配置电商系统中的某个微服务,如订单服务(Order Service),作为配置中心的客户端。

1. 引入 Spring Cloud Config Client 依赖

order-service 微服务pom.xml 中,加入 Spring Cloud Config Client 依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
</dependency>

2. 配置微服务连接配置中心

bootstrap.yml 中配置连接到配置中心服务器的地址:

spring:application:name: order-service  # 微服务名称,决定从哪个配置文件读取spring:cloud:config:uri: http://localhost:8888  # 配置中心服务器地址

3. 获取配置值

在订单服务中,我们可以通过 @Value 注解动态获取配置中心中的值:

@RestController
@RequestMapping("/orders")
public class OrderController {@Value("${spring.datasource.url}")private String datasourceUrl;@Value("${order.service.tax-rate}")private double taxRate;@GetMapping("/config")public ResponseEntity<String> getConfig() {String configInfo = "Datasource URL: " + datasourceUrl + "\n" + "Tax Rate: " + taxRate;return ResponseEntity.ok(configInfo);}
}

在上面的代码中,我们动态从配置中心读取了数据库连接 URL 和订单税率的配置值,并通过 /orders/config 接口返回给客户端。

2.3 动态更新配置

为了使微服务能够在配置中心的配置文件更新后无需重启就能实时应用新配置,我们可以使用 Spring Cloud Bus 实现动态更新。

2.3.1 引入 Spring Cloud Bus 依赖

在订单服务的 pom.xml 中,加入 Spring Cloud Bus 的依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>  <!-- 这里我们使用 RabbitMQ 作为消息代理 -->
</dependency>

同时确保配置中心服务器的 pom.xml 也包含相同的依赖。

2.3.2 配置消息总线

application.yml 中,配置消息总线的参数(假设使用 RabbitMQ):

spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest
2.3.3 手动触发配置刷新

当我们在 Git 仓库中修改了配置文件(如 order-service.yml)后,可以通过以下命令手动通知配置中心更新配置:

curl -X POST http://localhost:8888/actuator/bus-refresh

这样,配置中心会将配置变化通过消息总线广播给所有微服务微服务会自动拉取最新的配置。

2.3.4 订单服务中处理动态更新

为了使得动态更新配置生效,我们可以使用 Spring 的 @RefreshScope 注解。

@RestController
@RequestMapping("/orders")
@RefreshScope
public class OrderController {@Value("${spring.datasource.url}")private String datasourceUrl;@Value("${order.service.tax-rate}")private double taxRate;@GetMapping("/config")public ResponseEntity<String> getConfig() {String configInfo = "Datasource URL: " + datasourceUrl + "\n" + "Tax Rate: " + taxRate;return ResponseEntity.ok(configInfo);}
}

当配置更新后,使用 @RefreshScope 注解的 OrderController 类中的配置会自动刷新,而无需重启服务。


2.4 微服务中获取最新配置的完整流程时序图

在这里插入图片描述

时序图详细描述了以下步骤:

  1. 开发者修改 Git 仓库中的配置文件。
  2. 配置中心检测到配置文件变化并通知微服务更新配置。
  3. 微服务通过消息总线(RabbitMQ)监听到配置变化,主动拉取最新配置并更新服务。

3. 常见问题及解决方案

3.1 问题 1:客户端获取不到最新配置

问题描述:客户端服务未能及时获取最新的配置。

解决方案

  1. 确保配置中心服务器已经从 Git 仓库拉取到最新的配置。
  2. 确保客户端微服务bootstrap.yml 配置正确,能够连接到配置中心。
  3. 如果启用了 Spring Cloud Bus,请确保 RabbitMQ 或其他消息代理服务运行正常。
3.2 问题 2:配置无法动态刷新

问题描述:客户端服务在配置更新后,无法立即应用新配置。

解决方案

  1. 确保 Spring Cloud Bus 已正确配置,且消息代理服务(如 RabbitMQ)已启动。
  2. 使用 curl -X POST http://localhost:8888/actuator/bus-refresh 手动触发配置刷新。
3.3 问题 3:配置文件中的敏感信息泄露

问题描述:配置文件中可能包含数据库密码等敏感信息,直接存储在 Git 仓库中可能存在安全风险。

解决方案

  1. 使用 Spring Cloud Config 的加密功能,将敏感信息进行加密存储。可以通过 spring-cloud-config-server 内置的加密/解密机制来处理敏感信息。
  2. 配置加密示例:
encrypt:key: your-secret-key  # 配置加密密钥

加密后的敏感信息存储在配置文件中,例如数据库密码:

spring:datasource:password: {cipher}YOUR_ENCRYPTED_PASSWORD


http://www.ppmy.cn/news/1538917.html

相关文章

鸿蒙开发之ArkUI 界面篇 三十四 容器组件Tabs 自定义TabBar

如果需要修改Tabs的图标和文字之间的距离我们该怎么办呢&#xff1f;好在tabBar是联合类型&#xff0c;提供了自定义tabBar&#xff0c;这里就可以显示特殊图标或者是文字图片&#xff0c;如下图&#xff1a; 这里定义了myBuilder的函数&#xff0c;用了 来修饰&#xff0c;没有…

nginx作为反向代理服务器:代理MySQL、Postgresql、Redis及多个TCP服务

https://www.cnblogs.com/echohye/p/18289809 使用 Nginx 作为反向代理服务器&#xff0c;可以代理 MySQL、PostgreSQL、Redis 及多个 TCP 服务。这需要配置 Nginx 的 stream 模块。 以下是详细的配置步骤&#xff1a; 1. 确保 Nginx 支持 stream 模块 首先&#xff0c;确保…

Go相关工具

本篇内容是根据2019年6月份#90 Go tooling音频录制内容的整理与翻译 这一期谈论我们每天使用的工具来帮助提高工作效率&#xff01;这对于那些刚接触 Go 工具的人来说是一个很好的介绍&#xff0c;并围绕我们使用其中一些工具多年后对它们的看法进行了一些讨论。 过程中为符合中…

JavaWeb(Servlet编程)第三章

一&#xff0c;常用页面跳转方法1&#xff1a;重定向 通过HttpServletResponse的sendRedirect()方法来跳转到本地URL void sendRedirect(String locationURL) locationURL形式&#xff1a;URL[?参数名称1参数值1&参数名称2参数值2&…] 只能传递字符串&#xff0c;不…

HTB:Base[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which two TCP ports are open on the remote host? 2.What is the relative path on the webserver for the login page? 3.How many files are present in the /login directory? 4.What is the file extension of a swap file? …

charAt,chartCodeAt,codePointAt,fromCodePoint,fromCharCode

生僻字的length算2,有些空格是特殊空格,比如\u3000 u3000不是全角空格&#xff0c;u3000是表意字空格&#xff08;Ideographic Space&#xff09;&#xff0c;宽度和一个表意字&#xff08;汉字&#xff09;相同。它应当被当做汉字来处理。比如&#xff0c;在一些排版中&#x…

SpringBoot高校学科竞赛平台:性能优化与实践

3系统分析 3.1可行性分析 通过对本高校学科竞赛平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本高校学科竞赛平台采用SSM框架&#xff0c;JAVA作为开发语…

大模型百科:超详细解读与学习路线图

大模型的定义 大模型是指具有数千万甚至数亿参数的深度学习模型。近年来&#xff0c;随着计算机技术和大数据的快速发展&#xff0c;深度学习在各个领域取得了显著的成果&#xff0c;如自然语言处理&#xff0c;图片生成&#xff0c;工业数字化等。为了提高模型的性能&#xf…