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

news2024/11/25 12:46:25

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

spring:
  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/orders
    username: root
    password: root

order:
  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: localhost
    port: 5672
    username: guest
    password: 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.coloradmin.cn/o/2205240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详细分析Spring Framework中 @ConditionalOnProperty的基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 从实战中学习启发 1. 基本知识 Conditiona…

一键将表格嵌入ppt作为附件!2个做ppt必知的技巧分享!

怎样把表格作为附件放入ppt&#xff1f; 众所周知&#xff0c;微软推出的Office套件包含了Powerpoint和Excel这两款软件&#xff0c;如果想在Powerpoint中插入表格&#xff0c;且表格数据量比较大&#xff0c;此时最好的呈现方式&#xff0c;是在Excel中来展示这些数据&#x…

msvcp120.dll无法继续执行代码的五个解决方法

在计算机系统中&#xff0c;MSVCP120.dll是一个至关重要的动态链接库文件&#xff0c;它是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序运行至关重要。当系统提示“msvcp120dll丢失”时&#xff0c;意味着该文件可能由于误删…

清华毕业生去向引发的思考....

近日&#xff0c;清华最新发布的毕业生去向一经公布&#xff0c;便在社会上引起了广泛的关注和热议&#xff0c;许多人看完后都陷入了沉默。这一份去向报告&#xff0c;不仅仅是一组数据的呈现&#xff0c;更是对教育成果、社会需求以及个人发展等多方面问题的深刻映射。 一、数…

文件与目录的基本操作

前提&#xff1a;使用su root 切换到权限最大的root用户 1.显示当前工作目录的绝对路径&#xff08;pwd&#xff09; 用途&#xff1a;用于显示当前工作目录的绝对路径的命令。无论用户在文件系统的哪个位置&#xff0c;pwd 命令都能提供当前所在位置的完整路径信息。 用法&a…

现货白银交易技巧:向下突破回撤策略

有关现货白银交易的技巧一直是投资者关注的重点&#xff0c;投资者确实应该保持学习&#xff0c;这样才能跟得上市场&#xff0c;不会落后&#xff0c;下面我们就来介绍一个现货白银交易中的突破回撤的策略。 首先这个现货白银交易技巧判断的基础就是找到一波横盘趋势。所谓的突…

【C# 网络编程】基本概念

基本概念 OSI模型 背景&#xff1a; 为了统一和兼容不同计算机厂商的网络体系结构概念&#xff0c;国际标准化组织&#xff08;ISO&#xff09;在1979年提出了OSI参考模型&#xff08;Open System Interconnection&#xff0c;&#xff09; 结构 物理层&#xff08;Physica…

java反序列化之CommonCollections6利⽤链的学习

一、源起 前文学习CC1链和URLDNS链的学习&#xff0c;同时学习过程中知道cc1受jdk版本的限制&#xff0c;故而进一步分析cc6链的利用过程&#xff0c;这个利用链不受jdk版本的限制&#xff0c;只要commons collections小于等于3.2.1&#xff0c;都存在这个漏洞。 ps&#xff1…

Flink 介绍(特性、概念、故障容错、运维部署、应用场景)

概述 特性 概念 数据流 状态 时间 savepoint 故障容错 运维部署 部署应用到任意地方 Flink能够更方便地升级、迁移、暂停、恢复应用服务 监控和控制应用服务 运行任意规模应用 应用场景 事件驱动型应用 什么是事件驱动型应用? 事件驱动型应用的优势 Flink如何…

对接外卖霸王餐api要遵循哪些步骤?

对接外卖霸王餐API接口的步骤通常包括以下几个关键环节&#xff1a; 选择服务提供商&#xff1a;根据需求、预算、服务内容、接口稳定性、覆盖范围&#xff08;是否支持全国多个城市、是否支持主要外卖平台如美团和饿了么等&#xff09;、技术支持等因素选择合适的霸王餐API服…

实现一个时钟

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QPainter>//画家类 #include<QTime>//时间类 #include<QTimer>//定时器类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget …

vue3.5系列之响应式props解构的几点技巧对比

在最新的版本3.5x中&#xff0c;对props的能力也进行了加强。下面&#xff0c;我们具体看下有哪些变化&#xff0c;给我们带来的新的体验&#xff01; 体验一 3.5之前解构props的效果 // 子组件 <template><div><h1>响应式props</h1><p>{{ co…

【储能优化】使用优化的微电网能源管理系统 (EMS)

摘要 本文介绍了一种基于优化的微电网能源管理系统&#xff08;EMS&#xff09;&#xff0c;通过储能优化实现电网、光伏发电、以及储能设备之间的智能调度。系统旨在降低能源成本、减少碳排放&#xff0c;并提高能源利用效率。利用该EMS系统&#xff0c;电网用户能够在满足负…

使用docker、编写dockerfile、httpd镜像,并启动镜像,创建httpd主页和分页。(2)

1.准备一台机子&#xff0c;准备源&#xff0c;下载docker-ce vi /etc/yum.repo.d/Centos-7.repo 加入以下内容[base] nameCentOS-$releasever - Base - mirrors.aliyun.com failovermethodpriority baseurlhttp://mirrors.aliyun.com/centos/$releasever/os/$basearch/http:/…

Midjourney中文版:创意无限,艺术之旅由此启程

Midjourney中文版——一个将你的文字想象转化为视觉艺术的神奇平台。无需繁琐的绘画技巧&#xff0c;只需简单的文字描述&#xff0c;你就能开启一场前所未有的艺术之旅。 Midjourney AI超强绘画 (原生态系统&#xff09;用户端&#xff1a;Ai Loadinghttps://www.mjdiscord.c…

图纸加密软件有哪些?2024好用的10款图纸加密软件推荐!

在保护企业设计图纸和技术文档的安全性方面&#xff0c;选择合适的加密软件至关重要。2024年&#xff0c;有许多优秀的图纸加密软件可供选择。以下是我们推荐的10款图纸加密软件&#xff0c;助您有效保障重要文件的安全。 1. Ping32图纸加密软件 Ping32图纸加密软件 是一款专业…

Linux环境下配置git

总共分为两个步骤&#xff1a;安装 配置&#xff0c;最终实现通过Git拉取代码。 1.安装Git yum install git## 查看版本 git --version得到返回信息 “git version XX.XX.XX.XX” 表明Git已经安装成功。 2.配置Git 分为两个步骤&#xff1a;初始化Git并生成授权证书 代码…

<OS 有关> Docker.Desktop - Unexpected WSL error #14030 不能启动, 问题已经解决 fixed

Windows Docker.Desktop 想用时报错&#xff1a; “deploying WSL2 distributions ensuring main distro is deployed: deploying "docker-desktop": importing WSL distro "WSL2 is not supported with your current machine configuration. Please enable th…

计组-浮点数运算

计算机中的浮点数&#xff0c;就是我们数学中的 科学计数法 那么2个浮点数相加&#xff0c;以科学计数法的形式&#xff0c;来怎么计算 其对应形式如下 不能直接尾数运算是因为两个数的指数都不一样 所以第一步是对阶&#xff0c;就是让两个数的指数变成一样的 指数一样后&am…

在 EC2 AWS 中开启防火墙后将自己锁定在 SSH 之外

在搭建ftp时&#xff0c;开启了系统防火墙的几个端口&#xff0c;并且设置了防火墙开机自启。当设置好之后&#xff0c;关闭了putty&#xff0c;再次连接SSH时&#xff0c;发现连接错误。仔细一想&#xff0c;防火墙没有开启22端口&#xff0c;这不嘎了么&#xff0c;自己把自己…