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项目的压缩包。
当然,可能还有很多方式快速构建项目,这里就不一一介绍了。笔者在这里推荐使用IntelliJ IDEA开发项目,个人感觉这个开发工具还是很强大的,并且提供了很多插件供开发者使用,读者也可以根据自己的喜好进行选择,毕竟适合自己的才是最好的。
在传统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服务。
Spring Boot提供了一个强大的starter依赖机制,实质上Spring团队将Spring Boot框架整合了一切常用的maven依赖,使Spring Boot想要整合对应依赖,就要将需要的依赖全部引入。比如,需要在项目中使用Web,也就是我们常说的Spring MVC,如果是原有的maven项目,就需要引入很多依赖才能完成这个简单的需求。但是在Spring Boot项目中,我们只需要在maven依赖中加入spring-boot-starter-web依赖即可,是不是很简单?这里再举一个例子,比如项目中需要使用MySQL数据库,这里只需要加入MySQL依赖,并且在配置文件中配置数据库信息就可以正常使用。
这个特点是上一个特点的延伸,在应用程序中引入依赖之后,其实还有一个强大之处在于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即可。
在开发Web应用的时候,总会有一个困扰我们的问题,修改代码总是伴随不断重启项目,需要不断地断开Web容器,再重启来测试我们的代码。在Spring Boot应用中提供了开发者工具(spring-boot-devtools),当我们重新编译类文件的时候,开发者工具会自动替我们重启应用,无须手动单击重启。
在生产环境中,应用的各项指标监控更是必不可少。在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应用程序中。
Spring Boot应用在创建项目之后会默认为我们创建测试类的文件,实质上就是引入spring-boot-starter-test依赖,然后可以通过它对各种场景进行测试,足够满足对项目的测试需求。
由于Spring Boot项目内嵌Web容器,因此提供了一种特殊部署方式,可以直接利用Maven或者Gradle对Spring Boot项目进行打包,生成一个JAR文件,然后直接在具备环境的服务器或本地环境中利用java -jar xx.jar执行JAR文件,使应用能够快速运行。
正如1.2.1小节介绍的,Spring Boot支持的开发工具很多,无论是曾经几乎所有开发者都使用的Eclipse一族,还是现在流行的IntelliJ IDEA,又或者是专门为开发Spring系列而生的Spring Tool Suite都是开发Spring Boot应用的不二法宝。
为什么要学习Spring Boot呢?这可能是很多读者心中的疑惑。在1.2节,我们通过了解Spring Boot的特点应该已经对Spring Boot框架产生了一定的兴趣,接下来笔者将从几个方面来整体阐述学习Spring Boot框架的理由。
Spring Boot最大的优点是在一定程度上简化了我们的工作,大致分为以下几个角度对工作进行简化。
· 依赖简化:Spring Boot自有的starter中提供了一些可以快捷使用的依赖,让整合或集成一些常用的功能更便捷。
· 配置简化:在配置方法中,如果没有特殊情况,Spring Boot为我们提供了一些默认的配置,比如端口号默认为8080等。
· 部署简化:正如前面介绍的可执行JAR部署,与传统服务的Web模式部署(打WAR包部署)相比,连安装Web容器的时间都节省了,不只是开发者,对运维人员也是福音。
· 监控简化:可以通过引用Spring Boot依赖的方式快捷提供监控端点,无代码侵入,十分便捷。
“微服务”一词最早是由Martin Fowler的《Microservices》一文(原文链接为https://martinfowler.com/articles/microservices.html)提出的,其核心思想是将一个单体应用根据业务功能拆分成为多个服务,使业务代码之间不再耦合。接下来,我们介绍一下由单体应用转变为微服务应用的好处。
· 技术选型广泛:微服务不需要局限于固定的技术栈,各个服务的开发团队可以根据场景自由选择开发技术,如Java、PHP、Node.Js等。
· 服务并行开发:可以多个团队分别开发不同的模块,每个团队负责一个或者几个服务,相互不受影响。
· 单一职责:不同服务的团队只需要关注自己团队的业务,无须经常为了熟悉业务而耽误时间。
· 独立部署:由于每个服务都是独立的项目,因此当服务开发完成后,可以直接独立部署。
· 敏捷开发:每个服务的业务迭代只需要更新对应服务的功能即可,支持快速迭代。
· 故障隔离:在传统单体项目中,如果某个功能发生故障,就可能导致整个服务发生宕机,但是在微服务中,一个服务发生宕机,其他服务仍然可以继续工作。
· 服务间的接口问题:正因为拆分了微服务,服务与服务间使用接口进行相互调用,当一个接口需要改变格式或者增减数据时,所有调用这个接口的服务都需要做出相应的调整才能正确地使用。
· 高可用:拆分微服务后,可能有很多服务需要调用同一个服务或者接口,这个服务的可用性就需要让我们更加注意。
· 分布式事务:微服务系统各个服务间可能使用不同的数据库,比如搜索服务使用Elasticsearch、基础服务使用MySQL、评论服务使用MongoDB,对于不同数据库间数据的一致性将是我们面临的重大挑战。
· 网络复杂性:由于各个服务间使用接口调用,因此系统间需要考虑很多网络延迟等客观因素来保证服务间的正常运转。
· 测试的复杂性:在测试方面,服务间的接口调用、服务间的测试需要一套整体的测试方案,自动化测试就显得必不可少。
由于Spring Boot项目可以提供快速开发、测试、部署,因此Spring Boot是微服务应用的不二选择。
社区背景强大其实是Spring Boot如今盛行的原因。众所周知,Spring家族对于开发者提供了无尽的便利,而作为Spring的亲儿子“Spring Boot”则继承了一切Spring的优点,并且规避了很多Spring框架臃肿的缺点,而后续Spring家族的分布式框架Spring Cloud也是基于Spring Boot框架实现的框架,所以作为Spring的爱好者,或者将要学习Spring Cloud框架的开发者,Spring Boot是必须要学习的。
Pivotal团队对于Spring Boot更新得非常频繁,而且在Github和国内社区的关注度都极高。接下来我们看一下Spring Boot的发展史。
Phil Webb在Spring官网博客上宣布了一个名为Spring Boot的新项目的第一个里程碑版本。
Spring Boot问世,为所有Spring开发提供快速和可广泛访问的入门体验,其中版本功能包括但不限于以下几点:
· 嵌入式服务器。
· 外部配置。
· 健康检查。
· 安全性。
· 快速运行。
第一次更新,下面列出比较重要的几点更新,详细版本内容可以查看Spring Boot的Github官方版本介绍,地址为https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.1-Release-Notes。
· 对spring-boot-starter-test进行修改。
· 新增对Elasticseach和apache solr的自动配置支持。
· 新增框架模板Freemarker、Groovy和Velocity。
· Spring-WS适用于Spring Web服务支持。
· 对Jackson JSON库进行了改进。
· 添加了新的注解。
对之前的版本进行了修订,包括但不限于以下更新,详细版本内容可以查看Spring Boot的Github官方版本介绍,地址为https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.2-Release-Notes。
· 使用Tomcat 8和Jetty 9作为嵌入式Servlet容器,提供Servlet 3.1和增强的WebSocket支持。
· Spring 4.1。
· 支持JTA实务。
· 提供JMS支持。
· 提供电子邮件支持。
对之前的版本进行了修订,包括但不限于以下更新,详细版本内容可以查看Spring Boot的Github官方版本介绍,地址为https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3-Release-Notes。
· Spring更新至4.2。
· Spring Security更新至4.0。
· 新增spring-boot-devtools(热部署)。
· 新增OAuth 2的支持。
· 缓存自动配置。
对之前的版本进行了修订,包括但不限于以下更新,详细版本内容可以查看Spring Boot的Github官方版本介绍,地址为https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4-Release-Notes。
· Spring更新至4.3。
· Hibernate更新至5.0。
· 提供新的测试模块。
· Neo4J和Narayana事务管理器,Caffeine cache、Elasticsearch Jest支持。
对之前版本进行了修订,包括但不限于以下更新,详细版本内容可以查看Spring Boot的Github官方版本介绍,地址为https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.5-Release-Notes。
· 修改了一些starter的命名。
· OAuth 2资源过滤器。
· 新的记录器端点。
· 提供Apache Kafka、LDAP支持。
Spring Boot 2.x版本对Spring Boot进行了重大的改进,官网介绍如图1-4所示。该版本对之前的版本进行了修订,包括但不限于以下更新,详细版本内容可以查看Spring Boot的Github官方版本介绍,地址为https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes。
· 基于Java 8,支持Java 9。
· 支持Quartz调度程序。
· 大大简化了安全自动配置。
· 支持嵌入式Netty。
· Tomcat、Undertow和Jetty均已支持HTTP/2。
· 全新的执行器架构,支持Spring MVC、WebFlux和Jersey。
· 使用Spring WebFlux/WebFlux.fn提供响应式Web编程支持。
· 为各种组件的响应式编程提供了自动化配置,如Reactive Spring Data、Reactive Spring Security等。
· 用于响应式Spring Data Cassandra、MongoDB、Couchbase和Redis的自动化配置和启动器POM。
· 引入对Kotlin1.2.x的支持,并提供了一个runApplication函数,让你通过惯用的Kotlin来运行Spring Boot应用程序。更多信息请参阅参考文档中对Kotlin的支持部分。
· 启动时的ASCII图像Spring Boot Banner现已支持GIF。