[SpringCloud] SpringCloud配置中心的核心原理

news2024/11/26 16:34:38
  • SpringCloud是什么时候去拉取配置中心的
  • 配置中心客户端的配置信息为什么要写在bootstrap文件中
  • 对象中注入的属性是如何动态刷新的
  • 一些开源的配置中心是如何整合SpringCloud的

文章目录

      • 1.从SpringBoot的启动过程说起
        • 1.1 大致过程
      • 2.准备Environment的核心操作
        • 2.1 前置操作
      • 3.prepareEnvironment的核心逻辑
      • 4.SpringCloud是如何巧妙地拉取配置的
      • 5.如何动态刷新Bean的属性
      • 6.开源配置中心是如何整合SpringCloud的

1.从SpringBoot的启动过程说起

SpringApplication的run方法的逻辑

在这里插入图片描述

1.1 大致过程

在这里插入图片描述

刷新前:

  1. 准备Environment, 也就是准备SpringBoot的整个外部化配置的对象
  2. 创建ApplicationContext
  3. 为ApplicationContext做一些准备工作

在这里插入图片描述

刷新中:

  1. 调用ApplicationContext#refresh方法来刷新容器

在这里插入图片描述

刷新后:

  1. 收尾的阶段

在这里插入图片描述

2.准备Environment的核心操作

prepareEnvironment方法的实现, 是拉取配置中心的核心

在这里插入图片描述

2.1 前置操作

在容器创建前, 会去加载spring.factories中的一些对象。

  1. org.springframework.context.ApplicationListener键对应的ApplicationListener的实现
    在这里插入图片描述

  2. org.springframework.boot.SpringApplicationRunListener键对应的SpringApplicationRunListener的实现类
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 构造的时候会创建一个SimpleApplicationEventMulticaster,再将加载的ApplicationListener添加进去, SimpleApplicationEventMulticaster是用来发布事件用的

在这里插入图片描述

3.prepareEnvironment的核心逻辑

在这里插入图片描述

listeners.environmentPrepared(environment);

将环境传入进容器。

在这里插入图片描述

会发布一个ApplicationEnvironmentPreparedEvent事件。

而对这个事件有两个特别重要的监听器:

  • ConfigFileApplicationListener: 用来处理配置文件的, 解析配置文件, 加入到Enviroment
  • BootstrapApplicationListener: 跟配置中心交互的

这些监听器都是通过前置操作从spring.factories配置文件中加载的

在这里插入图片描述

4.SpringCloud是如何巧妙地拉取配置的

在BootstrapApplicationListener中,他首先也会创建一个SpringApplication去执行。

在这里插入图片描述

在这里插入图片描述

  1. 本质上就是创建一个Spring容器

  2. 这个容器是专门用来跟配置中心交互的

  3. 这个容器在创建的时候会给它两个比较重要的配置

  4. 第一个就是设置这个容器所用的配置文件的名称, 默认就是bootstrap
    在这里插入图片描述

  5. 第二个就是会加入一个配置类, BootstrapImportSelectorConfiguration
    在这里插入图片描述
    在这里插入图片描述

  6. 这个配置类又会通过@Import注解导入另一个配置类, BootstrapImportSelector
    在这里插入图片描述

  7. BootstrapImportSelector实现了ImportSelector接口

  8. 容器启动时候, 调用BootstrapImportSelector的selectImports方法的实现获取到一些配置类

  9. 而BootstrapImportSelector的selectImports实现, 会加载所有的spring.factories中的键为org.springframework.cloud.bootstrap.BootstrapConfiguration的配置类
    在这里插入图片描述

  10. 加载的是一个注解@BootstrapConfiguration, 和@EnableAutoConfiguration作用差不多, 都是导入配置类

在这里插入图片描述
11. @BootstrapConfiguration会导入配置类ProperttySourceBootstrapConfiguration
在这里插入图片描述

  1. 这个配置类中会注入这么一个集合对象, propertySourceLocators, 获取配置中心中的配置
    在这里插入图片描述
  2. PropertySourceBootstrapConfiguration#initialize(), 将配置放到Environment中
    在这里插入图片描述
  3. 这样在ApplicationContext的刷新阶段就可以使用到配置中心的那些配置了

