1.1 Spring Cloud基础:Spring Boot概述
本章要介绍的 Spring Cloud生态基于 Spring Boot。因此,必须先熟悉 Spring Boot的原理。
Spring Boot的诞生源自Spring团队内部的一个想法:Improve Containerless Web Application Architectures(改进无容器的 Web应用结构)。也就是说,Mike Youngstrom(AWS软件工程师)认为基于 Servlet 的开发太烦琐了,会给 Spring 开发人员增加新的学习负担,因为使用原生的Servlet容器开发模式会面临以下问题:
·需要 web.xml 或其他 Servlet 容器需要的配置文件,配置文件中的内容在不同的Servlet容器里有不同的格式。
·需要构造WAR包并部署到Servlet容器中。
·不同的Servlet容器有不同的配置方式,比如端口和线程池的方式都需要熟悉。
·ClassLoader继承机制复杂。
·监控和管理功能需要在应用外部进行配置。
·单独配置日志功能。
·理解ApplicationContext内的各种配置及继承关系。
Mike Youngstrom 认为越简单的开发框架越受欢迎,所以想要使用这种无容器(这里的无容器指的是Servlet容器)的开发方式。使用无容器开发方式可以带来以下好处:
·提供一个统一的组件模型,不需要知道Servlet组件模型。
·统一所有的配置格式,这样开发者只需要学习 Spring 配置模型,这套配置模型会生效于应用,以及对应的第三方组件(比如数据库、Redis)。
·从main函数执行将会简化应用的启动和关闭。
·一个更简单的纯Java类加载层次结构。
·简单的开发工具。不需要复杂的 IDE来构造 WAR包,并将其部署到 Servlet容器中,只需执行应用程序主类即可。
之后的一些Support embedded servlet containers(支持内置Servlet容器)、Add Grails like BootStrap functionality(添加类似 Grails的 Bootstrap功能)等都被关联到这个 Issue中。这些Issue都对Spring Core模块里的代码进行了修改。
Spring Boot创始人Phil Webb针对这些现象评论:我们决定启动一个名为Spring Boot的新项目来解决这些问题,而不是在Spring Core模块里修改。
Mike Youngstrom提出的无容器开发方式带来的好处目前在Spring Boot中都已经有了对应的功能。
·内置 Servlet 容器,提供统一的容器抽象。这个 Servlet 容器抽象有 Tomcat、Jetty、Undertow和Netty实现类。
·对于所有组件的配置项,可以使用相同的格式在application.properties和application.yml中配置,不再需要为单独的组件创建不同的配置方式。例如,端口号不再需要在Servlet容器的配置文件中配置,只需在application.properties中配置server.port项;日志的级别不再需要在日志框架的配置文件里配置,只需在 application.properties 中配置logging.level.root等相关配置项。
·提供了 SpringApplication用于直接运行 Spring应用,无须关注 ApplicationContext 的构造。
·只存在一个ClassLoader,不会像单独的Servlet容器那样拥有独立的ClassLoader。
·内置Servlet容器,直接执行main方法即可,无须构造WAR包。
简单了解了Spring Boot诞生的背景之后,接下来剖析Spring Boot核心特性的内容。