1.1.1 Spring Boot 介绍
(1)Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。传统的spring项目中需要用到大量的xml配置,以及复杂的bean依赖关系,随着spring3.0的发布spring团队开始大量使用约定大于配置的思想来简化配置。
(2)Spring Boot就是这样一种开发框架,Spring Boot并不能直接完成Spring的工作。准确的说Spring Boot只是一个整合Spring各项功能的中间件,用于快速的开发Spring应用,同时针对于常用的第三方库也提供了默认的配置,几乎可以实现0配置开发的目的。
(3)Spring Boot的设计是可以尽可能快地启动和运行,只需要最少的Spring配置。Spring Boot对构建生产就绪应用程序具有独特的方式。从官方的介绍可以看出Spring Boot的核心思想是“约定优先于配置(Convention Over Configuration)”,其本质其实还是基于Spring来实现的。对于了解Spring的人或者使用过Spring的人来说,Spring烦琐的配置让很多程序员眼花缭乱(各种XML、Annotation配置等),甚至很多时候发生错误也很难快速定位错误的地方。而在Spring Boot框架中,为我们提供了默认的配置,从而使开发人员不再需要定义样板化的配置,通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(Rapid Application Development)成为领导者。
1.2.1 快速构建项目
Spring Boot具有多种快速构建项目的方式,如下面几种形式:
(1)使用Eclipse(MyEclipse)可以利用创建Maven项目的方式创建Spring Boot项目。当然,如果在Eclipse中安装了Spring Tools,就可以直接创建Spring Starter Project。
(2)使用IntelliJ IDEA,可以利用创建Spring Initializr的方式创建Spring Boot项目,在后续章节会详细介绍这种方式的过程。
(3)使用Spring Tool Suite,可以直接新建Spring Starter Project项目,过程类似Eclipse创建Spring Boot项目。
(4)使用官方文档创建项目,在Spring官方文档上面提供了一种在线生成Spring Boot项目的方式,首先访问Spring官方快速构建地址(官网地址:https://start.spring.io/
),在这个页面上选择对应版本、构建工具等,填写完成后单击Generate Project按钮,即可在本地下载一个Spring Boot项目的压缩包。
1.2.2 嵌入式Web容器
在传统Java Web项目中,当项目开发完成之后,还需要配置所需的Web容器(诸如Tomcat或者WebLogic之类的Web容器)。但是在Spring Boot搭建的项目中,内部提供了几种Web容器,如Tomcat、Jetty和Undertow。
在Spring Boot 1.x中默认为Tomcat;Spring Boot 2.x中则分为两种情况,引入spring-boot-starter-web
依赖为Tomcat,引入spring-boot-starter-webflux
依赖则为Netty。当然,也支持使用之前指出的几种Web容器,开发者只需要根据场景选择适合的Starter来获取一个默认配置好的容器即可,当启动成功后,应用一个默认端口为8080的HTTP服务。
1.2.3 易于构建任何应用
Spring Boot提供了一个强大的starter依赖机制,实质上Spring团队将Spring Boot框架整合了一切常用的maven依赖,使Spring Boot想要整合对应依赖,就要将需要的依赖全部引入。比如,需要在项目中使用Web,也就是我们常说的Spring MVC,如果是原有的maven项目,就需要引入很多依赖才能完成这个简单的需求。但是在Spring Boot项目中,我们只需要在maven依赖中加入spring-boot-starter-web
依赖即可。比如项目中需要使用MySQL数据库,这里只需要加入MySQL依赖,并且在配置文件中配置数据库信息就可以正常使用。
1.2.4 自动化配置
这个特点是上一个特点的延伸,在应用程序中引入依赖之后,其实还有一个强大之处在于Spring Boot应用会根据引入的依赖提供一些默认的配置供我们使用,如果需要修改,那么只需要在配置文件中修改对应的配置即可完成需求。
以Spring MVC为例,传统Spring MVC项目需要配置对应的诸如ApplicationContext.xml
(Spring配置文件)、ApplicationContext-mvc.xml
(Spring MVC配置文件),而在Spring Boot中,这些需要的配置已经为我们默认配置了一套,不需要再进行配置了。比如,我们要加入Web应用程序根路径test的话,只需要在application.properties
(Spring Boot应用程序默认配置文件)中加入server.servlet.context-path=/test
即可。
1.2.5 开发者工具
在开发Web应用的时候,总会有一个困扰我们的问题,修改代码总是伴随不断重启项目,需要不断地断开Web容器,再重启来测试我们的代码。在Spring Boot应用中提供了开发者工具(spring-boot-devtools
),当我们重新编译类文件的时候,开发者工具会自动替我们重启应用,无须手动单击重启。
1.2.6 强大的应用监控
在生产环境中,应用的各项指标监控更是必不可少。在Spring Boot应用中提供了一个spring-boot-starter-actuator
(以下简称Spring Boot-Actuator
)来供我们查看应用的各项指标,如health(健康检查)、dump(活动线程)、env(环境属性)、metrics(内存,CPU等)等指标,以监控我们的应用,同时可以配合使用spring-boot-admin-starter-server
(以下简称Spring Boot-Admin
)监控我们的项目。
Spring Boot-Admin
可以在利用监控Spring Boot-Actuator
端点的同时监控所有微服务应用的健康状态,如果出现异常,就可以向维护人员发送邮件或者以其他方式给予告警。不只是这样,就连监控神器Prometheus也可以通过简单的配置接入Spring Boot应用程序中。
1.2.7 默认提供测试框架
Spring Boot应用在创建项目之后会默认为我们创建测试类的文件,实质上就是引入spring-boot-starter-test
依赖,然后可以通过它对各种场景进行测试,足够满足对项目的测试需求。
1.2.8 可执行Jar部署
由于Spring Boot项目内嵌Web容器,因此提供了一种特殊部署方式,可以直接利用Maven或者Gradle对Spring Boot项目进行打包,生成一个JAR文件,然后直接在具备环境的服务器或本地环境中利用java -jar xx.jar
执行JAR文件,使应用能够快速运行。
1.2.9 IDE多样性
Spring Boot支持的开发工具很多,无论是曾经几乎所有开发者都使用的Eclipse一族,还是现在流行的IntelliJ IDEA,又或者是专门为开发Spring系列而生的Spring Tool Suite
都是开发Spring Boot应用的不二法宝。
1.3.1 简化工作
Spring Boot最大的优点是在一定程度上简化了我们的工作,大致分为以下几个角度对工作进行简化。 ·
(1)依赖简化:Spring Boot自有的starter中提供了一些可以快捷使用的依赖,让整合或集成一些常用的功能更便捷。
(2)配置简化:在配置方法中,如果没有特殊情况,Spring Boot为我们提供了一些默认的配置,比如端口号默认为8080等。
(3)部署简化:正如前面介绍的可执行JAR部署,与传统服务的Web模式部署(打WAR包部署)相比,连安装Web容器的时间都节省了,不只是开发者,对运维人员也是福音。
(4)监控简化:可以通过引用Spring Boot依赖的方式快捷提供监控端点,无代码侵入,十分便捷。
1.3.2 微服务时代
“微服务”一词最早是由Martin Fowler的《Microservices》一文提出的,其核心思想是将一个单体应用根据业务功能拆分成为多个服务,使业务代码之间不再耦合。
微服务的优势
(1)服务解耦:将单体应用转变为多个服务,服务与服务之间通过HTTP协议或其他约定好的协议等进行网络通信。
(2)技术选型广泛:微服务不需要局限于固定的技术栈,各个服务的开发团队可以根据场景自由选择开发技术,如Java、PHP、Node.Js等。
(3)服务并行开发:可以多个团队分别开发不同的模块,每个团队负责一个或者几个服务,相互不受影响。
(4)单一职责:不同服务的团队只需要关注自己团队的业务,无须经常为了熟悉业务而耽误时间。
(5)独立部署:由于每个服务都是独立的项目,因此当服务开发完成后,可以直接独立部署。
(6)敏捷开发:每个服务的业务迭代只需要更新对应服务的功能即可,支持快速迭代。
(7)故障隔离:在传统单体项目中,如果某个功能发。
微服务的劣势
(1)部署需要花费更多的精力:当服务拆分得非常多的时候,可能需要消耗更多的精力去运维管理这些应用。传统的单体应用下,运维人员只需要保证一个服务正常运行即可,但是拆分微服务后,可能需要保持几十,甚至上百、上千的服务高效运行,这对运维人员来说是一个很大的挑战。
(2)服务间的接口问题:正因为拆分了微服务,服务与服务间使用接口进行相互调用,当一个接口需要改变格式或者增减数据时,所有调用这个接口的服务都需要做出相应的调整才能正确地使用。
(3)高可用:拆分微服务后,可能有很多服务需要调用同一个服务或者接口,这个服务的可用性就需要让我们更加注意。
(4)分布式事务:微服务系统各个服务间可能使用不同的数据库,比如搜索服务使用Elasticsearch、基础服务使用MySQL、评论服务使用MongoDB,对于不同数据库间数据的一致性将是我们面临的重大挑战。
(5)网络复杂性:由于各个服务间使用接口调用,因此系统间需要考虑很多网络延迟等客观因素来保证服务间的正常运转。
(6)测试的复杂性:在测试方面,服务间的接口调用、服务间的测试需要一套整体的测试方案,自动化测试就显得必不可少。
由于Spring Boot项目可以提供快速开发、测试、部署,因此Spring Boot是微服务应用的不二选择。
1.3.3 社区背景强大
社区背景强大其实是Spring Boot如今盛行的原因。众所周知,Spring家族对于开发者提供了无尽的便利,而作为Spring的亲儿子“Spring Boot”则继承了一切Spring的优点,并且规避了很多Spring框架臃肿的缺点,而后续Spring家族的分布式框架Spring Cloud也是基于Spring Boot框架实现的框架,所以作为Spring的爱好者,或者将要学习Spring Cloud框架的开发者,Spring Boot是必须要学习的。