一、Spring与SpringBoot

1.1 Spring简述

在不同的语境中,Spring 所代表的含义是不同的。下面我们就分别从“广义”和“狭义”两个角度,对 Spring 进行介绍。

Spring官网:https://spring.io/

1.1.1 广义的 Spring:Spring 技术栈

广义上的 Spring 泛指以 Spring Framework 为核心的 Spring 技术栈。

经过十多年的发展,Spring 已经不再是一个单纯的应用框架,而是逐渐发展成为一个由多个不同子项目(模块)组成的成熟技术,例如 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等,其中 Spring Framework 是其他子项目的基础。

这些子项目涵盖了从企业级应用开发到云计算等各方面的内容,能够帮助开发人员解决软件发展过程中不断产生的各种实际问题,给开发人员带来了更好的开发体验。

项目名称

描述

Spring Data

Spring 提供的数据访问模块,对 JDBC 和 ORM 提供了很好的支持。通过它,开发人员可以使用一种相对统一的方式,来访问位于不同类型数据库中的数据。

Spring Batch

一款专门针对企业级系统中的日常批处理任务的轻量级框架,能够帮助开发人员方便的开发出健壮、高效的批处理应用程序。

Spring Security

前身为 Acegi,是 Spring 中较成熟的子模块之一。它是一款可以定制化的身份验证和访问控制框架。

Spring Mobile

是对 Spring MVC 的扩展,用来简化移动端 Web 应用的开发。

Spring Boot

是 Spring 团队提供的全新框架,它为 Spring 以及第三方库提供了开箱即用的配置,可以简化 Spring 应用的搭建及开发过程。

Spring Cloud

一款基于 Spring Boot 实现的微服务框架。它并不是某一门技术,而是一系列微服务解决方案或框架的有序集合。它将市面上成熟的、经过验证的微服务框架整合起来,并通过 Spring Boot 的思想进行再封装,屏蔽掉其中复杂的配置和实现原理,最终为开发人员提供了一套简单易懂、易部署和易维护的分布式系统开发工具包。

1.1.2 狭义的 Spring:Spring Framework

狭义的 Spring 特指 Spring Framework,通常我们将它称为 Spring 框架。

Spring 框架是一个分层的、面向切面的 Java 应用程序的一站式轻量级解决方案,它是 Spring 技术栈的核心和基础,是为了解决企业级应用开发的复杂性而创建的。

Spring 有两个核心部分: IOC 和 AOP。

核心

描述

IOC

Inversion of Control 的简写,译为“控制反转”,指把创建对象过程交给 Spring 进行管理。

AOP

Aspect Oriented Programming 的简写,译为“面向切面编程”。 AOP 用来封装多个类的公共行为,将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。另外,AOP 还解决一些系统层面上的问题,比如日志、事务、权限等。

1.2 Spring能做什么

1.2.1 Spring的能力

spring boot 是啥 spring boot spring_spring

  1. Microservices 微服务架构:通过可独立开发的微服务快速交付生产级功能。Spring Boot的特性使得在生产环境中大规模构建和运行微服务变得非常容易。而Spring Cloud则在此基础上,帮助微服务应用进一步减轻管理并提高容错能力。
  2. Reactive 响应式编程:Spring 的异步,非阻塞架构意味着您可以从计算资源中获得更多收益。这是一种基于异步的、非阻塞的、全新的开发理念和技术。
  3. Cloud 云端技术:您的代码,任何云-我们已为您覆盖。无论您使用什么平台,都可以连接并扩展您的服务。开发分布式微服务系统具有一定的挑战性。复杂性从应用层转移到网络层,并要求在服务之间进行更多的交互。Spring Cloud包含使应用程序在云中运行所需的众多服务,帮助构建云原生。
  4. Web apps Web应用程序:连接到任何数据存储的快速,安全和响应式Web应用程序的框架。这是我们最常用的一个模块,Spring提供了Spring MVC,让我们摆脱了以前使用Servlet的那种繁琐的开发方式,以更简洁和更优雅的API,来完成web应用程序的开发。
  5. Serverless 无服务器编程:极致的灵活性,按需扩展并在没有需求时扩展为零。无服务器应用程序利用现代云计算功能和抽象,使应用更加关注业务逻辑而非基础设施。Spring Cloud Function提供让Spring开发人员利用无服务器或FaaS平台的功能。
  6. Event Driven 事件驱动:与您的企业集成。对业务事件做出反应。实时处理您的流数据。事件驱动系统反映了现代企业的实际工作方式,在微服务应用架构中被广泛使用。Spring帮助开发人员能够围绕事件构建应用程序, Spring有很多事件驱动项目,比如Streaming ,Integration和Data Flow等。
  7. Batch 批处理:自动化任务。一次适合您的离线数据处理。批处理具有高效处理大量数据的能力, Spring Batch的标准处理模式帮助开发者在JVM上构建健壮的批处理作业和关键任务应用程序。

