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

  • 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.mzph.cn/news/175114.shtml

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

相关文章

SEOAI每周资讯和Linus思考 231127

欢迎查看 Linus筋斗云SEO 的每周资讯整理,本周的一些要点: Google11月核心更新和评论更新仍然没有结束9个搜索结果页的主要变化:图标、品牌、粉丝数、新模块GSC已索引页面狂掉?Google的问题,已修复黑五网一期间的搜索…

强化学习中的Q学习

Q学习(Q-Learning)是强化学习中的一种基于值的学习方法,用于在有限马尔可夫决策过程(MDP)中学习最优的动作策略。Q学习主要用于离散状态和离散动作的问题。 以下是Q学习的基本概念和步骤: Q-Value&#xf…

在Spring Boot中隔离@Async异步任务的线程池

在异步任务执行的时候,我们知道其背后都有一个线程池来执行任务,但是为了控制异步任务的并发不影响到应用的正常运作,我们需要对线程池做好相关的配置,以防资源过度使用。这个时候我们就考虑将线程池进行隔离了。 那么我们为啥要…

【数据结构初阶】单链表

各位读者老爷好,鼠鼠我又来了哈。鼠鼠我呀现在来基于C语言实现以下单链表,希望对你有所帮助! 目录 1.链表的概念及结构 2.链表的分类 3.无头单向非循环链表的实现 3.1.单链表打印 3.2.单链表尾插 3.3.单链表头插 3.4.单链表尾删 3.5…

在OpenCV中基于深度学习的边缘检测

引言 如何在OpenCV中使用基于深度学习的边缘检测,它比目前流行的canny边缘检测器更精确。边缘检测在许多用例中是有用的,如视觉显著性检测,目标检测,跟踪和运动分析,结构从运动,3D重建,自动驾驶…

MyBatis-Plus及多数据源入门教程

开发环境配置 JDK 1.8、Maven 3.8.8、 IDEA CE 2023.2、MySQL 8.0.34 框架介绍 MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis 是一款非常优秀的开源…

训练 CNN 对 CIFAR-10 数据中的图像进行分类

1. 加载 CIFAR-10 数据库 import keras from keras.datasets import cifar10# 加载预先处理的训练数据和测试数据 (x_train, y_train), (x_test, y_test) cifar10.load_data() 2. 可视化前 24 个训练图像 import numpy as np import matplotlib.pyplot as plt %matplotlib …

leetcode:506. 相对名次

一、题目 函数原型:char** findRelativeRanks(int* score, int scoreSize, int* returnSize) 二、思路 创建一个新的数组newscore,将原数组数据拷贝到新数组,降序排序新数组。 遍历原数组,在新数组中找到原数组中数据在新数组中的…

优雅使用docker-compose部署Skywalking

Skywalking使用docker-compose部署 version: 3.1 services: // 部署elasetic search 用于存储获取的应用信息与日志elasticsearch:image: elasticsearch:7.13.3container_name: elasticsearchprivileged: trueenvironment:- "cluster.nameelasticsearch" #设置集群名…

算法通关村第十二关-黄金挑战字符串冲刺题

最长公共前缀 描述 : 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 题目 : LeetCode 14.最长公共前缀 : 分析 : 第一种方式,我们可以竖着比较,如图所示,每前进一个位置就…

【论文解读】基于生成式面部先验的真实世界盲脸修复

论文地址:https://arxiv.org/pdf/2101.04061.pdf 代码地址:https://github.com/TencentARC/GFPGAN 图片解释: 与最先进的面部修复方法的比较:HiFaceGAN [67]、DFDNet [44]、Wan 等人。[61] 和 PULSE [52] 在真实世界的低质量图像…

CocosCreator 之 Tween缓动系统的使用

版本: 3.4.0 语言: TypeScript 环境: Mac 简介 在CocosCreator 3.x版本后, Tween缓动系统代替了原有的Action动作。官方使用缓动系统的主要目的之一是用于解决离线动画无法满足需求时的动态动画问题。 简单的示例: …

Java—学生信息管理系统(简单、详细)

文章目录 一、主界面展示二、学生类三、系统功能方法3.1 main()方法3.2 添加学生信息3.3 删除学生信息3.4 修改学生信息3.5 查看所有学生信息 四、完整代码4.1 Student .Java4.2 StudentManger.Java 前言:本案例在实现时使用了Java语言中的ArrayList集合来储存数据。…

【【Linux下的Petallinux 以及其他的配置】】

Linux下的Petallinux 以及其他的配置 sudo apt-get install iproute2 gawk python3 python build-essential gcc git make net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget git-core diffstat chrpath socat xterm autoconf libtoo…

HarmonyOS 位置服务开发指南

位置服务开发概述 移动终端设备已经深入人们日常生活的方方面面,如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动,都离不开定位用户终端设备的位置。 当用户处于这些丰富的使用场景中时,系统的位置能力…

三丶openlayer之source和layer

1.source和layer的概念 在前面的例子中,已经对Source和Layer有所了解了,我们用天地图为底图加载出来东西,但是这个世界上的地图不仅仅是有天地图一种类型,比如Google地图,高德地图,百度地图等,…

针对MAC上,面对8080端口被占用怎么解决

首先输入这个命令,在终端,这个是搜查命令,搜查当前8080端口被谁占着 sudo lsof -i :8080 杀死当前的进程 kill -9 1821 kill -9 (上面写着的PID)

SQL注入-数据库基础/SQL语法

目录 一,数据库概述 1.1 数据库 1.2 了解 ACID 理论 1.3 识别数据库 二,SQL 语法基础 三,SQL语句实例 3.1 SQL基础语句 3.2 SQL高级语句 四,基于SQL注入理解语法/函数 4.1 语法 4.2 函数 五,目录数据库info…

C++之算术生成算法

C之算术生成算法 accumulate #include<iostream> using namespace std; #include<vector> #include<numeric>void test() {vector<int> v;for (int i 0; i < 10; i){v.push_back(i);}int total accumulate(v.begin(), v.end(),0);cout << t…

车规激光雷达再商用车前装市场的应用

1、商用车需要什么样的激光雷达 2、如何实现车规级&#xff08;商用车&#xff09;的激光雷达 3、激光雷达安装部署方案