【SpringCloud(7)】SpringCloud Config分布式配置中心;服务端与客户端配置;SpringCloud Bus总线;bus刷新全局广播

作者:凉凉心.日期:2025/10/20

1. SpringCloud Config 分布式配置中心

1.1 目前分布式微服务架构的痛点

微服务意味着要将单体应用中的业务拆分成一个个自服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能允许,所以一套集中式的、动态的配置管理设备是必不可少的

SpringCloud提供了ConfigServer来解决这个问题。

1.1 SpringCloud Config是什么?

在这里插入图片描述

SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置

1.2 怎么玩?

SprigCloud Config分为服务端和客户端两部分

服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口

客户端则是通过指定 的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容

2. 使用

2.1 服务端

引入jar包

1<dependency>
2    <groupId>org.springframework.cloud</groupId>
3    <artifactId>spring-cloud-config-server</artifactId>
4</dependency>
5

注意配置yaml文件

1server:
2  port: 3344
3spring:
4  application:
5    name: cloud-config-center
6  cloud:
7    config:
8      server:
9        git:
10          uri: https://gitee.com/RixRenex/spring-cloud-config.git # 连接的git仓库
11          username: RixRenex
12          password: ZXhejinyuan2580
13          default-label: master
14#          search-paths: # 在仓库下面查找 springcloud-config 目录
15#            - springcloud-config
16
17eureka:
18  client:
19    service-url:
20      defaultZone: http://localhost:7001/eureka
21

2.2 客户端

不同于服务端的jar包,需要引入客户端的jar包;一个是server,一个是config

1<dependency>
2    <groupId>org.springframework.cloud</groupId>
3    <artifactId>spring-cloud-starter-config</artifactId>
4</dependency>
5

我们需要创建一个比applicaiton.yaml配置文件优先级高的,这样才可以通过该文件访问到服务端的applicaiton.yaml;创建bootsrap.yaml文件

1server:
2  port: 3355
3spring:
4  application:
5    name: config-client
6  cloud:
7    config:
8# 说明:从http://localhost:3344地址中master分支里名称是config,后缀是dev的配置文件
9# config-dev.yaml
10      label: master #分支名称
11      name: config #配置文件名称
12      profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
13      uri: http://localhost:3344 #配置中心地址k
14
15  profiles:
16    active: dev
17eureka:
18  client:
19    service-url:
20      defaultZone: http://localhost:7001/eureka
21
22

application.yaml 是用户及的资源配置项

bootstrap.yaml是系统级的,优先级更高

SpringCloud会创建一个”Bootstrap Context“,作为Spring应用的Applicaitoncontext的父上下文。初始化时,BootstrapContext负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的”Environment“

Bootstrap 属性由高优先级,默认情况下,我们不会被本地配置负载。BootstrapContext 和 Application Context有着不同的约定,所以新增了一个bootstrap.yaml 文件,保证BootstrapContext 和Application Context配置的分离

要将Client模块下的application.yaml文件改为bootstrap.yaml这是很关键的

因为bootstrap.yaml是比application.yaml先加载的。bootstrap.yaml优先级高于application.yaml

产生问题的原因是bootstrap.properties比application.properties的优先级要高
由于bootstrap.properties是系统级的资源配置文件,是用在程序引导执行时更加早期配置信息读取;
而application.properties是用户级的资源配置文件,是用来后续的一些配置所需要的公共参数。

_在SpringCloud 2020. 版本把bootstrap禁用了*,导致在读取文件的时候读取不到而报错,所以我们只要把bootstrap从新导入进来就会生效了。

1<dependency>
2    <groupId>org.springframework.cloud</groupId>
3    <artifactId>spring-cloud-starter-bootstrap</artifactId>
4    <version>3.0.3</version>
5</dependency>
6

2.3 Config动态刷新

在yaml中暴露监控

1# 将服务监控暴露
2management:
3  endpoints:
4    web:
5      exposure:
6        include: "*"
7

在Controller控制类上添加注解@RefreshScope // 开启动态刷新

1@RestController
2@RefreshScope // 开启动态刷新
3public class ConfigClientController
4{
5    @Value("${config.info}")
6    private String configInfo;
7
8    @GetMapping("/configInfo")
9    public String getConfigInfo()
10    {
11        return configInfo;
12    }
13}
14

运行前需要执行一次post请求,刷新一次

访问任意节点/actuator/refresh

例如:http://localhost:3355/actuator/refresh

3. SpringCloud Bus说明

需要实现分布式自动刷新配置功能

Bus支持两种消息代理:RabbitMQ和Kafka

3.1 概述:

在这里插入图片描述

SpringCloud Bus 是用来将分布式系统的节点与轻量级消息系统连接起来的框架。

它整合了Java的事件处理机制和消息中间件的功能

在这里插入图片描述

3.1.1 为什么是总线

在微服务架构的系统总,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息

3.1.2 基本原理

ConfigClient实例都监听MQ中的同一个topic。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其他监听同一个Topic的服务就能得到通知,然后去更新自身的配置

4. 使用 - bus动态刷新全局广播

在这里插入图片描述
在这里插入图片描述

图二的架构显然更加适合,图一不适合的原因如下:

  • 打破了微服务的职责单一-性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。
  • 破坏了微服务各节点的对等性。
  • 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改

在使用SpringCloud Config的模块上,不论是服务端还是客户端都需要添加rabbitmq用来全局刷新;

1<!--添加消息总线RabbitMQ支持-->
2<dependency>
3    <groupId>org.springframework.cloud</groupId>
4    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
5</dependency>
6

并在yaml中添加rabbitmq的连接

1rabbitmq:
2 host: 192.168.21.130
3 port: 5672
4 username: admin
5 password: hejinyuan
6

在服务端3344上暴露bus刷新配置的端点

1# rabbitmq相关配置,暴露bus刷新配置的端点
2management:
3  endpoints: #暴露bus刷新配置的端点
4    web:
5      exposure:
6        include: 'bus-refresh'
7

服务端3344的整体yaml

1server:
2  port: 3344
3spring:
4  application:
5    name: cloud-config-center
6  cloud:
7    config:
8      server:
9        git:
10          uri: https://gitee.com/RixRenex/spring-cloud-config.git
11          username: RixRenex
12          password: ZXhejinyuan2580
13          default-label: master
14  rabbitmq:
15    host: 192.168.21.130
16    port: 5672
17    username: admin
18    password: hejinyuan
19#          search-paths: # 在仓库下面查找 springcloud-config 目录
20#            - springcloud-config
21
22eureka:
23  client:
24    service-url:
25      defaultZone: http://localhost:7001/eureka
26
27# rabbitmq相关配置,暴露bus刷新配置的端点
28management:
29  endpoints: #暴露bus刷新配置的端点
30    web:
31      exposure:
32        include: 'bus-refresh'
33
34

当向服务端发送post请求刷新一次http://localhost:3344/actuator/busrefresh

在rabbitmq中出现该交换机即可完成了一次刷新处处生效的效果

在这里插入图片描述

🥸🏏SpringCloud微服务专栏

  1. 【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
  2. 【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心
  3. 【SpringCloud(3)】Ribbon负载均衡:IRule原理轮询算法;LB负载均衡;loadbalancer和IRule组件;Ribbon和Ngin负载均衡的区别
  4. 【SpringCloud(4)】OpenFeign客户端:OpenFeign服务绑定;调用服务接口;Feign和OpenFeign
  5. 【SpringCloud(5)】Hystrix断路器:服务雪崩概念;服务降级、服务熔断和服务限流概念;使用Hystrix完成服务降级与服务熔断
  6. 【SpringCloud(6)】Gateway路由网关;zuul路由;gateway实现原理和架构概念;gateway工作流程;静态转发配置

💕👉博客专栏


【SpringCloud(7)】SpringCloud Config分布式配置中心;服务端与客户端配置;SpringCloud Bus总线;bus刷新全局广播》 是转载文章,点击查看原文


相关推荐


Vue 内置组件全解析:提升开发效率的五大神器
90后晨仔2025/10/19

在 Vue 开发中,除了我们日常编写的业务组件外,框架还提供了一系列内置组件,它们为我们处理常见的开发场景提供了优雅的解决方案。今天,我们就来深入探讨 Vue 的五大内置组件:Transition、TransitionGroup、KeepAlive、Teleport 和 Suspense。 1. Transition - 丝滑的过渡动画 什么是 Transition? Transition 组件用于在元素或组件的插入、更新和移除时添加动画效果,让用户体验更加流畅。 基本使用 <template


Java Kubernetes本地部署RuoYi框架jar包
自由的疯2025/10/18

在本地 Kubernetes 集群中部署 RuoYi 框架的 JAR 包是一个很好的实践,可以帮助你更好地理解和掌握 Kubernetes 的应用部署流程。以下是详细的步骤,指导你在本地 Kubernetes 集群中部署 RuoYi 框架的 JAR 包。 1. 准备环境 1.1 安装 Minikube 或 kind 首先,确保你已经安装了 Minikube 或 kind 来本地运行 Kubernetes 集群。这里以 Minikube 为例进行说明。 安装 kubectl: curl -LO


从 Tomcat 与 Jetty 的对比,聊聊影响一个服务并发能力的关键因素
G探险者2025/10/16