1.2.2 Spring的生态

覆盖了:

  • web开发
  • 数据访问
  • 安全控制
  • 分布式
  • 消息服务
  • 移动开发
  • 批处理

1.3 Spring5重大升级

1.3.1 响应式编程

spring boot 是啥 spring boot spring_spring boot 是啥_02

上图是Spring官方给出的Spring MVC和Spring WebFlux的对比图,先看最上面的描述信息,右侧是Spring MVC的描述:

Spring MVC is built on the Servlet API and uses a synchronous blocking I/O architecture whth a one-request-per-thread model.(翻译:Spring MVC构建在Servlet API之上,使用同步阻塞I/O架构,每个线程一个请求模型。)

左边是Spring WebFlux的描述:

Spring WebFlux is a non-blocking web framework built from the ground up to take advantage of multi-core, next-generation processors and handle massive numbers of concurrent connections.(翻译: Spring WebFlux是一个从头开始构建的非阻塞web框架,它利用多核、新一代处理器并处理大量并发连接。)

Spring WebFlux 作为一个响应式 (reactive-stack) web 框架补充,在 5.0 的版本开始加入到 Spring 全家桶。

这是一个完全非阻塞的,支持 Reactive Streams,运行在诸如 Netty, Undertow,以及 Servlet 3.1+ 容器上的。Spring WebFlux 可以让你使用更少的线程去处理并发请求,同时能够让你使用更少的硬件资源来拓展你的应用。

Spring MVC
  • 构建于 Servlet API 之上。
  • 同步阻塞 I/O 模型, 认为应用会阻塞当前线程,所以一个 Request 对应一个 Thread,需要有一个含有大量线程的线程池。
Spring WebFlux
  • 构建于 Reactive Streams Adapters 之上。
  • 异步非阻塞 I/O 模型,认为应用不会阻塞当前线程,所以只是需要一个包含少数固定线程数的线程池 (event loop workers) 来处理请求。
Spring MVC or WebFlux?

WebFlux 并不是 Spring MVC 替代,它主要应用还是在异步非阻塞编程模型上。如果你的项目并不是该模型或者你的应用目前本身已经足够应付当前情况,是不需要去切换成 WebFlux 的。官方在这个选择上也有给出 几条注意点:

spring boot 是啥 spring boot spring_spring boot_03

相同点:

1、都可以使用 Spring MVC 注解,如 @Controller, 方便我们在两个 Web 框架中自由转换;

2、均可以使用 Tomcat, Jetty, Undertow Servlet 容器(Servlet 3.1+);

3、…

不同点:

1、Spring MVC 因为是使用的同步阻塞式,更方便开发人员编写功能代码,Debug测试等,一般来说,如果 Spring MVC 能够满足的场景,就尽量不要用 WebFlux,因为 WebFlux 编码更为复杂。

2、WebFlux 默认是通过 Netty 启动,并且自动设置了默认端口为 8080。另外还提供了对 Jetty、Undertow 等容器的支持。开发者自行在添加对应的容器 Starter 组件依赖,即可配置并使用对应内嵌容器实例。

但是要注意,必须是 Servlet 3.1+ 容器,如 Tomcat、Jetty;或者非 Servlet 容器,如 Netty 和 Undertow。

3、starter组件

Webflux 提供了很多 “开箱即用” 的 Starter 组件。Starter 组件是可被加载在应用中的 Maven 依赖项。只需要在 Maven 配置中添加对应的依赖配置,即可使用对应的 Starter 组件。例如,添加 spring-boot-starter-webflux 依赖,就可用于构建响应式 API 服务,其包含了 Web Flux 和 Tomcat 内嵌容器等。

