Springboot学习笔记
1. 微服务架构
Spring 和 Springboot均属于微服务架构,这里有必要先对微服务进行说明。
1.1 传统单体架构应用体系
(一)单体架构体系介绍
在很多项目的业务初期阶段,高速迭代上线是首要考虑的事情,对后期的容量预估、可扩展性和系统健壮性、高可用一般没有那么重视。
随着业务的发展,用户量、请求量的暴增,发现原来的 单体系统 已经远远不满足需求了,特别是随着互联网整体的高速发展,对系统的要求越来越高。
但是物理服务器的CPU、内存、存储器、连接数等资源有限,单体系统能够承受的的QPS也是有限的。
某个时段大量连接同时执行操作,会导致web服务和数据库服务在处理上遇到性能瓶颈。
为了解决这个问题, 分而治之 的思想被提出。该思想对大数据库、大表进行分割,以便实施更好的控制和管理。
同时创建多个服务实例,使用多台服务机进行CPU、内存、存储的分摊,提供更好的性能。
(二)单体系统存在的问题
- 复杂性高(强耦合):由于是一个单体的系统,所以整个系统的模块是耦合在一起的,模块的边界比较模糊、依赖关系错综复杂。功能的调整,容易带来不可知的影响和潜在的bug风险。
- 服务性能问题:单体系统遇到性能瓶颈问题,只能 横向扩展 ,增加服务实例,进行负载均衡分担压力。无法纵向扩展,做模块拆分。
- 扩缩容能力受限:单体应用只能作为一个整体进行扩展,影响范围大,无法根据业务模块的需要进行单个模块的伸缩。
- 无法做故障隔离:当所有的业务功能模块都聚集在一个程序集当中,如果其中的某一个小的功能模块出现问题(如某个请求堵塞),那么都有可能会造成整个系统的崩溃。
- 发布的影响范围较大:每次发布都是整个系统进行发布,发布会导致整个系统的重启,对于大型的综合系统挑战比较大,如果将各个模块拆分,哪个部分做了修改,只发布哪个部分所在的模块即可。
(三)单体系统的优点
- 系统的简易性:系统语言风格、业务结构,接口格式均具有一致性,服务都是耦合在一起的,不存在各个业务通信问题。
- 易于测试:单体应用一旦部署,所有的服务或特性就都可以使用了,简化了测试过程,无需额外测试服务间的依赖,测试均可在部署完成后开始。
- 易于部署与升级:相对于微服务架构中的每个服务独立部署,单体系统只需将单个目录下的 服务程序统一部署和升级 。
- 较低的维护成本:只需维护单个系统即可。运维主要包括配置、部署、监控与告警和日志收集四大方面。相对于单体系统,微服务架构中的每个服务都需要独立地配置、部署、监控和日志收集,成本呈指数级增长。
1.2 微服务架构的基本信息
(一)微服务的定义:
微服务是一种架构模式,是面向服务的体系结构(SOA)软件架构模式的一种演变。
它提倡将单一应用程序划分成一组 松散耦合的细粒度小型服务 ,辅助轻量级的协议 ,互相协调、互相配合,为用户提供最终价值。
所以,微服务(或微服务架构)是一种云原生架构方法,其中 **单个应用程序 由许多 松散耦合 且可 独立部署 的 较小组件或服务组成 **。
这些服务通常包含如下特点:
-
单一职责
微服务架构中的每个节点高度服务化,都是具有业务逻辑的,符合高内聚、低耦合原则以及单一职责原则的单元,包括数据库和数据模型;
不同的服务通过“管道”的方式灵活组合,从而构建出庞大的系统。 -
轻量级通信
通过REST API模式或者RPC框架,实现服务间互相协作的轻量级通信机制。 -
独立性
在微服务架构中,每个服务都是独立的业务单元,与其他服务高度解耦,只需要改变当前服务本身,就可以完成独立的开发、测试、部署、运维。 -
进程隔离
在微服务架构中,应用程序由多个服务组成,每个服务都是高度自治的独立业务实体,可以运行在独立的进程中,不同的服务能非常容易地部署到不同的主机上,实现高度自治和高度隔离。
进程的隔离,还能保证服务达到动态扩缩容的能力,业务高峰期自动增加服务资源以提升并发能力,业务低谷期则可自动释放服务资源以节省开销。 -
混合技术栈和混合部署方式
团队可以为不同的服务组件使用不同的技术栈和不同的部署方式(公有云、私有云、混合云)。 -
简化治理
组件可以彼此独立地进行扩缩容和治理,从而减少了因必须缩放整个应用程序而产生的浪费和成本,因为单个功能可能面临过多的负载。 -
安全可靠,可维护。
从架构上对运维提供友好的支撑,在安全、可维护的基础上规范化发布流程,支持数据存储容灾、业务模块隔离、访问权限控制、编码安全检测等
(二)两种架构方式的对比:
- all in one的架构方式:即在微服务出来之前,将所有的功能单元部署在一个应用里面,然后将整个应用部署在服务器上。
如果应用负载能力不足,则将整个应用进行水平复制拓展,再均衡负载。 - 微服务架构:打破之前的all in one架构,把每个功能单元独立出来,再做功能单元的动态组合。
若应用负载能力不足,则增加对应的功能单元,其余单元数量保持不变。
(三)微服务架构的特点与优点
- 特点:最小单元是功能模块(单元),而all in one的最小单元是应用。
- 这个特点可以理解为装配式的模块化开发。
- 每个功能元素的服务都是一个 可替换/可独立升级 的软件代码。这代表可以在不关闭服务的情况下对部分功能区进行升级/修改。
- 实现了 高内聚,低耦合(即专业化程度高,且模块之间耦合小,靠接口连接)。节省了调用资源。
1.3 微服务架构演变史
1.3.1 第一阶段:简单通讯模块
- 这是最初的模样,开发人员最开始的时候想象的两个服务间简单的通信模式,抽象表示如下,两个服务之间直接进行通信:
- 该阶段的实际运用存在很多问题。
![]()
1.3.2 第二阶段:原始通信时代
- 上面的原始通讯方式非常简单,但实际情况远比想象的复杂很多。通信需要底层字节码传输和电子信号的物理层来完成。
在TCP协议出现之前,服务需要自己处理网络通信所面临的丢包、错误、乱序、重试等一系列流控问题。
因此服务实现中,除了 业务逻辑外 ,还包含对 网络传输问题的处理逻辑 。 - 服务除了 业务逻辑程序模块 之外还要一套 流控制模块 ,一共是两套模块。
![]()
1.3.3 第三阶段:TCP时代
- TCP协议的出现,避免了每个服务自己实现一套相似的网络传输处理逻辑,解决了网络传输中通用的流量控制问题。
这时候我们把处理网络传输的能力下沉,从服务的实现中抽离出来,成为操作系统网络层的一部分。 - 即将 流控制程序模块剥离,交给TCP协议处理。服务自身仅需要保留 业务程序模块。
![]()
1.3.4 第四阶段:第一代微服务 Spring
- TCP出现之后,服务间的网络通信已经不是一个难题了,所以 GFS/BigTable/MapReduce 为代表的 分布式系统 得到了蓬勃的发展。
这时,分布式系统特有的 通信语义 又出现了,如 服务注册与发现、负载均衡、熔断降级策略、认证和授权、端到端trace、日志与监控等,因此根据业务需求,完成一些通信语义的实现。 - 服务除了业务逻辑模块外,视功能新增了 多个分布式系统带来的 通信语义模块。
![]()
1.3.5 第五阶段:第二代微服务 Springboot
- 为了 避免每个服务都需要自己实现一套分布式系统通信的语义功能 ,随着技术的发展,一些 面向微服务架构 的 通用开发框架 出现了,如Spring boot、Facebook的Proxygen等。
- 这些 框架实现了分布式系统通信需要的 各种通用语义功能 :如负载均衡和服务发现等,因此一定程度上屏蔽了这些通信细节,使得开发人员使用 较少的框架代码 就能开发出 健壮的分布式系统。
- 这一带微服务框架是面向框架的框架,如同Maven集成了所有jar包一样。Spring boot也集成了框架。
- 应用服务又精简为了两个模块 即 业务模块 和 集成框架模块(Spring boot)。
![]()
2. Spring与Springboot基础
(一)Spring与Springboot:
- Springboot是Spring系列的一个框架,其在2014年被开发出来。
- Springboot是为了解决企业级应用开发的复杂性而创造的。
(二)Spring是如何简化Java开发的?
为了降低Java开发的复杂性,Spring采取了以下4种关键策略:
- 基于POJO的轻量级和最小侵入性编程;
- 通过IOC,依赖注入(DI)和面向接口实现松耦合;
- 基于 切面(AOP)和管理进行声明式编程;
- 通过 切面 和 模板(template)减少样式代码
2.1 Springboot基本介绍
百度百科基本介绍:
百度百科:
Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。
Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。
Spring框架具有控制反转(IOC)特性,IOC旨在方便项目维护和测试,它提供了一种通过Java的反射机制对Java对象进行统一的配置和管理的方法。
Spring框架利用容器管理对象的生命周期,容器可以通过扫描XML文件或类上特定Java注解来配置对象,开发者可以通过依赖查找或依赖注入来获得对象。
Spring框架具有面向切面编程(AOP)框架,SpringAOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。
Spring框架的AOP框架仅提供基本的AOP特性,虽无法与AspectJ框架相比,但通过与AspectJ的集成,也可以满足基本需求。Spring框架下的事务管理、远程访问等功能均可以通过使用SpringAOP技术实现。
Spring的事务管理框架为Java平台带来了一种抽象机制,使本地和全局事务以及嵌套事务能够与保存点一起工作,并且几乎可以在Java平台的任何环境中工作。
Spring集成多种事务模板,系统可以通过事务模板、XML或Java注解进行事务配置,并且事务框架集成了消息传递和缓存等功能。
Spring的数据访问框架解决了开发人员在应用程序中使用数据库时遇到的常见困难。
它不仅对Java:JDBC、iBATS/MyBATIs、Hibernate、Java数据对象(JDO)、ApacheOJB和ApacheCayne等所有流行的数据访问框架中提供支持,同时还可以与Spring的事务管理一起使用,为数据访问提供了灵活的抽象。
Spring框架最初是没有打算构建一个自己的WebMVC框架,其开发人员在开发过程中认为现有的StrutsWeb框架的呈现层和请求处理层之间以及请求处理层和模型之间的分离不够,于是创建了SpringMVC。
狂神的梳理总结性介绍:
狂神理解(重要且清晰):
随着Sping的不断发展,涉及的领域越来越多,项目整合开发需要配合各种各样的文件,成为了配置地狱。这显然违背了初衷。
框架的目的是用于整合各种配置,让开发能够快速,迅捷。
Spingboot基于Sping开发,其本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。
Spingboot集成了大量的常用第三方库,如:Redis、RabbiMQ、Quartz、MongoDb、Jpa等,且几乎所有的第三方库可以零配置的开箱即用!
Spingboot的核心理念是:“约定大于配置”,它默认配置了很多框架的使用方式。如同maven整合了所有jar包,Springboot整合了所有的框架。所以轻便快捷。
简而言之:Springboot是为了解决企业级应用开发的复杂性而创造的。
2.2 Springboot学习内容
Springboot学习的基础内容:

3. 第一个Spring boot程序
(备用方法,在Springboot管网上下载springboot项目包)
- spring管网 --> springboot --> initial --> 完成项目基本配置
- 添加web依赖
![]()
- 完成所有配置后,点击创建即可下载。
![]()
在IDEA中使用springboot创建项目:
-
New Project --> spring Initializr
![]()
-
因为防火墙的原因,将默认路径修改为:start.springboot.io,该路径服务器位于香港,可以稳定访问。
![]()
-
添加相关依赖:web依赖,即Sping Web依赖包、thymeleaf模板引擎依赖。。
![]()
-
删除不必要的文件,得到干净的web项目组织。
![]()
-
检查Maven仓库地址!!!,看看是自己的还是默认的!!!
![]()
-
创建各package,补全项目结构:
![]()
-
这是springboot项目创建自带的依赖架构,至此springboot项目创建成功:
![]()
-
修改项目端口号,默认端口号为8080,不能都用这个。
![]()
4. Springboot原理初探
4.1 自动配置原理
(一)自动配置依赖
为什么我们在引入一些Springboot依赖时,不需要指定版本?因为有内置版本仓库的存在。
- 在pom.xml中,我们能看到父依赖:
![]()
- 点进父项目依赖spring-boot-starter-parent,发现还有一个父项目依赖:
![]()
- 这个就是最终的父项目依赖了,这是一个dependencies版本仓库。
![]()
(二)Springboot自动配置原理
- Springboot所有自动配置都是在启动的时候扫描并加载的。
spring.factories所有的自动配置类都在这里面,但是加载不一定生效,要判断条件是否成立。- 只要导入了对应的start,就有对应的启动器;有了启动器,自动装配就会生效,然后配置成功。
- springboot在启动的时候,从类路径下/META-INF/
spring.factor获取指定的值 - 将这些自动配置的类导入容器,自动配置就会生效。
- 整合JavaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.0RELEASE.jar这个包下
- 它会将所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器中。
- 容器中存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器导入了这个场景需要的所有组件
并自动配置,@Configuration, JavaConfig!
4.2 启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 启动器:说白了就是Springboot的启动场景。
- 比如spring-boot-starter-web,它会帮我们自动导入web环境所有的相关依赖。
- spingboot会将所有的功能场景变成一个个的启动器。
- 如果我们需要使用什么功能,只要找到对应的启动器
start就可以了。
4.3 主程序
package com.zfy.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// 项目的主程序,即项目启动程序
// @SpringBootApplication,标注此类为一个springboot应用。改行必须存在,否则程序崩溃。
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
// run 将springboot应用启动
SpringApplication.run(SpringbootApplication.class, args);
}
}
从主程序注解着手了解:
主程序注解架构如下:

-
点击查看主程序注解标识:
![]()
-
进入注解类@SpringBootApplication,找到该类的核心注解。①Springboot配置,②自动导包配置:
![]()
-
进入核心注解①@SpringBootConfiguration,即Springboot配置:
![]()
-
进入最底层的注解 @Configuration,发现@Component。说明被注释物也为Spring组件。
![]()
-
进入核心注解②@EnableAutoConfiguration即自动导包配置,发现又有两个核心注解:③自动配置包,②自动(配置)导包选择器。
![]()
-
先由②进入④底层注解类@AutoConfigurationPackage,发现(自动配置)注册器:
![]()
-
点进(自动配置)注册器,即类AutoConfigurationPackages.class,可以看见导入注册了哪些包?
![]()
-
回到注解②,由②进入⑤自动导包选择器AutoConfigurationImportSelector.class,重要的核心!:
![]()
5. .yaml 配置文件
- yaml文件是配置文件的一种,另一种老前辈为.properties。
- .yaml配置文件可以更好的储存对象,且可以注入到配置类当中。
- .yaml的格式 和 与.properties 的二者对比如下:
![]()
6. thymeleaf模板引擎
参考链接:https://www.jianshu.com/p/49c927635efc
6.1 thymeleaf 基本信息介绍
定义:
Thymeleaf 是新一代 Java 模板引擎,它用于渲染 XML/XHTML/HTML5 等内容。
Thymeleaf 与 JSP,等 模板引擎 类似,也可以轻易地与 Spring MVC/Spring boot 等 Web 框架集成。
Thymeleaf 支持 HTML 原型,可以直接被浏览器打开,此时浏览器会忽略未定义的 Thymeleaf 标签属性,展示 thymeleaf 模板的静态页面效果。
而当在应用程序中 Thymeleaf 会动态地替换掉页面设置的标签属性。
Thymeleaf特点:
- 动静结合:Thymeleaf 既可以直接使用浏览器打开,查看页面的静态效果;
也可以通过 Web 应用程序进行访问,查看动态页面效果。 - 开箱即用:Thymeleaf 提供了 Spring 标准方言以及一个与 SpringMVC 完美集成的可选模块,
可以快速地实现表单绑定、属性编辑器、国际化等功能。 - 多方言支持:它提供了 Thymeleaf 标准和 Spring 标准两种方言,可以直接套用模板实现 JSTL、OGNL 表达式;
必要时,开发人员也可以扩展和创建自定义的方言。 - 与 SpringBoot 完美整合:SpringBoot 为 Thymeleaf 提供了的默认配置,并且还为 Thymeleaf 设置了视图解析器,
因此 Thymeleaf 可以与 Spring Boot 完美整合。
6.2 Thymeleaf 基础语法

