Spring Boot 实战开发
1. 引言
Spring 框架自2003年由Rod Johnson 设计实现经历多个重大版本发展和演进形成庞大的家族式技术生态圈
Spring 已经是JavaEE 领域中最流行的开发框架
1.1 Spring 技术生态
微服务架构 响应式编程 云原生 Web应用 Serverless架构 事件驱动 批处理
单谈这些技术体系各自独立但也有一定交际,例如微服务架构往往会与基于Spring Cloud 的云原生技术结合在一起使用,而微服务架构的构建过程也需要依赖于能够提供RESTful风格的Web应用程序等。
另一方面,在具备特定的技术特点之外,这些技术体系也各有其应用场景。例如,如果我们想要实现日常报表等轻量级的批处理任务,而又不想引入Hadoop这套庞大的离线处理平台时,使用基于Spring Batch的其处理框架是一个不错的选择。再比如说,如果想要实现与Kafka,robbitMq等各种主流消息中间件之间的集成,但有希望开放人员不需要了解这些中间件在使用上的差别,那么使用基于Spring Cloud Stream 的事件驱动架构是你的首选,因为这个框架对外提供了统一的API,从而屏蔽了内部各个中间件在实现上的差异性。
构建单块Web服务,采用SpringBoot .如果要开发微服务架构,那么就需要使用基于Spring Boot 的Spring Cloud ,而Spring Cloud 同样内置了基于 Spring Cloud Stream 的事件驱动架构。 同时在这里要特别强调的是响应式编程技术。响应式编程是Spring5 引入的最大创新,代表了一种系统架构设计和实现的技术方向。因此我们也将从Spring Boot、Spring Cloud以及Spring 响应式编程的三个技术体系进行切入,看看Spring具体能够为我们解决开发过程中的哪些问题。
当然,我们仙子能看到的Spring家族技术体系都是在 Spring Framework 基础上逐步演进而来的。在介绍上述技术体系之前,我们先简单聊几下Spring Framework的整体架构:
Spirng从诞生之初就被认为是一种容器,上图中的“核心容器”部分就包含了一个容器所应该具备的核心功能,包括容器中基于依赖注入机制的JavaBean处理,面向切面AOP,上下文Context及Spring自身所提供的表达式工具等一些辅助功能。
最上面的两个框就是构建应用恒旭所需要的最核心的两个功能组件,也是我们日常开发中最常用的组件,及数据访问和Web服务。这两大部分功能组件中包含的内容非常多,而且充分体现了Spring Framework的集成性,也就是说,阔加内部整合了业界主流的数据库驱动,消息中间件,ORM框架等各种工具,开发人员可以根据需要灵活地替换和调整自己想要使用的工具。
从开发语言上讲,虽然Spring应用最广泛的是在javaEE领域,但在当前的版本中,也支持 Kotlin,Groovy以及各种动态开发语言.
1.2 Spring Boot 与 Web应用程序
Spring Boot 构建在 Spring Framework 基础之上,是新一代的Web应用程序开发框架。我们可以通过下面这张图来了解Spirng Boot 的全貌:
通过浏览 Spring 的官方网站,我们可以看到Spring Boot 已经成为Spring 中顶级的子项目。自2014年4月发布 1.0.0版本以来,Spring Boot 俨然已经发展为JavaEE 领域开发Web应用程序的首选框架。
让我们先来感受一下使用 Spring Boot 开发一个RESTful风格的HTTP断电所需要做的编码工作,如下所示:
@SpringBootApplication
@RestController
public class DemoApplication {
@GetMapping("/helloworld")
public String hello() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
这是一个经典的"Hello World" 程序,而且使用 Spring Boot 来构建这样一个支持 RESTful 风格的Web应用程序只需要几秒钟。一旦创建了一个Spring Boot应用程序,并添加类似上面的类,我们就可以启动Spring Boot 内置的Web 服务器并监听8080端口,剩余的一切工作Spring Boot 都帮你自动完成了,是不是很强大?Spring Boot的强大之处还不止这一点,让我们一起看一下Spring Boot的核心功能.
通过前面的描述,我们已经发现Spring Boot具备了传统 Spring 框架所不具备的功能特性,及支持运行期内嵌容器(包含Tomcat,Jetty等支持Servlet规范的多款传统Web容器).而在最新的Spring Boot 2.X 版本中,还提供了对Netty以及继承Servlet3.1+的非阻塞式容器的支持。基于运行期内嵌容器机制,开发人员想要启动Web服务只需要使用一行 java -jar 命令就可以了。
通过前面的代码示例,我们还发现Spring Boot的核心功能就是自动配置。在前面的示例中,我们可以看到Spring Boot 并没有像以前使用 Spring MVC一样需要制定一大堆关于 HTTP请求和相应的XMl配置。事实上,Spring Boot 的运行过程同样还是依赖于Spirng MVC,但是它把原来需要开发人员指定的各种配置项设置了默认值,并内置在了运行时环境中,例如默认的服务器端口就是8080,如果我们不需要对这些配置项有定制化需求,就可以不做任何的处理,采用既定的开发约定即可。这就是Spring Boot 所倡导的约定大于配置(Convention over Configuration) 设计理念。
另外,相较传统的Spring框架,Spring Boot 的一大亮点是映入了内置的监控机制,这是通过Actuator 组件(常见的包括内存信息,JVM信息,垃圾回收信息等)来实现的。基于Actuator组件,一方面我们可以查看包含自动配置在内的应用程序详细信息,另一方面可以实时监控该应用程序的运行时健康状态.
可以看到,SpringBoot 的上述功能实际上从多个维度简化了Web应用程序的开关过程,这些维度包含编码,配置,部署和监控等.
1.3 Spring Cloud 与 微服务架构
Spring Cloud 构建在 Spring Boot 基础之上,他的整体架构图如下:
技术组建的完备性是Spring Cloud 框架的主要优势,他集成了业界一大批知名的微服务开发组件.
Spring Cloud 核心功能组件
可以看到,基于 Spring Boot 的开发便利性,Spring Cloud 巧妙地简化了微服务系统基础设施的开发过程,Spring Cloud 包含上图中所展示的服务发现注册,API网关,配置中心,消息总线,负载均衡,熔断器,数据监控等。
1.4 Spring 5 与响应式编程
目前,Spring 已经演进到5.x 版本。 随着Spring 5 的正式发布,我们迎来了响应式编程(Reactive Programming)的全兴发展时代。Spring 5 中 内嵌了与数据管理相关的响应式数据访问,与系统集成相关的相应四消息通信以及与Web服务相关的响应式Web框架等多种响应式组件,从而极大地简化了响应式应用程序的开发过程和开发难度
从上图可以看到,上图左侧为基于Spring WebFlux的技术栈,右侧为基于Spring MVC的技术栈。 我们知道传统的Spring MVC构建在java EE 的 Servlet标准之上,该标准本身就是阻塞式和同步的,而Spring WebFlux基于响应式流,因此可以用来构建异步非阻塞的服务。
在Spring 5中,选取了 Project Reactor 作为响应式流的实现库。由于响应式编程的特性,Spring WebFlux 和project Reactor 的运行需要依赖于诸如Netty 和 Undertow 等支持异步机制的容器。同时我们也可以选择较新版本的Tomcat 和Jetty 作为运行环境, 应为他们支持异步 I/O 的 Servlet 3.1. 下图更加明显的展示了Spring MVC 和Spring WebFlux 之间的区别和联系:
在基于 Spring Boot 以及 Spring Cloud 的应用程序中,Spring WebFlux 和 Spring MVC可以混合进行使用。
讲完Spring 家族的技术体系,让我们回到课程。 在01讲中,我们主要围绕 Spring boot框架展开讨论,分别从配置体系,数据访问,Web服务,消息通信,系统安全,系统监控,应用测试等维度对该框架进行深入的剖析,所采用的版本为2.2.X版。
小结与预告
本课时系统分析了Spring家族的技术生态,并重要介绍了Spring Boot ,Spring Cloud 和 Spring 响应式编程这三大技术体系。从技术演进的过程和趋势而言,这些工具和框架的出现有其必然性。Spring Boot 是对传统Spring MVC 的改进,Spring Cloud 基于 Spring Boot 构建微服务架构,而响应式编程则代表未来技术的发展方向。
Spring Boot 与 传统 Spring MVC的区别
- Spring MVC 配置繁杂,一堆复杂难记的配置
- 必须运行在外部的容器上(Tomcat)