SpringCloud升级之路2020.0.x版-7.从Bean到SpringCloud
本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~
在理解 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:
SpringCloud升级之路2020.0.x版-7.从Bean到SpringCloud的更多相关文章
- SpringCloud升级之路2020.0.x版-1.背景
本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ Spring ...
- SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 基本流程讲解(1)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,将进入我们升级之路的又一大模块,即网关模块.网关模块我们废弃了已经进入维护状态的 ...
- SpringCloud升级之路2020.0.x版-6.微服务特性相关的依赖说明
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford spring-cl ...
- SpringCloud升级之路2020.0.x版-10.使用Log4j2以及一些核心配置
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们使用 Log4 ...
- SpringCloud升级之路2020.0.x版-43.为何 SpringCloudGateway 中会有链路信息丢失
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在开始编写我们自己的日志 Filter 之前,还有一个问题我想在这里和大家分享,即在 Sp ...
- SpringCloud升级之路2020.0.x版-29.Spring Cloud OpenFeign 的解析(1)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在使用云原生的很多微服务中,比较小规模的可能直接依靠云服务中的负载均衡器进行内部域名与服务 ...
- SpringCloud升级之路2020.0.x版-34.验证重试配置正确性(1)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在前面一节,我们利用 resilience4j 粘合了 OpenFeign 实现了断路器. ...
- SpringCloud升级之路2020.0.x版-2.微服务框架需要考虑的问题
本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ 上图中演示了一 ...
- SpringCloud升级之路2020.0.x版-3.Eureka Server 与 API 网关要考虑的问题
本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ 之前我们提到了 ...
随机推荐
- Jmeter将token设置为全局变量并跨线程进行传递参数
我们在用Jmeter做性能测试时,一般会涉及到多个线程组.而线程之间或接口之间会对上个参数有依赖性,那么我们将接口中的参数提取出来供其他线程组或接口调用呢这就需要使用到__setProperty函数, ...
- js判断字符串为空或者为null 简写
if (str1!== null || str1!== undefined || str1!== '') { var str2= str1; } 下面是简写 var str2= str1|| ''; ...
- 使用Let’s Encrypt实现网站https化
使用 Let's Encrypt 证书和搭配 Nginx 实现网站 https 化. 一.SSL证书获取 由于 Let's Encrypy 申请的 SSL 证书只有三个月的有效期,为了实现自动续期,使 ...
- 用jquery通过点击事件把下拉列表币种的值传给文本框1,再通过文本框1的币种名称用if转化为币别传值给文本框2保存
<script src="https://cdn.staticfile.org/jquery/2.2.4/jquery.min.js"></script>& ...
- 温故知新,.Net Core利用UserAgent+rDNS双解析方案,正确识别并反爬虫/反垃圾邮件
背景 一般有价值的并保有数据的网站或接口很容易被爬虫,爬虫会占用大量的流量资源,接下来我们参考历史经验,探索如何在.Net Core中利用UserAgent+rDNS双解析方案来正确识别并且反爬虫. ...
- 39、升级linux的内核
39.1.什么是linux系统内核: 操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件.一个计算机 系统是一个硬件和软件的共生体,它们互相依赖,不可分割.计算机的硬件,含有外 ...
- CentOS-Docker搭建Nacos-v1.1.4(单点)
通用属性配置(v1.1.4) name description option MODE cluster模式/standalone模式 cluster/standalone default cluste ...
- linux修改 ls 命令的时间显示格式
一直不习惯 ll 命令将时间日期格式显示为 周名和月名,想要纯粹的 数字格式,找了好久,终于想到一个办法--alias. [root@localhost ~]# alias #显示当前已存在的alia ...
- Androidmanifest.xml文件格式详解(转载)
https://www.jianshu.com/p/eaaae96473f6 来自简书大佬的
- 容器化-Docker-1-速查手册-Docker常用命令
目录 备注 常用命令 Docker镜像管理(操作对象是镜像) Docker容器管理(操作对象是容器) 容器外挂目录(宿主目录映射到容器中) 这篇文章的目的就是把最常用的命令列出来,没时间看速查命令使用 ...