阶段一:应用启动 — 初始化与配置拉取
自动装配(Auto-Configuration)
1、项目启动时,Spring Boot 的自动装配机制会加载 spring-cloud-starter-alibaba-nacos-config包下的 /META-INF/spring.factories文件。
2、该文件定义了自动配置类,如 NacosConfigAutoConfiguration。这个配置类会向 Spring 容器中注册一个核心 Bean — NacosPropertySourceLocator。正是这个 Bean 负责在应用启动的早期阶段去获取配置。
定位配置数据源与优先拉取
1、NacosPropertySourceLocator会根据你的配置文件(如 bootstrap.properties)中设置的 Nacos 服务器地址、Data ID、Group等信息,构造 HTTP 请求,从 Nacos 服务端拉取配置数据。
2、关键点:这个拉取动作发生在 Spring 应用的 ApplicationContext被刷新(refresh)之前,远早于我们自定义的 Bean 的初始化。这确保了后续的 Bean 可以用上从 Nacos 获取到的配置值。
构建本地配置体系
1、拉取到的配置数据(通常是 properties 或 yaml 格式的文本)会被封装成 Spring 的 PropertySource对象,并添加到当前 Spring Environment 的 PropertySource列表的最前面。这意味着 Nacos 中的配置具有最高优先级,会覆盖本地配置文件(如 application.yml)中的相同属性。
阶段二:应用运行 — 监听与动态刷新
注册监听器与长轮询
1、应用启动完成后,您提到的“定时任务”更准确的说法是 “长轮询” 。Nacos Client 会通过一个后台线程(ClientWorker中的线程池)向 Nacos Server 发起一个 HTTP 长轮询请求。
2、长轮询机制:这个请求的超时时间设置为 30 秒。如果在 30 秒内,服务器端所监听配置的 MD5 值没有变化,服务器会挂起这个请求,直到超时后才返回空响应。客户端收到响应后会立即发起下一个长轮询请求,形成一个持续的监听。这比简单的定时任务更高效,能近乎实时地感知变化。
MD5 比对与变更判断
1、Nacos Server 会为每个配置内容计算一个 MD5 指纹。客户端在拉取配置时会保存这个 MD5。
2、当您在 Nacos 控制台修改配置并发布后,Server 端会感知到变化,并重新计算 MD5。
3、此时,正在执行长轮询的客户端会立即收到一个“配置已变更”的响应,而不是等待超时。响应中包含了最新的 MD5 值。
4、客户端将收到的新 MD5 与本地保存的旧 MD5 进行比对,如果不一致,则判定配置已更新。
触发刷新 — Spring Cloud 的刷新机制
1、一旦确认配置变更,Nacos Client 会发布一个 RefreshEvent 事件(您提到的 RefreshScopeRefreshedEvent是这个流程中的一部分,但起点是 RefreshEvent)。
2、Spring Cloud 的 RefreshScope 机制会监听这个事件。随后:
1、刷新上下文:Spring Cloud 会创建一个新的 Spring 配置上下文(ContextRefresher),重新加载所有标记了 @RefreshScope的 Bean。
2、销毁并重建Bean:所有被 @RefreshScope注解的 Bean 会被销毁。当下次有请求需要注入这些Bean 时,Spring 会重新初始化它们,在这个初始化过程中,它们会从最新的 PropertySource(即已更新过的 Nacos 配置)中获取值,从而完成了配置的动态更新。
2665

被折叠的 条评论
为什么被折叠?



