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

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

作者头像
35岁程序员那些事
发布2020-02-24 12:54:27
6820
发布2020-02-24 12:54:27
举报
  1. 背景 从事java开发的同学,应该都经历过如下的开发经历:老大突然交接给你一个项目,但是项目已经经手过N+1个人,项目子工程通常都很多,整个项目到处都是xml配置文件,属性配置文件等,你除了要快速的熟悉业务代码逻辑,还要频繁的应付杂乱无章的配置文件,是不是觉得很头疼,这里就列举SpringBoot框架的一个好处,就是无xml,如果不熟悉SpringBoot框架,可以自我学习升级,这里主要要介绍SpringBoot2.0.X系列web容器篇的架构改进。(备注:都是个人理解,如有不符合大众思维,请指出)
  2. SpringBoot 整体模块设计

SpringBoot高度模块化,特别适合需要高度模块化的业务项目,SpringBoot整体设计思路就是简单、高效、剥离组件、省代码。

1)spring-boot

封装了需要走自动配置的公共bean,例如数据源DataSourceBuilder,负责SpringBoot支持的数据源的底层逻辑处理。

2)spring-boot-autoconfigure

自动配置模块,@EnableAutoConfiguration注解触发所有需要走自动配置的组件,比如DataSourceAutoConfiguration,会在Server容器启动的时候自动的注入。

3)spring-boot-starters

暴露模块中间件给使用方,高度的模块化,具体的模块化细节请参考源码,例如需要使用AMQP,只需要引入spring-boot-starter-amqp,spring-boot-starter-amqp会自动的集成spring-boot-starter、spring-messaging和spring-rabbit

4)spring-boot-cli

spring-boot-cli可以快速搭建一个spring原型应用,并且可以运行Groovy脚本

5)spring-boot-actuator

SpringBoot还提供了许多附加功能,可以帮助我们在应用程序部署到生产环境后对其进行监控和管理。springboot提了http,jmx,shell等功能来管理和监控我们的应用程序。另外审计,监控和性能指标的可以自动应用到应用程序上。

6)spring-boot-loader

SpringBoot允许使用java -jar命令启动模块

7)spring-boot-tools

SpringBoot提供的通用的工具模块

spring-boot-configuration-processor:使用@ConfigurationProperties生成元数据,元数据处理模块

spring-boot-configuration-metadata:元数据模块

.....

.....

3. SpringBoot2.0.X web容器模块设计

SpringBoot2.0重构了web容器模块,植入了嵌入式容器,使用工厂设计模式和模板设计模式,完美的将流式web容器和基于Servlet的容器在代码层隔离,灵活配置,完全解耦,开箱即用,模块设计如下:

熟悉web开发的同学都知道,凡是需要Servlet特性的业务场景,项目必须要在web容器中启动,比如Tomcat、jetty等,但是如果项目只是api-gateway,只是提供一些请求路由功能,那么就完全需要使用Netty这样无阻塞的高性能NIO框架,因此SpringBoot2.0.X集成了Netty。

SpringBoot是如何做到内置容器和外置容器的灵活切换,原理分析如下:

1)外置容器启动

War包需要借助SpringBoot框架内嵌容器之外的web容器启动,应用可以重载SpringBootServletInitializer.configure方法+注解@SpringBootApplication,从内置容器切换到外置容器,如果需要了解切换原理,需要详细的翻阅SpringBootServletInitializer源码,SpringBootServletInitializer继承org.springframework.web.WebApplicationInitializer,暴露configure方法,让应用可以重写,并重新构造SpringApplicationBuilder,并绑定Servlet、Filter和ServletContextInitializer支持应用war包部署。

2) 内置标准容器启动

java虚拟机会自动的去加载main方法,通过main方法来委托Spring Boot的SpringApplication类,SpringApplication.run引导我们的应用程序,启动Spring,然后启动自动配置的Tomcat Web服务器。其实SpringApplication.run方法也是模拟传统的web容器启动war的原理,将jar包自动的加载的内置的容器中,具体原理将在接下来的文章中输出。

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

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

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

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

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