如:
- 使用正则式
${variables}取到变量。
6.3 使用Tymeleaf进行Springboot项目开发
从文档看Thymeleaf的使用:
thymeleaf3.0文档地址:https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html

-
文档中查询头文件
![]()
-
在项目html文件中导入头文件约束(定义命名空间)
![]()
-
在Controller文件中定义一个键值对,其中变量名为"msg":
![]()
-
使用thymeleaf拿到html的元素,格式为:
${变量名},拿到变量"msg"
![]()
-
启动程序,在网站中看到被取出的元素
![]()
Thymeleaf 通过 在 html 标签中增加 额外属性 来达到 “模板+数据” 的展示方式
7. Springboot Web开发
Springweb开发涉及到的问题:
- 导入静态资源
- 首页
- jsp,模板引擎Thymeleaf
- 装配扩展SpringMVC
- 增删改查
- 拦截器
7.1 Springboot的配置选择
Springboot在对众多组件进行自动配置的时候,会先查询容器中是否 存在用户自己的配置 :
- 如果存在用户自己的配置则使用用户的自定义配置(比如用户自己配置@Bean等)
- 若没有,则使用自动配置(即默认值配置)
- 如果有些组件可以存在多个,如视图解析器,则将用户配置和自动装配相组合。
7.2 Static静态资源获取(关键实用)
静态网页资源获取网站:
bootstarap 模板:https://mb.bootcss.com/

8. 整合Druid使用
什么是Druid?
Druid连接池是阿里巴巴开源的数据库连接池项目。
Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为
精简描述:
- Druid是数据库连接池
- 他内置了监控功能,能从后台了解数据库/操作的情况;也能防止安全问题的发生。
8.1 使用Druid
这里介绍在Springboot项目中使用Druid数据连接池,并进行后台监控配置。
- 导入Druid依赖:
<!-- Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
-
在resources 文件下配置文件 application.yml内编写Druid相关配置。
![]()
-
在java-->config 文件内创建 DruidConfig.class文件,编写Druid的使用配置。
![]()
-
通过DruidConfig中设置的 Druid访问路径访问后台监控页面:
![]()
Z. 本章遇到的问题
1. 新建项目Maven仓库位置错误
问题解决:
-
找到在新建项目设置:
![]()
-
在新建项目设置中,修改新建项目Maven仓库相关选项:
![]()






































浙公网安备 33010602011771号