大家好,我是G探险者! 在 Java 服务体系中,Tomcat 与 Jetty 是最常见的 Web 容器。很多人认为,只要加大连接数或线程数,就能提升并发能力。 但事实远比想象复杂:连接数只是冰山一角,背后还有线程模型、I/O 模型、内核资源限制等多重因素。 本文从 Tomcat 与 Jetty 的对比 入手,系统讲清楚——到底是什么在决定你的服务并发上限。 🧩 一、Tomcat 与 Jetty 的架构差异 1️⃣ Tomcat 的工作模型 Tomcat 默认采用 多线程 + 阻塞 I/O


面试真实经历某商银行大厂Java问题和答案总结(三)
360_go_php2025/10/15

​ 1. 深拷贝和浅拷贝 ​编辑 问:什么是深拷贝和浅拷贝?它们之间有什么区别? 浅拷贝(Shallow Copy): 浅拷贝指的是复制对象的引用,而不是复制对象本身。也就是说,对于对象中的引用类型字段,浅拷贝只是复制了这些字段的引用,而没有复制字段引用的对象本身。 如果原始对象和拷贝对象中有相同的引用类型字段,修改其中一个字段会影响到另一个对象。​编辑 深拷贝(Deep Copy): 深拷贝指的是复制对象本身,并且递归地复制对象中的所有引用类型字段,确保两个对象中的引用类型字段互不影响。


Swift 基础语法全景(一):从变量到类型安全
unravel20252025/10/14

常量与变量:let vs var 声明语法 // 常量:一次赋值,终身不变 let maximumLoginAttempts = 10 // 最大尝试次数,业务上不允许修改 // 变量:可反复写入 var currentAttempt = 0 // 当前尝试次数,失败+1 延迟赋值 只要「第一次读取前」完成初始化即可,不必一行写完。 var randomGenerator = SystemRandomNumberGenerator() let


Linux挂载NTFS分区指南
依赖倒不置2025/10/12

在使用Windows和Linux双系统的电脑上,通常我们可能也需要在Linux上访问NTFS分区。虽然Linux用户一般来说不一定会有分区的习惯,但是在双系统情况下,两个系统复用NTFS分区也是很常见的。 今天,就来讨论双系统复用分区的场景下,如何正确地在Linux挂载NTFS分区。 1,Linux的NTFS驱动 事实上,老版本的Linux内核并不原生支持读取NTFS分区,尤其是NTFS是Windows系统专有的文件系统,而不是开放的。因此很长一段时间,都是使用ntfs-3g这个开源驱动实现在L


老题新解|十进制转二进制
程序员莫小特2025/10/10

《信息学奥赛一本通》第160题:十进制转二进制 题目描述 给定一个十进制整数 n n n,请将其转换为对应的二进制表示,并输出。 输入格式 输入包含一行,一个整数 n


单机已达上限?PerfTest 分布式压测登场,轻松模拟百万用户洪峰
Go有引力2025/10/9

前言 在前一篇文章中,我们详细介绍了 perftest 的单机压测能力,展示了它如何通过极简的命令行实现对 HTTP/1.1、HTTP/2、HTTP/3 与 WebSocket 的高性能测试。然而,当业务系统庞大、服务部署分布式、网络链路复杂时,单机的压测能力显然无法满足真实生产环境的模拟需求。 幸运的是,perftest 不止于单机。它同样支持 分布式集群压测,通过 Collector + Agent 的架构,让你轻松在多台机器上同时发起测试,实现百万乃至千万级并发的性能评估。 为什么选择分


Webpack实战笔记:从自动构建到本地服务器搭建的完整流程
XiangCoder2025/10/7

作为前端开发者,Webpack 是绕不开的构建工具。最近系统学习了 Webpack 的自动构建和服务器搭建,整理了一套从基础到实战的操作笔记,包含具体案例和踩坑经验,适合新手跟着实操。 前言:为什么需要 Webpack 构建工具? 刚开始写前端项目时,我们习惯在 index.html 里手动引入各种 js、css 文件。但随着项目变大,会遇到两个核心问题: 资源越来越多,手动管理引入路径容易出错(尤其是加哈希值优化缓存时); 开发时需要频繁刷新页面看效果,效率太低。 Web


Android系统模块编译调试与Ninja使用指南
龙之叶2025/10/6

模块编译调试方法 (此处举例framework、installd、SystemUI等模块的编译调试,其他类似) 1. Framework模块编译 Android系统代码的framework目录内,一共有3个模块单独编译:framework、services、framework-res.apk。 注意:偶尔会有改了代码但没检测到,编译结束后产物并未更新的情况,所以可以考虑先剪切掉原先的产物或者检查产物更新时间确保已经重新编译。 步骤: 完成根目录下 source build/envsetup.sh

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0