4、WebFlux 官方提供了很多 Starter 组件,每个模块会有多种技术实现选型支持,来实现各种复杂的业务需求:

  • Web:Spring WebFlux
  • 模板引擎:Thymeleaf
  • 存储:Redis、MongoDB、Cassandra。不支持 MySQL
  • 内嵌容器:Tomcat、Jetty、Undertow

1.3.2 内部源码设计

基于Java8的一些新特性,如:接口默认实现。重新设计源码架构。

Spring Framework 4.x的基准版本是Java SE 6。这意味着它支持Java 6,7和8。必须支持Java SE 6和7对Spring Framework代码的约束。 框架代码不能使用Java 8中的任何新功能。所以,当世界其他地方升级到Java 8时,Spring Framework中的代码(至少主要部分)仅限于使用早期版本的Java。

使用Spring Framework 5.0,基准版本是Java 8。Spring Framework代码现在已升级为使用Java 8中的新特性。会改进更可读和更有效的框架代码。 使用的一些Java 8特性如下:

  • 核心Spring接口中的Java 8 static 方法。
  • 基于Java 8反射增强的内部代码改进。
  • 在框架代码中使用函数式编程——lambdas表达式和stream流。

1.4 为什么用SpringBoot

Spring Boot 是 Pivotal 团队在 Spring 的基础上提供的一套全新的开源框架,其目的是为了简化 Spring 应用的搭建和开发过程。Spring Boot 去除了大量的 XML 配置文件,简化了复杂的依赖管理。

Spring Boot 具有 Spring 一切优秀特性,Spring 能做的事,Spring Boot 都可以做,而且使用更加简单,功能更加丰富,性能更加稳定而健壮。随着近些年来微服务技术的流行,Spring Boot 也成了时下炙手可热的技术。

Spring Boot 集成了大量常用的第三方库配置,Spring Boot 应用中这些第三方库几乎可以是零配置的开箱即用(out-of-the-box),大部分的 Spring Boot 应用都只需要非常少量的配置代码(基于 Java 的配置),开发者能够更加专注于业务逻辑。

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.
We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need very little Spring configuration.

Spring Boot 是所有基于 Spring 开发的项目的起点。

Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。

Spring Boot 不是为了代替Spring框架的,而是简化Spring 框架与其他第三方类库与框架的整合过程的。

Spring Booot使用 “习惯优于配置” (项目中存在大量的配置,此外还内置一个习惯性的配置,让你无须)的理念让你的项目快速运行起来。

Spring Booot 并不是什么新的框架,而是默认配置了很多框架的使用方式,就像 Maven 整合了所有的 jar 包一样,Spring Boot 整合了所有框架。

1.4.1 SpringBoot优点

回顾我们之前的 SSM 项目,搭建过程还是比较繁琐的,需要:

  1. 配置 web.xml,加载 spring 和 spring mvc
  2. 配置数据库连接、配置日志文件
  3. 配置家在配置文件的读取,开启注解
  4. 配置mapper文件

而使用Spring Boot很容易创建一个独立运行(运行jar,内嵌Servlet容器)、准生产级别的基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很少的Spring配置。

  • Create stand-alone Spring applications
  • 创建独立Spring应用
  • Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
  • 内嵌web服务器
  • Provide opinionated ‘starter’ dependencies to simplify your build configuration
  • 自动starter依赖,简化构建配置
  • Automatically configure Spring and 3rd party libraries whenever possible
  • 自动配置Spring以及第三方功能
  • Provide production-ready features such as metrics, health checks, and externalized configuration
  • 提供生产级别的监控、健康检查及外部化配置
  • Absolutely no code generation and no requirement for XML configuration
  • 无代码生成、无需编写XML

1.4.2 SpringBoot缺点

  • 迭代快,需要时刻关注变化。
  • 封装太深,内部原理复杂,不容易精通。

1.5 微服务的概念

詹姆斯·里维斯(James Lewis)和 马丁·福勒(Martin Fowler)提出微服务完整概念。

  • 微服务是一种架构风格;
  • 一个应用拆分为一组小型服务;
  • 每个服务运行在自己的进程内,也就是可独立部署和升级;
  • 服务之间使用轻量级HTTP交互;
  • 服务围绕业务功能拆分;
  • 可以由全自动部署机制独立部署;
  • 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术。

详细参照微服务文档