前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微服务架构-SpringBoot2.0.3源码之web容器篇(二)

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

作者头像
35岁程序员那些事
发布2020-02-24 12:59:55
6130
发布2020-02-24 12:59:55
举报
文章被收录于专栏:35岁程序员那些事
  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()

...

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构随笔录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档