Spring Cloud Config

简介: Spring Cloud Config

一、Config Server和Client原理

备注:Spring Cloud Config和Spring Cloud Eurake相似,都有客户端和服务端。


1、ConfigServer(配置中心服务端)从远端git拉取配置文件并在本地git一份,ConfigClient(微服务)从ConfigServer端获取自己对应 配置文件;


2,、手动刷新?

通过actuator和@RefreshScope通过调用actuator/refresh


3、当远端git仓库配置文件发生改变,ConfigServer如何通知到ConfigClient端,即ConfigClient如何感知到配置发生更新?


Spring Cloud Bus会向外提供一个http接口,即图中的/bus/refresh。我们将这个接口配置到远程的git的webhook上,当git上的文件内容发生变动时,就会自动调用/bus-refresh接口。Bus就会通知config-server,config-server会发布更新消息到消息总线的消息队列中,其他服务订阅到该消息就会信息刷新,从而实现整个微服务进行自动刷新。


微信图片_20220128165527.png


1、提交配置触发post请求给server端的bus/refresh接口

2、server端接收到请求并发送给Spring Cloud Bus总线

3、Spring Cloud bus接到消息并通知给其它连接到总线的客户端

4、其它客户端接收到通知,请求Server端获取最新配置

5、全部客户端均获取到最新的配置


二、Spring Boot配置文件加载过程


我们可以从SpringApplication.run()方法作为入口,prepareEnvironment是一个比较关键的方法;可以看出在Run方法中是,先加载PrepareEnvironment准备环境,然后在去准备Context上下文


image.png


1,PrepareEnvironment中getOrCreateEnvironment是根据WebApplication的类型选择不同的Environment,


image.png


接着再点进去**getOrCreateEnvironment()**中去,根据不同的特点,选择不同的环境


image.png


我们根据不同的环境选择不同的Environment;StandardServletEnvironment是整个spring boot应用运行环境的实现类,后面所有的关于环境相关的配置操作都是基于这个类。StandardEnvironment是StandardServletEnvironment的父类,AbstarctEnvironment是StandardEnvironment的父类,StandardServletEnvironment 中customizePropertySources的作用及时将不同配置源封装成PropertySource添加到MutablePropertySources中,调用AddLast标志一直往最后的位置添加。StandardServletEnvironment.customizePropertySources()中添加了servlet配置信息和servlet初始上下文信息,JNDI信息;接着调用其父类StandardEnvironment.customizePropertySources来添加系统的变量和系统的环境变量。


接着是configureEnvironment方法,这个方法中给Environment中添加类型转化的服务,property都是String类型的,转换为java对象需要根据合适的类型进行转化;配置当前激活的Profiles;configurePropertySources根据是否加载参数添加不同的propertySource。

listeners.environmentPrepared(environment);

上述工作完成之后,就是发布一个environmentPrepared环境准备就绪的通知,具体的时间监听过程的代码就不再分析了,我们直接进入到 ConfigFileApplicationListener 这个监听器,这个监听器就是用来处理项目配置的


配置加载过程:

ConfigFileApplicationListener.onApplicationEvent 收到事件之后,最终执行到ConfigFileApplicationListener.addPropertySources 方法中;这个方法做了两件事情,添加一个RandomValuePropertySource到Environment的MutablePropertySources中

加载spring boot中的配置信息,比如application.yml或者application.properties


至此,springBoot中的资源文件加载完毕,解析顺序从上到下,所以前面的配置文件会覆盖后面的配置

文件。可以看到 application.properties 的优先级最低,系统变量和环境变量的优先级相对较高。


三、Config Client 配置加载过程

从上边Spring boot的加载过程,可以推测;Config Client配置加载也一定与spring的某个机制有关系。

在spring boot项目启动时,有一个prepareContext的方法,它会回调所有实现了ApplicationContextInitializer 的实例,来做一些初始化工作。

