原创 吴就业 155 0 2020-07-03
本文为博主原创文章,未经博主允许不得转载。
本文链接:https://wujiuye.com/article/c024bfd209fd423a90f43f6191e9e48d
作者:吴就业
链接:https://wujiuye.com/article/c024bfd209fd423a90f43f6191e9e48d
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。
本篇文章写于2020年07月03日,从公众号|掘金|CSDN手工同步过来(博客搬家),本篇为原创文章。
Spring Cloud
与Kubernetes
系列文章已经更新到第十五篇,而源码分析类的文章笔者是默认大家都已经对Spring
的源码所有了解了,至少什么工厂Bean
、后置处理器BeanPostProcessor
、Bean
的生命周期、Spring
容器的启动流程等都有所了解。
在继续分析Spring Cloud
实现动态配置的源码之前,我们需要补充一些Spring Boot
和Spring Cloud
的基础知识才能继续往下看。本篇我们一起学习Spring Boot
与Spring Cloud
应用的启动流程。
当我们在Spring Boot
项目中调用SpringApplication
的run
方法启动应用时,Spring Boot
应用启动流程粗粒度可划分为三个步骤。
第一步:准备环境Environment
。此时会发送一个ApplicationEnvironmentPreparedEvent
事件(应用环境准备事件),事件是同步消费的。当事件监听器都被调用完后,Spring Boot
继续完成环境Environment
的准备工作,加载application.yaml
以及所有的ActiveProfiles
对应的application-[activeProfile].yaml
配置文件。
第二步:准备ApplicationContext
容器。我们在spring.factories
文件中配置的EnableAutoConfiguration
就是在此时被读取的,并且根据配置的类名加载类,为类生成BeanDefinition
注册到bean
工厂中。
第三步:一切准备就绪后再刷新ApplicationContext
。
Spring Boot
启动流程如下图所示。
Spring Cloud
项目可以在spring.factories
配置文件中配置一种BootstrapConfiguration
类,这与Spring Boot
提供的EnableAutoConfiguration
类并没有什么区别,只是它们作用在不同的ApplicationContext
容器中。
当项目中添加Spring Cloud
的依赖时,SpringApplication
的run
方法启动的就会是两个容器,即两个ApplicationContext
。原本的应用启动流程也有所变化。
Spring Cloud
的BootstrapApplicationListener
监听ApplicationEnvironmentPreparedEvent
事件,在监听到事件时开启一个新的ApplicationContext
容器,我们可以称这个ApplicationContext
容器为Spring Cloud
的Bootstrap
容器。
Bootstrap
容器被用来注册spring.factories
配置文件中配置的所有BootstrapConfiguration
,并在Bootstrap
容器初始化完成后将其Bean
工厂作为原本Spring Boot
启动的ApplicationContext
容器的Bean
工厂的父工厂,如下图所示。
这个Spring Cloud
层的Bootstrap
容器似乎是Spring Cloud
特定为实现动态配置量身定做的。
Spring Cloud
的启动流程如下图所示。
Spring Cloud
创建为应用启动一个Bootstrap
容器也会走一遍Spring Boot
应用的启动流程。而原来main
方法中调用SpringApplication
的run
方法启动ApplicationContext
容器则会卡在环境准备阶段,等待Spring Cloud
为其提供父工厂。
bootstrap.[yaml|props]
配置文件在BootstrapApplicationListener
监听到ApplicationEnvironmentPreparedEvent
事件时,准备启动Bootstrap
容器之前读取,并写入到Bootstrap
容器的Environment
。
BootstrapApplicationListener
通过判断Environment
中是否存在bootstrap
这个PropertySource
辨别当前容器是否是Bootstrap
容器,以解决无限监听到ApplicationEnvironmentPreparedEvent
事件启动新容器的问题。
声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。
本篇我们继续通过了解Spring Cloud Kubernetes实现动态加载配置接口来理解Spring Cloud动态配置实现的整个流程。
本篇分析Spring Cloud Kubernetes服务注册与发现实现原理,以及Spring Cloud Kubernetes Core&Discovery源码分析。
本篇我们再对Ribbon的重试机制地实现做详细分析,从源码分析找出我们想要地答案,即如何配置Ribbon实现调用每个服务的接口使用不一样的重试策略,如配置失败重试多少次,以及自定义重试策略RetryHandler。
订阅
订阅新文章发布通知吧,不错过精彩内容!
输入邮箱,提交后我们会给您发送一封邮件,您需点击邮件中的链接完成订阅设置。