在这里插入图片描述

5.如何动态刷新Bean的属性

@RefreshScope

在这里插入图片描述

加了@RefreshScope注解的Bean, Spring会生成两个UserService的Bean

  • UserService的代理动态代理的Bean: 在其它类中需要注入一个UserService时, 注入的是代理Bean
  • UserService这个Bean: 使用这个注入的动态代理的Bean的时候, 调用的是UserService这个Bean

在这里插入图片描述

当配置中心客户端一旦感知到服务端的某个配置有变化的时候, 需要发布一个RefreshEvent事件来告诉SpringCloud配置有变动。

在这里插入图片描述

在SpringCloud中RefreshEventListener类会去监听这个事件

在这里插入图片描述

一旦监听到这个事件, SpringCloud会立刻重新拉去配置。
拉取配置的核心逻辑跟启动时拉取配置的核心逻辑是一样的。
通过BootstrapApplicationListener 来实现的。

在这里插入图片描述

RefreshEventListener监听RefreshEvent事件, 代码逻辑在ContextRefresher类中。

有了新的配置, 销毁UserService这个Bean, 代理对象保持不变。

在这里插入图片描述

6.开源配置中心是如何整合SpringCloud的

配置中心整合到SpringCloud:

  1. 实现PropertySourceLocator, 并且配置中心一些相关的Bean需要通过org.springframework.cloud.bootstrap.BootstrapConfiguration来装配到这个容器中
  2. 当配置发生变更需要发送RefreshEvent事件, 这部分配置中心一些相关的Bean配置肯定是需要通过自动装配来完成。

Nacos的spring.factories文件:

在这里插入图片描述

NacosConfigBootstrapConfiguration:

在这里插入图片描述

声明了一个NacosPropertySourceLocator这个Bean, 实现了PropertySourceLocator接口。

在这里插入图片描述

通过NacosConfigAutoConfiguration配置类来实现配置发生变更需要发送RefreshEvent事件。

在这里插入图片描述

这个Bean就实现了配置变化发送事件的操作。

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1259917.html

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

相关文章

每日一题:LeetCode-202.快乐数(一点都不快乐)

每日一题系列(day 06) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50e…

【数据结构】图<简单认识图>

对于下面的内容,大家着重观察和理解图即可,可以直接绕过一些文字性的概念,对图有一个大概的认识。 图 简单认识图图的定义有向图和无向图完全图无向完全图有向完全图 图的基本存储结构邻接矩阵存储邻接矩阵的优点 网络的邻接矩阵邻接表无向图…

C++基础 -5- 动态内存分配

相对于c语言的优势 C可以在分配空间时初始化 返回的内存地址不需要进行强制类型转换 动态申请单块内存格式(图片代码段呈现) 且在分配的时候可以用圆括号直接赋值 int *bnew int(99);动态申请多块内存格式 int *anew int[1024]{88,99,1010};释放空间 释放单块 delete b;释放…

centos7 keepalived探测当前节点

手动查看 查看keepalived集群主节点在哪台服务器,执行命令: ip a 看下自己设定的虚IP在哪台服务器,哪台就是主节点。 脚本实现 rm -rf ./tmp.log ip a > ./tmp.log if cat tmp.log |grep "132" thenecho -e "\033[32m…

香港科技大学广州|智能制造学域博士招生宣讲会—天津大学专场

时间:2023年12月07日(星期四)15:30 地点:天津大学卫津路校区26楼B112 报名链接:https://www.wjx.top/vm/mmukLPC.aspx# 宣讲嘉宾: 汤凯教授 学域主任 https://facultyprofiles.hkust-gz.edu.cn/faculty-p…

P19 C++ 构造函数的成员初始化列表

目录 前言 01 如果不用成员列表如何初始化变量 02 成员列表初始化 03 为什么要使用成员列表初始化呢? 04 案例代码 前言 本期我们聊聊构造函数初始化列表。 你应该经常使用成员初始化列表,如果你不喜欢这种代码风格,建议你还是慢慢习惯吧…

适配rem自动转换插件(vscode)

可以根据自己的草稿图,设置自己想要多少px对应1rem 这样子在我们写css单位的时候就会自动转换为rem单位了,当然,转换肯定是可选的,不是说只能写rem了。