PropertySourceBootstrapConfiguration 实现了 ApplicationContextInitializer 接口,其目的就是在应用程序上下文初始化的时候做一些额外的操作.

回调所有实现PropertySourceLocator接口实例的locate方法;最终调用ConfigServicePropertySourceLocator.locate();它会通过RestTemplate调用一个远程地址获得配置信息,

getRemoteEnvironment 。然后把这个配置PropertySources,然后将这个信息包装成一个

OriginTrackedMapPropertySource,设置到 Composite 中。


四、Config Server获取配置过程

服务器端去远程仓库加载配置的流程就比较简单了,核心接口是: EnvironmentRepository


Spring Cloud Config Server提供了EnvironmentController,这样通过在浏览器访问即可从git中获取配

置信息

在这个controller中,提供了很多的映射,最终会调用的是 getEnvironment 。


image.png


this.repository.findOne ,调用某个repository存储组件来获得环境配置信息进行返回。

repository是一个 EnvironmentRepository 对象,它有很多实现,其中就包含

RedisEnvironmentRepository 、 JdbcEnvironmentRepository 等。默认实现是

MultipleJGitEnvironmentRepository ,表示多个不同地址的git数据源。


image.png


image.png

目录
相关文章
|
7天前
|
消息中间件 Java 数据安全/隐私保护
Spring Cloud 项目中实现推送消息到 RabbitMQ 消息中间件
Spring Cloud 项目中实现推送消息到 RabbitMQ 消息中间件
|
7天前
|
负载均衡 监控 Java
我把Spring Cloud的超详细资料介绍给你,面试官不会生气吧?geigei
我把Spring Cloud的超详细资料介绍给你,面试官不会生气吧?geigei
|
7天前
|
负载均衡 Java 应用服务中间件
Spring Cloud 负载平衡的意义什么?
负载平衡是指将网络流量在多个服务器之间分布,以达到提高系统性能、增强可靠性和提供更好用户体验的目的。在负载平衡的架构中,多个服务器被组织成一个集群,共同处理用户的请求。
32 4
|
8天前
|
监控 安全 Java
Spring cloud原理详解
Spring cloud原理详解
22 0
|
8天前
|
消息中间件 负载均衡 Java
【Spring Cloud 初探幽】
【Spring Cloud 初探幽】
20 1
|
8天前
|
安全 Java Docker
|
8天前
|
Java 开发者 微服务
Spring Cloud原理详解
【5月更文挑战第4天】Spring Cloud是Spring生态系统中的微服务框架,包含配置管理、服务发现、断路器、API网关等工具,简化分布式系统开发。核心组件如Eureka(服务发现)、Config Server(配置中心)、Ribbon(负载均衡)、Hystrix(断路器)、Zuul(API网关)等。本文讨论了Spring Cloud的基本概念、核心组件、常见问题及解决策略,并提供代码示例,帮助开发者更好地理解和实践微服务架构。此外,还涵盖了服务通信方式、安全性、性能优化、自动化部署、服务网格和无服务器架构的融合等话题,揭示了微服务架构的未来趋势。
39 6
|
8天前
|
JSON Java Apache
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
|
8天前
|
负载均衡 Java 开发者
Spring Cloud:一文读懂其原理与架构
Spring Cloud 是一套微服务解决方案,它整合了Netflix公司的多个开源框架,简化了分布式系统开发。Spring Cloud 提供了服务注册与发现、配置中心、消息总线、负载均衡、熔断机制等工具,让开发者可以快速地构建一些常见的微服务架构。
|
8天前
|
消息中间件 Java RocketMQ
Spring Cloud RocketMQ:构建可靠消息驱动的微服务架构
【4月更文挑战第28天】消息队列在微服务架构中扮演着至关重要的角色,能够实现服务之间的解耦、异步通信以及数据分发。Spring Cloud RocketMQ作为Apache RocketMQ的Spring Cloud集成,为微服务架构提供了可靠的消息传输机制。
30 1

热门文章

最新文章