Spring 和 SpringBoot
# 20.Spring 和 SpringBoot
本文讲解下 Spring 和 SpringBoot 之间的区别和联系,而且我们要学好 SpringBoot,我们也应该对 Spring 的整个生态圈有所了解。
# What Spring can do
我们之前学习 Spring 的时候,或多或少知道 IoC 和 AOP 的概念,以及 SpringMVC 能快速开发一个 web 应用,这些其实就是我们所说的 Spring Framework 的基本功能。
从宏观上来说,Spring 指的是 Spring 的整个生态圈,其包含了很多的项目,每个项目都是一套解决方案(能解决特定的问题),我们可以看看 官网 (opens new window) 的图,有这么多项目:
那么 Spring 能做什么呢?同理,看官网的图:
- 首先第一个是 Microservices,也就是微服务开发,我们现在开发一个系统,功能都是很多的,未来可能会成长为一个大型系统。如果我们将所有代码写在一个项目里,此时项目就会变得很庞大; 我们可以根据功能模块,将系统拆分成一个个小的应用,每个小的应用就可以称之为一个微服务。Spring 就可以快速的帮我们创建和开发一个微服务。
- 第二个是 Reactive,响应式编程,基于我们异步非阻塞的方式,可以在应用里构建一个异步数据流,该数据流只占用少数的系统资源,但吞吐量很高。
- 第三个是 Cloud,我们的微服务可以使用分布式的方式来部署。
- 第四个就是最常用的 Web 开发
- 第五个:无服务,也就是 Faas(Function as a Service),函数式服务,不用购买服务器了,只需写一个方法,就能处理 web 请求(类似一个 Controller)
- 事件驱动
- 批处理
- ................
可以说,很多解决方案我们都能在 Spring 的生态圈中找到。
但是这也有问题:项目太多了!如果我们想要使用几个 Spring 生态圈中的项目,很容易陷入到一个叫“配置地狱”的情况,例如光整合 SpringMVC 要写一大堆配置。
# Spring5 重大升级
Spring5 做出了一个重大的升级:响应式编程。下图展示了响应式编程的技术栈,与传统的 Servlet 技术栈之间的对比:
因此本课程分为 2 季,第一季就是掌握右边的技术栈,第二套就是左边的技术栈
同时,Spring 是基于 Java8 的,也采用了 Java8 的一些新特性,如接口默认实现。
例如一个接口,可能有上百个方法;
而我们写一个类的时候,可能只想重写某一个方法,在 Java8 之前,其他方法我们都得实现(即使是空方法,也要实现)
Java8 之后,我们可以在接口里定义默认实现,一个类实现该接口的时候,只需重写需要的方法即可。
# SpringBoot 的出现
而 SpringBoot 能解决“配置地狱”发问题。我们可以认为 SpringBoot 是一个框架的框架,其底层是基于 Spring Framework;当我们想要使用某个 Spring 的项目(例如 SpringMVC),只需简单引入一个配置就行,我们只需关注业务逻辑,非常方便。
就好比一台电脑包含了很多的硬件:CPU,内存,显卡,硬盘等(就好比 Spring 生态圈的一个个项目)
如果我们自己组装电脑,是非常麻烦的(比如整合 SpringMVC,要写很多很多的配置)
我们需要的是一个装好的电脑(这就是 SpringBoot 的作用)
在 文档 (opens new window) 也有这样一段话:
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
大意:SpringBoot 可以很简单的创建一个独立的、生产级别的应用,开箱即用。
还介绍了 SpringBoot 的特点(特点):
- Create stand-alone Spring applications:创建独立 Spring 应用
- Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files):内嵌 web 服务器。就好比买了品牌机,已经装上了操作系统了,不用再安装 Tomcat
- Provide opinionated 'starter' dependencies to simplify your build configuration:自动 starter 依赖,简化构建配置,例如简化 SpringMVC 的配置,只需引入一个依赖就行,并且不会出现依赖之间的版本问题
- 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
# SpringBoot 的时代背景
介绍了 SpringBoot 是什么后,我们可以说下其背景,也就是微服务和分布式
# 微服务
James Lewis and Martin Fowler (opens new window) 在 2014 年就提出了微服务概念:Microservices Guide (opens new window)
In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.——James Lewis and Martin Fowler (2014) (opens new window)
这是一名博主的翻译:微服务 |YYGCui' s blog (opens new window),大意如下:
- 简单来说,微服务是一种架构风格。
- 一个应用拆分为一组小型服务
- 每个服务运行在自己的进程内,也就是可独立部署和升级
- 服务之间使用轻量级 HTTP 交互
- 服务围绕业务功能拆分
- 可以由全自动部署机制独立部署
- 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术
# 分布式
当我们将一个大型应用拆分成很多个小应用之后,就会涉及到分布式问题:
例如上图,每一个点就是一个小的应用,每个应用之间可能有互相调用(用一根线来连接),那么随着系统规模的增加,小应用之间的关系会变的非常非常复杂。有如下问题需要考虑:
- 远程调用:应用之间怎么通信,HTTP 还是 TCP
- 服务发现:比如 B 服务有 4 个,但是具体要调用哪个?如果其中一个有故障怎么办?
- 负载均衡
- 服务容错:例如应用之间网络异常了怎么办
- 配置管理:比如 A 服务有 5 个,我们想要修改一个配置,不可能逐个修改
- 服务监控:这么多小应用,怎么监控
- 链路追踪:比如 A 服务调 B 服务,B 服务调 C 服务.....。如果链路中某个节点出现了问题,怎么排查
- 日志管理
- 任务调度:这么多结点,定时任务是在某一个结点上运行,还是并行运行
- ......
分布式的解决方案之一:SpringBoot + SpringCloud
第一个是 SpringBoot,我们使用 SpringBoot 快速创建微服务项目
第二个是 SpringCloud,我们使用 SpringCloud 将微服务连接起来
第三个是 SpringCloud DataFlow,也就是应用之间的响应式数据流
# 云原生
我们最后还是将应用部署到服务器上的,此时就涉及到原生应用如何上云
上云的困难
- 服务自愈
- 弹性伸缩:流量高峰期,自动创建一个微服务应用。高峰期过去后,自动下线该应用
- 服务隔离:比如一台服务器上可能部署了多个微服务应用,如果某个故障了,不影响到其他应用
- 自动化部署
- 灰度发布
- 流量治理:比如性能较低的服务器只接受少量的流量
- ......
解决方案:云原生(Cloud Native)
# 如何学习 SpringBoot
学习的时候离不开文档:
我们不会讲解文档的所有内容,挑着讲
官网文档架构
还可以下载离线文档(pdf 版本):
本教程也将该文档上传至了 Gitee (opens new window) 或 GitHub (opens new window) 项目中,强烈建议下载下来,后续会经常用到。
# SpringBoot 版本
SpringBoot 是开源的,源码可以在 GitHub 上看到:spring-projects/spring-boot (opens new window)
每次版本更新的内容,也可以在 GitHub 上看到:Home · spring-projects/spring-boot Wiki (opens new window)
本次教程使用的 SpringBoot 版本和视频保持一致:2.3.4
# 总结
SpringBoot 是整合 Spring 技术栈的一站式框架
SpringBoot 是简化 Spring 技术栈的快速开发脚手架
当然,SpringBoot 也有缺点:迭代快,需要时刻关注变化;封装太深,内部原理复杂,不易精通