线程基本方法

1。设置线程名 继承Thread类的线程,可以直接使用.setName()方法,设置线程名。也可以使用构造方法,需要注意java默认不继承构造方法,所以需要自己调用下父类的构造方法。 public class Demo {public static void main(String[…

如何在手机上打开电脑端本地的网页

目录 一.手机端预览VSCode生成的网页站点二.手机端预览VS2022生成的 WebApi网页站点三.总结 今天遇到了2个小问题:1.想在手机上运行VSCode上写好的网页代码。2.同样在手机上运行VS2022 WebApi生成的网页。查找了一晚上资料,终于动手解决了,记…

线性分类器--分类模型

记录学习 北京邮电大学计算机学院 鲁鹏 为什么从线性分类器开始?  形式简单、易于理解  通过层级结构(神经网络)或者高维映射(支撑向量机)可以 形成功能强大的非线性模型 什么是线性分类器? 线性分…

一觉睡到大天亮,dido P1S智能手环体验

智能穿戴设备对于有关注健康的朋友来说,是非常使用的工具,它们可以帮助我们实时监测一些健康数据,最近几年,国产的智能穿戴设备突飞猛进,大幅拉低了价格门槛,而且使用体验也很不错,现在我用的也…

初识Spring (Spring 核心与设计思想)

文章目录 什么是 Spring什么是容器什么是 IoC理解 Spring IoCDI 概念 什么是 Spring Spring 官网 官方是这样说的: Spring 让每个人都能更快、更轻松、更安全地进行 Java 编程。春天的 专注于速度、简单性和生产力使其成为全球最受欢迎Java 框架。 我们通常所说的 Spring 指的…

CSS3制作3D爱心动画

1、什么是CSS css,即层叠样式表的简称,是一种标记语言,有浏览器解释执行用来使页面变得更美观。 2、选择器 css3中新增了一些选择器,如下: 3、新样式 边框 css3新增了三个边框属性,分别是: bo…

Postman:专业API测试工具,提升Mac用户体验

如果你是一名开发人员或测试工程师,那么你一定知道Postman。这是一个广泛使用的API测试工具,适用于Windows、Mac和Linux系统。今天,我们要重点介绍Postman的Mac版本,以及为什么它是你进行API测试的理想选择。 一、强大的功能和易…

文件夹重命名技巧:如何整理过长且混乱的文件夹名称

当浏览计算机文件夹时,有时候会遇到一些过长且混乱的文件夹名称,给文件夹管理带来不便。倘若手动修改文件夹名称会出现错误的机率过大,且这样操作太耗费时间和精力。有什么方法能够避免手动修改文件夹名称,提升工作效率的方法呢&a…

Java远程连接本地开源分布式搜索引擎ElasticSearch

文章目录 前言1. Windows 安装 Cpolar2. 创建Elasticsearch公网连接地址3. 远程连接Elasticsearch4. 设置固定二级子域名 前言 简单几步,结合Cpolar内网穿透工具实现Java远程连接操作本地Elasticsearch。 什么是elasticsearch?一个开源的分布式搜索引擎&#xff0…

git报错:error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413

git报错:error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 如图: error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 send-pack: unexpected disconnect while reading sideband packet fatal: th…

最火前端可视化Web组态软件工具

随着5G、物联网、大数据等技术的高速发展,各领域逐步向数字化、可视化的人工智能(AI)的方向不断迈进。全球进入工业 4.0 时代,标志着先进的信息技术于制造业紧密结合,将从单纯的生产要素向数据驱动、智能化、高度自动化…

线性分类器---损失函数与优化算法

如何衡量分类器对当前样本的效果好坏? 需要损失函数 什么是损失函数? 损失函数搭建了模型性能与模型参数之间的桥梁,指导 模型参数优化。  损失函数是一个函数,用于度量给定分类器的预测值与真实值 的不一致程度,…

sprintf函数

1.头文件&#xff1a;#include <stdio.h> 2.函数原型&#xff1a;int sprintf ( char * str, const char * format, ... ) 3.函数功能&#xff1a;将数据格式化为字符串&#xff0c;再写入到字符串中 4.参数分析&#xff1a; str&#xff1a;是字符串指针&#xff0c…