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

在微服务架构中,每个微服务往往都有其独立的配置,这些配置可能会根据环境的不同(开发、测试、生产)进行调整和变化。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.rhkb.cn/news/444513.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringSecurity(三)——自定义优化器

在SpringSecurity中&#xff0c;如果我们在认证或者授权的过程中出现了异常会被ExceptionTranslationFilter捕 获到。在ExceptionTranslationFilter中会去判断是认证失败还是授权失败出现的异常。 一、自定义验证异常类 创建exception包&#xff0c;在exception包下创建自定义…

centos7.9升级rockylinux8.8

前言 查看centos的版本 &#xff0c;我这台服务器是虚拟机,下面都是模拟实验 升级前一定要把服务器上配置文件&#xff0c;数据等进行备份 [rootlocalhost ~]#cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]#uname -a Linux jenkins_ser…

爱吃蟠桃的孙悟空

文章目录 1. 题目描述2. 实现3. 整体思路4. 函数定义及参数解释5.二分查找过程6.主函数部分 1. 题目描述 2. 实现 #include <iostream> #include <vector> #include <algorithm>using namespace std;int findMinEatingSpeed(vector<int>& piles, …

selenium:Select类操作复选框和下拉框(7)

复选框/下拉框操作的Select类 主要使用selinium中的类Select来模拟选择网页上的下拉框或者复选框中的内容&#xff0c;使用前先导入 from selenium.webdriver.support.ui import Select 主要方法如下&#xff1a; 函数 功能 select_by_value 根据复选框/下拉框的值选择 se…

【含开题报告+文档+PPT+源码】基于springBoot+vue超市仓库管理系统的设计与实现

开题报告 随着电子商务的快速发展和物流行业的日益壮大&#xff0c;超市仓库管理系统的重要性也日益凸显。传统的超市仓库管理方式存在许多问题&#xff0c;比如人工操作繁琐、数据统计不准确、管理效率低下等。因此&#xff0c;需要设计和实现一个高效、智能的超市仓库管理系…

mig IP核的学习

mig全称是Memory Interface Generator。 参考自视频&#xff1a;MIG IP配置_哔哩哔哩_bilibili DDR基础知识 时钟类型 使用流程 选择DDR3 16是数据线的位宽&#xff0c;能在信号中看出来 这里的clock period 不太明白清楚 文章中怎么选择clock period 靠的是 芯片型号中的…

在培训考试小程序页面弹出半屏的弹窗交互实践

如果在页面内进行复杂的界面设计&#xff08;如在页面内弹出半屏的弹窗、在页面内加载一个全屏的子页面等&#xff09;&#xff0c;用户进行返回操作会直接离开当前页面&#xff0c;不符合用户预期&#xff0c;预期应为关闭当前弹出的组件。 为此提供“假页”容器组件page-con…

JSON 格式化工具:快速便捷地格式化和查看 JSON 数据

JSON 格式化工具&#xff1a;快速便捷地格式化和查看 JSON 数据 为什么需要 JSON 格式化工具&#xff1f; 在日常开发和调试中&#xff0c;JSON 是非常常见的数据交换格式。无论是前端与后端的接口调用&#xff0c;还是数据存储和处理&#xff0c;JSON 格式都扮演着重要角色。…

Windows 安装 MySQL

1. 下载MySQL安装包 访问&#xff1a;MySQL :: Download MySQL Installer选择适合的版本。推荐下载 MySQL Installer for Windows&#xff0c;该安装包包含所有必要的组件选择 Windows (x86, 32-bit), MSI Installer 或 Windows (x86, 64-bit), MSI Installer 2. 运行安装程序…

洛谷P5723、P5728、P1428、P1319 Python解析

P5723 完整代码 def is_prime(y):if y < 2:return Falsefor i in range(2, int(y**0.5) 1):if y % i 0:return Falsereturn Truen int(input()) sum_primes 0 x 0if n < 2:print("0") elif n 2:print("2\n1") else:for i in range(2, n 1):i…

coredump设置

coredump路径查看及设置 coredump路径查看 命令1&#xff1a; cat /proc/sys/kernel/core_pattern 命令2&#xff1a; /sbin/sysctl kernel.core_pattern coredump路径修改 临时修改&#xff1a;echo ‘/var/log/%e.core.%p’ > /proc/sys/kernel/core_pattern 永久修改…

Python网络爬虫从入门到实战

目录 引言 一、网络爬虫的概念 二、 网络爬虫的基本工作流程 &#xff08;一&#xff09;过程&#xff1a; &#xff08;二&#xff09;安装requests模块和beautifulsoup4模块 &#xff08;三&#xff09;requests库的使用 1、requests库的基本介绍 2、导入requests库的…

深度学习:基于MindSpore实现ResNet50中药分拣

ResNet基本介绍 ResNet&#xff08;Residual Network&#xff09;是一种深度神经网络架构&#xff0c;由微软研究院的Kaiming He等人在2015年提出&#xff0c;并且在ILSVRC 2015竞赛中取得了很好的成绩。ResNet主要解决了随着网络深度增加而出现的退化问题&#xff0c;即当网络…

Chromium 中chrome.history扩展接口c++实现

一、前端 chrome.history定义 使用 chrome.history API 与浏览器的已访问网页的记录进行交互。您可以在浏览器的历史记录中添加、移除和查询网址。如需使用您自己的版本替换历史记录页面&#xff0c;请参阅覆盖网页。 更多参考&#xff1a;chrome.history | API | Chrome…

E. Expected Power (Codeforces 976 Div2)

这道题好难 原题 E. Expected Power 提示 Hint 1 试着找 f(S) 的期望值而不是 Hint 2 从f(S)的二进制表示中找规律来求 代码1 对答案代码做了注释 #include <bits/stdc.h> using namespace std;const int mod 1e97, N 2e5 10;// 最高只有1023, 小于等于2的10…

【论文阅读】Cross Attention Network for Few-shot Classification

用于小样本分类的交叉注意力网络 引用&#xff1a;Hou, Ruibing, et al. “Cross attention network for few-shot classification.” Advances in neural information processing systems 32 (2019). 论文地址&#xff1a;下载地址 论文代码&#xff1a;https://github.com/bl…

最新eclipse安装教程及安装包获取-附JDK安装

Eclipse简介 Eclipse 是一款开源的、功能强大、广泛应用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;在软件开发领域占据着重要地位。 一、起源与发展 Eclipse 最初由 IBM 开发&#xff0c;2001 年以开源软件的形式发布。此后&#xff0c;它迅速吸引了全球众多开…

基于Python的在线音乐平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

发送邮件和随机码的生成

类视图和方法视图区别&#xff1a; 不需要装饰器&#xff0c;只需要继承MethodView,需要使用什么方式就写对应的方法名称&#xff0c;它就能自动匹配 app.route("/delete/",methods["DELETE"])这些就不用写了 但是不写装饰器并不意味着不写路由了&#xff…

毕设分享 大数据用户画像分析系统(源码分享)

文章目录 0 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…