专栏首页架构师玄学之路微服务架构-SpringBoot2.0.3源码之web容器篇(二)

微服务架构-SpringBoot2.0.3源码之web容器篇(二)

  1. 背景 Web服务器与应用服务器的区别,通常将Apache Http Server、Nginx、Lighttpd、IIS归纳为web服务器,将Tomcat、Jetty、JBoss、Weblogic等归纳为应用服务器,其实二者之间边界很模糊。其实从功能上来看,应用服务器已经包含了Web服务器静态资源请求的功能,从这一层理解,web服务器是应用服务器的一个子集,只是web服务器比较比较擅长处理静态资源请求,应用服务器则侧重于复杂的业务请求处理。 备注:文章言论属于个人理解,如有偏差可以纠正。
  2. SpringBoot2.0.3Web容器启动原理(与1.5.X版本差别很大) 微服务架构-SpringBoot2.0.3源码之web容器篇(一),上篇文章中已经提到过,SpringBoot内置容器通过SpringApplication启动,容器就是在SpringIOC容器启动之后,被初始化的,SpringBoot重写了容器启动逻辑。 SpringApplication支持三种上下文context(Spring设计的核心就是以context作为框架的载体):AnnotationConfigServletWebServerApplicationContext、 AnnotationConfigReactiveWebServerApplicationContext和AnnotationConfigApplicationContext,Reactive容器就是靠WebApplicationType做区分分开启动,默认NONE,可以配置REACTIVE启动流式编程,支持SpringWebFlux 。 SpringApplication.run()会先启动监听器,通过spring.factories加载SpringApplicationRunListener,其实是启动EventPublishingRunListener.starting(),监听整个SpringApplicationEvent事件。 SpringApplication.run().refreshContext(context),启动Spring容器和web服务器,其中context会根据WebApplicationType做上下文的区分, refreshContext会调用org.springframework.context.support.AbstractApplicationContext.refresh()方法,看到这个方法,是不是很熟悉,看过spring源码的人都知道,Spring IOC容器原本就是这样启动的,所以SpringBoot启动本质上是复用了Spring的逻辑。接下来就是见证奇迹的时刻,那么SpringBoot是如何启动容器的了,所以阅读源码还是很关键的, AbstractApplicationContext.refresh().onRefresh(),实际上AbstractApplicationContext并没有实现,它是要交给子类来实现,那么SpringBoot就是利用了这点,将容器初始化打入到Spring启动过程中,怎么打入的,是靠 微服务架构-SpringBoot2.0.3源码之web容器篇(一)文章中分享的架构图中说明的工厂设计模式,AnnotationConfigServletWebServerApplicationContext继承 ServletWebServerApplicationContext,AnnotationConfigReactiveWebServerApplicationContext继承 ReactiveWebServerApplicationContext,ServletWebServerApplicationContext和 ReactiveWebServerApplicationContext都会重载 AbstractApplicationContext. onRefresh(),通过工厂模式获取服务WebServer,最后ServletWebServerApplicationContext和ReactiveWebServerApplicationContext都会重载 AbstractApplicationContext.finishRefresh()方法,启动初始化好的 WebServer,这样容器就这样启动了,当然Tomcat,Jetty都是这样启动的,所以说SpringBoot是使用模板设计模式和工厂方法设计模式,将容器直接嵌入到Spring的启动过程中。如上就是SpringBoot重写容器启动过程的分析,当然我自己是懂的,如果需要自己亲自去搞懂逻辑,需要自己去研读源码。
  3. 部分源码截图

run()

refreshContext()

...

本文分享自微信公众号 - 架构师玄学之路(andy_aty),作者:胡弦

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 全链路监控系统整合业务系统如何高可用

    参照zinpkin全链路监控系统的弊端:监控系统收集器,通过集成SpringBoot插件,耦合侵入业务,和应用部署在同一个jvm中,影响洪峰下的业务系统的高可用...

    用户6969969
  • Skywalking、SpringCloudGateway以及SpringWebFlux如何融合

    SkyWalking 是一个开源 APM 系统,包括针对 Cloud Native 体系结构中的分布式系统的监视、跟踪、诊断功能。核心功能如下:

    用户6969969
  • Nacos源码分析系列之Naming模块-如何运行篇

    Naming模块其实Nacos框架实现服务治理功能的核心模块,这个模块具备很多核心功能,本次先从如何运行开始剖析。

    用户6969969
  • AI一分钟 | 北京开放自动驾驶车辆路测道路105公里;阿里将人工智能引入时尚界

    阿里巴巴集团与 GUESS 集团合作,将人工智能引入时尚界,并推出 Fashion AI 项目,今日( 4 日)于香港理工大学推出概念店。

    AI科技大本营
  • 手摸手教你用 Storybook 改善组件库的开发

    在上一篇文章 《手摸手教你封装跨项目复用的 Vue 组件》 中,介绍了一例用 rollup.js 封装 Vue.js 组件库的实践;限于篇幅和复杂度,其中组件的...

    江米小枣
  • 面试题二十四期-django项目报错CSRF-403页面被劫持-解决方案

    就算所有人都不支持你。这条路会很曲折,你也会一度认为是不是自己选错了,但只要坚持,就算最后没有成功,但努力了就不会有遗憾。

    测试小兵
  • 3039: 玉蟾宫

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 512  Solved: 311 [Subm...

    HansBug
  • MongoDB 复合索引

    如下图所示,在集合的userid以及score列上创建一个复合索引,其中userid为升序,score为降序

    Leshami
  • Juicer:Hi-C数据处理分析的利器

    通过Hi-C数据可以分析TAD,chromatin loops等染色质空间结构的基本单元,加强我们对染色质三维结构的认知。面对海量的Hi-C数据,如何高效完成数...

    生信修炼手册
  • Android系统架构与系统源码目录

    前言 技术博客终于可以恢复正常的更新速度了,原因是我编写的进阶书籍的初稿已经完成,窃以为它将会是Android应用书籍中最有深度的一本,可以说是《Android...

    用户1269200

扫码关注云+社区

领取腾讯云代金券