前言
之前写了部分 Nacos 注册中心的源码分析文章,现在继续接着看 Nacos 配置中心的源码了。
本次目标有两个:
- 了解 Spring Boot 项目启动时,如何从 Nacos 配置中心获取初始化配置。
- Nacos 配置中心配置变更时,Spring Boot 项目如何更新。
当然实践至上,当弄明白上述两个问题后,也需要写一个丐版注册中心来加强认知。
丐版注册中心需要实现两个功能:
- Spring Boot 项目启动时,可从丐版注册中心获取初始配置。
- 丐版注册中心配置变更时,Spring Boot 项目能更新配置。
Spring Boot 初始化器
我们在《 『深入学习 Spring Boot』(二) 系统初始化器 》中曾学习到:
官方描述:系统初始化器是Spring容器刷新之前执行的一个回调函数。
作用是向Spring Boot容器中注册属性,需要实现
ApplicationContextInitializer
接口。
Spring Cloud 配置中心就是依靠ApplicationContextInitializer
去调用远程接口,获取配置信息。
org.springframework.cloud.bootstrap.config
包下,有此类:
1 | ini复制代码public class PropertySourceBootstrapConfiguration implements |
这里还涉及到了,Spring 上下文中的Environment
类。
如果觉得陌生,可先阅读 《『深入学习 Spring Boot』(十) Environment 》、《『深入学习 Spring Boot』(十一) profiles 》我的两篇博客。
此类就是 Spring Boot 与 Nacos 之间的 God Class
了。
PropertySourceLocator 属性加载器
这是一个接口定义,其实现类将真正读取属性。
1 | scss复制代码public interface PropertySourceLocator { |
查看此接口的关系:
好巧不巧,有个 Nacos 相关的实现。这下子可以串起来了。
Spring Boot 项目启动时,将执行 PropertySourceBootstrapConfiguration # initialize()
,在其中获取到 PropertySourceLocator
的实现类遍历执行locate()
方法。
那么我们可以有一个猜想了,NacosPropertySourceLocator
在locate()
中,请求配置中心获取到配置,设置到Environment
中,Spring Boot 不就可以正常启动了。
NacosPropertySourceLocator
1 | arduino复制代码public class NacosPropertySourceLocator implements PropertySourceLocator { |
NacosPropertySourceBuilder
1 | typescript复制代码public class NacosPropertySourceBuilder { |
NacosConfigService
1 | vbnet复制代码public class NacosConfigService implements ConfigService { |
从远程获取到配置项后,就可以保存到上下文环境中,进行应用程序的启动了。
小结
Nacos 配置中心是如何与 Spring Cloud 结合的?
- Spring Boot 有初始化器机制,专门用于初始化属性的。Spring Cloud 实现了一个初始化器,并在其中调用
PropertySourceLocator#locate()
。 - Nacos 有一
PropertySourceLocator
的实现类,并在locate()
方法中进行远程调用,获取具体配置项。
本文转载自: 掘金