共计 2743 个字符,预计需要花费 7 分钟才能阅读完成。
本系列为之前系列的整顿重启版,随着我的项目的倒退以及我的项目中的应用,之前系列外面很多货色产生了变动,并且还有一些货色之前系列并没有提到,所以重启这个系列重新整理下,欢送各位留言交换,谢谢!~
在了解 Spring Cloud 之前,咱们先理解下 Spring 框架、Spring Boot、Spring Cloud 这三者的关系,从一个简略的 Bean,是如何倒退出一个具备微服务个性的 Spring Cloud 的呢?
Spring bean 是 Spring 框架在运行时治理的对象。Spring bean 是任何 Spring 应用程序的根本构建块。你编写的大多数利用程序逻辑代码都将放在 Spring bean 中。之后 咱们就用 Bean 来简称 Spring bean。
BeanFactory 是 Spring 容器的外围,是一个治理着所有 Bean 的容器。通常状况下,BeanFactory 的实现是应用懒加载的形式,这意味着 Bean 只有在咱们通过 getBean()
办法间接调用获取它们时才进行实例化。
ApplicationContext 在 BeanFactory 的根底上,减少了:
- 资源定位与加载,基于
ResourcePatternResolver
(其实就是带通配符的ResourceLoader
),用来定位并加载各种文件或者网络资源 - 所处环境,基于
EnvironmentCapable
。每个ApplicationContext
都是有Environment
的,这个Environment
,包含 Profile 定义还有 Properties。Profile 配置是一个被命名的、bean 定义的逻辑组,这些 bean 只有在给定的 profile 配置激活时才会注册到容器。Properties 是 Spring 的属性组,这些属性可能来源于 properties 文件、JVM properties、system 环境变量、JNDI、servlet context parameters 上下文参数、专门的 properties 对象,Maps 等等。 - Bean 的初始化
- 更加残缺的 Bean 生命周期,包含
BeanPostProcessor
以及BeanFactoryPostProcessor
的各种解决 - 国际化,外围类
MessageSource
- 事件公布,基于
ApplicationEventPublisher
:将ApplicationEvent
或者其余类型的事件,发给所有的 Listener
能够了解为 ApplicationContext 外部蕴含了一个 BeanFactory,并减少了其余的组件,实现了更丰盛的性能,并且,与 BeanFactory 懒加载的形式不同,它是预加载,所以,每一个 Bean 都在 ApplicationContext 启动之后实例化。
在 ApplicationContext 的根底上,Spring 框架引入了很多个性。其中最常见的就是 Spring Web 程序。在过来,Spring Web 应用程序被嵌入到 servlet 容器中运行,大多数的企业应用都是在 servlet 容器上配置并部署运行的。这对于开发人员来说,又减少了对于对应 servlet 容器的学习曲线,这包含:
- web.xml 和其余面向 servlet 的配置概念
- .war 文件目录构造
- 不同容器的特定配置(例如裸露端口配置,线程配置等等)
- 简单的类加载档次
- 在应用程序之外配置的监控治理相干设施
- 日志相干
- 应用程序上下文配置等等
以上配置不同容器并不对立,开发者须要在晓得 spring 相干配置的根底上,还要理解容器这些配置个性。这些简单的配置个性导致学习门槛变高,并且随着技术倒退把握 Servlet 原理的开发者越来越少了。在企业应用开发的时候,应用程序框架越简略,开发人员就越有可能采纳该框架。于是,Mike Youngstrom 提出 Improved support for ‘containerless’ web application architectures,用意通过内置 Servlet 容器以及预设加载某些类组成特定的 ApplicationContext,来简化 Spring 利用开发的配置。
Spring Boot,在 ApplicationContext 的根底上,实现了 Spring Boot 特有的 ApplicationContext,并通过增加不同 ApplicationEvent 的 Listener 实现了 特有的生命周期 和配置 与 SPI 加载机制(spring.factories
和 application.properties
),在此基础上进而实现了如下性能:
- 内置 servlet 容器,提供了容器的对立形象,即
WebServer
。目前包含:Tomcat(TomcatWebServer
),Jetty(JettyWebServer
),Undertow(UndertowWebServer
),Netty(NettyWebServer
) - 不同 servlet 容器的配置都能够用雷同的 key 在 application.yml 中配置。例如裸露端口不必再在不同的 servlet 容器中配置,而是间接在 application.yml 中配置
server.port
即可。 - 不再须要结构 war 包部署到 servlet 容器中,而是间接打包成一个 jar 包间接运行。
- 用户不必关怀 ApplicationContext 的创立与治理,而是能够间接应用。
- 只存在一个 ClassLoader,而不是像 servlet 容器那样有独立的 ClassLoader
Spring Cloud 在 Spring Boot 的根底上,减少微服务相干组件的接口与实现,不同的 Spring Cloud 体系组件接口与实现不同。然而公共的组件接口在 spring-cloud-commons 这个我的项目中,其中对于微服务组件的接口包含:
- 服务注册接口
- 服务发现接口
- 负载平衡接口
- 断路器接口
实现这些接口的组件,会基于 Spring Cloud 的 NamedContextFactory
,对于不同微服务的调用或者管制,以微服务名称辨别,产生不同的子 ApplicationContext。对于这个 NamedContextFactory
,咱们这个系列会专门有一节进行剖析。
咱们这一节梳理分明了从 Bean 到 BeanFactory,在 BeanFactory 根底上封装的 ApplicationContext,以及次要基于注解的 ApplicationContext 以及 Spring factory SPI 的 Spring Boot,以及在 Spring Boot 根底上减少微服务形象的 Spring Cloud 的这一系列关系。接下来咱们会详细分析下 Spring Cloud 中很重要的形象 – NamedContextFactory
微信搜寻“我的编程喵”关注公众号,每日一刷,轻松晋升技术,斩获各种 offer: