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微服务专栏
- 【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
- 【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心
- 【SpringCloud(3)】Ribbon负载均衡:IRule原理轮询算法;LB负载均衡;loadbalancer和IRule组件;Ribbon和Ngin负载均衡的区别
- 【SpringCloud(4)】OpenFeign客户端:OpenFeign服务绑定;调用服务接口;Feign和OpenFeign
- 【SpringCloud(5)】Hystrix断路器:服务雪崩概念;服务降级、服务熔断和服务限流概念;使用Hystrix完成服务降级与服务熔断
- 【SpringCloud(6)】Gateway路由网关;zuul路由;gateway实现原理和架构概念;gateway工作流程;静态转发配置
💕👉博客专栏
- Golang专栏-包含基础、Gin、Goam等知识
- 云原生专栏-包含k8s、docker等知识
- 从0开始学习云计算-华为HCIP证书
- JUC专栏-带你快速领悟JUC的知识!
- JVM专栏-深入Java虚拟机,理解JVM的原理
- 基于Java研究 数据结构与算法-包含贪心算法、加权图、最短路径算法等知识
- Docker专栏-上手热门容器技术Docker
- SpringBoot专栏-学习SpringBoot快速开发后端
- 项目管理工具的学习-设计技术:Maven、Git、Gradle等相关管理工具
- JavaSE-全面了解Java基础
- JS专栏-使用JS作的一部分实例~
- 使用CSS所作的一部分案例
《【SpringCloud(7)】SpringCloud Config分布式配置中心;服务端与客户端配置;SpringCloud Bus总线;bus刷新全局广播》 是转载文章,点击查看原文。
