SpringBoot
SpringBoot
基础篇
一 demo
SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
创建项目的时候
start.spring.io
改为start.aliyun.com
1.1 创建
- 四种创建方式
- 基于idea创建springboot
- 基于官网创建springboot
- 基于阿里云创建springboot
- 手工创建Maven工程修改为springboot
1.2 四个要点
parent
定义一系列常用坐标版本
定义一系列常用坐标组合
直接组合使用
spring-boot-starter-parent
又继承了spring-boot-dependencies
,其中包含了很多依赖的版本,就不需要用户自定定义版本,方便管理- 如果是阿里云的话就直接使用
spring-boot-dependencies
了
starter
- springboot中常见的项目名称,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的
- 这也是spring方便的原因之一
- 实际开发的时候
- 仅书写GAV中的GA,V由SpringBoot提供
- 如果发生坐标错误,再指定version(小心版本冲突)
引导类
- 启动方式
- springboot的引导类是boot工程的执行入口,运行main方法就可以启动项目
- springboot工程运行后初始化spring容器,扫描引导类所在包加载bean
内嵌tomcat
实际上是将服务器作为了一个bean管理加入到容器中
- 内置服务器
- tomcat,默认
- jetty,更轻量级,负载性能远不及tomcat
- undertow,负载性能勉强跑赢tomcat
1.3 REST风格
- REST(Representational State Transfer),表现形式状态转换
- 优点
- 隐藏了资源访问的行为,无法通过地址得知对资源是何操作
- 书写简化
- 根据rest风格对资源进行访问称为RESTful
二 基础配置
2.1 快速复制项目
- 复制项目
- 修改pom中的
<artifactId>项目名</artifactId>
- 删除pom中的
<name>
和<description>
标签(否则idea右侧的maven中显示的是name而不是项目名) - 在idea中导入复制的项目
2.2 属性配置
属性修改
修改端口
- ```yaml
server.port=801
2
3
4
5
- 关闭运行日志图标(banner)
- ```yaml
spring.main.banner-mode=off
- ```yaml
设置日志相关
- ```yaml
logging.level.root=debug1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
- springboot内置属性查询
- https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
- 属性配置方式
- `application.properties`
- `application.yml`:主流
- `application.yaml`
- 加载顺序: `.properties` > `.yml` > `.yaml`
- `yaml`语法
- 大小写铭感
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格,不允许Tab键
- 属性值前加空格(属性名与属性值之间使用冒号+空格作为分隔)
- `#`号表示注释
- 如果出现转移字符,需要使用双引号包裹
- `yaml`数据读取
- 使用`@Value`读取单个数据,属性名引用方式:`${一级属性名.二级属性名...}`
- 数据全部封装到对象
- ![image-20231024230015217](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231024230015217.png)
- 自定义对象封装指定数据
- ![image-20231024230036635](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231024230036635.png)
### 三 整合第三方技术
#### 3.1 整合JUnit
- `@SpringBootTest`
- 类型:测试类注解
- 位置:测试类定义上方
- 作用:设置JUnit加载的SpringBoot启动类
- 属性:
- `classes`:设置springboot启动类
- 如果测试类在springboot启动类的包或子包中,可以省略启动类的设置,也就是省略classes的设定
#### 3.2 整合MyBatis
- 内容
- 核心配置:数据库连接相关信息(连什么,连谁,什么权限)
- 映射配置:SQL映射(XML/注解)
- 步骤
- 创建项目时候选择技术集(MyBatis MySQL Driver)
- 设置数据源参数(yaml)
![image-20231024231609608](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231024231609608.png)
- 定义数据层接口与映射配置
![image-20231024231639358](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231024231639358.png)
- 测试类中注入dao接口,测试功能
![image-20231024231709273](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231024231709273.png)
- 注:当springboot版本低于2.4.3,mysql驱动版本大于8.0时,需要在url连接中配置时区
![image-20231024231923170](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231024231923170.png)
或在mysql数据库端配置时区解决此问题
#### 3.3 整合MyBatis-Plus
- 与MyBatis区别
- 导入坐标不同
- 数据层实现简化
- 步骤
- 引入坐标
![image-20231024232049634](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231024232049634.png)
- 需要指定版本
- 定义数据层接口与映射配置,继承BaseMapper
![image-20231024232138954](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231024232138954.png)
- 测试(略)
#### 3.4 整合Druid
- 步骤
- 指定数据源类型
![image-20231024232354780](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231024232354780.png)
- 导入Druid对应的starter
![image-20231024232421913](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231024232421913.png)
- 变更Druid的配置方式
![image-20231024232500990](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231024232500990.png)
#### 3.5 整合任意第三方技术
- 导入对应的starter
- 配置对应的设置或采用默认配置
### 四 SSMP整合案例
#### 4.1 简介
- 方案分析
- 实体类:使用Lombok快速制作实体类
- Dao:整合MyBatisPlus,制作数据层测试类
- Service:基于MP进行增量开发,制作业务层测试类
- Controller:基于Restful开发,使用PostMan测试接口功能
- 页面:基于Vue+ElementUI制作,前后端联调,页面数据处理,页面消息处理
- 列表,增,删,改,分页,查
- 项目异常处理
- 按条件查询-----页面功能调整 Controller修正功能 Servcice修正功能
#### 4.2 创建工程
- 创建springboot工程,导入web,sql drive
- 在pom中添加mp和druid依赖
![image-20231025193114316](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231025193114316.png)
- 创建application.yml,并设置端口为80
![image-20231025193445560](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231025193445560.png)
#### 4.3 设计数据库表
- ![image-20231025194604827](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231025194604827.png)
#### 4.4 开发实体类
- lombok,导入依赖
- 给类名上方 `@Data`
- 如果需要构造方法还需要自己定义
#### 4.5 数据层开发
- MyBatisPlus
- 数据源:Druid
- pom导入对应的starter
- 配置
![image-20231025200237326](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231025200237326.png)
- 创建数据层接口继承 `BaseMapper<Book>`
- 开启MP运行日志
![image-20231025200930683](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231025200930683.png)
- 分页
- 需要定义一个拦截器配置类
![image-20231025201825122](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231025201825122.png)
- `IPage`对象封装了当前查询到的数据
- 数据
- 当前页码
- 每页数据总量
- 最大页码值
- 数据总量
- 分页操作是在MP的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MP拦截器实现
- 条件查询
- 使用`QueryWrapper`对象封装查询条件,推荐使用`LambdaQueryWrapper`对象,所有查询操作封装成方法调用
![image-20231025203223584](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231025203223584.png)
#### 4.6 业务层开发
- Service层接口定义与数据层接口定义具有较大区别,不要混用
- `selectByUserNameAndPassword(String username,String password);`数据层偏向数据
- `login(String username,String password);`业务层偏向业务名称
- 定义接口
- 实现接口
- 测试实现类方法
- 快速开发
- 继承`IService<T>`与业务层通用实现类`ServiceImpl<M,T>`
![image-20231025205328655](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231025205328655.png)
![image-20231025205314691](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231025205314691.png)
#### 4.7 表现层开发
- 基于Restful进行表现层接口开发
- 新增:POST
- 删除:DELETE
- 修改:PUT
- 查询:GET
- 接收参数
- 实体数据 `@RequestBody`
![image-20231025210832541](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231025210832541.png)
- 路径变量 `@PathVariable`
![image-20231025210846852](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231025210846852.png)
- 使用Postman测试表现层接口功能
- 表现层数据一致性处理
- 设计表现层返回结果的模型类,用于后端与前端进行数据格式统一,也称为前后端数据协议
```java
@Data
public class R{
private Boolean flag;
private Object data;
}
- ```yaml
表现层接口统一返回值类型结果
4.8 前后端协议联调
前后端分离结构设计中页面归属前端服务器
单体工程中页面放置在resources目录下的static目录中(建议执行clean)
前端发送异步请求,调用后端接口
1
2
3
4
5getAll() {
axios.get("/books").then((res)=>{
console.log(res.data);
});
},- 这里的res.data是后端发过来的所有数据,如果要得到刚刚定义的data与flag
res.data.data
res.data.flag
- 这里的res.data是后端发过来的所有数据,如果要得到刚刚定义的data与flag
4.9 异常消息处理
定义异常处理类
在前端中显示data.msg
4.10 分页
运维实用篇
一 打包与运行
1.1 基本流程
对SpringBoot项目打包(执行Maven构建指令package)
mvn package
运行项目
java –jar springboot.jar
注意:jar支持命令行启动需要依赖maven插件支持,请确认打包时是否具有SpringBoot对应的maven插件
```xml
<plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins>
</build>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 注意跳过test的过程
#### 1.2 jar包描述文件
- MANIFEST.M
- 普通工程
- ```
Manifest-Version: 1.0
Implementation-Title: springboot_08_ssmp
Implementation-Version: 0.0.1-SNAPSHOT
Build-Jdk-Spec: 1.8
Created-By: Maven Jar Plugin 3.2.0
基于spring-boot-maven-plugin打包的工程
- ```
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: springboot_08_ssmp
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.itheima.SSMPApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.5.4
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#### 1.3 命令行启动常见问题
- Windows端口被占用
- ```
# 查询端口
netstat -ano
# 查询指定端口
netstat -ano |findstr "端口号"
# 根据进程PID查询进程名称
tasklist |findstr "进程PID号"
# 根据PID杀死任务
taskkill /F /PID "进程PID号"
# 根据进程名称杀死任务
taskkill -f -t -im "进程名称
- ```
二 配置高级
2.1 临时属性设置
带属性数启动SpringBoot
```cmd
java –jar springboot.jar –-server.port=801
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- 携带多个属性启动,属性间适用空格分隔
- 属性加载优先顺序
- 看https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config
- 临时属性必须是当前boot工程支持的属性,否则设置无效
- 开发环境下的临时属性设置
- 带属性启动SpringBoot程序,为程序添加运行属性
![image-20231108215208331](https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/SpringBoot.assets/image-20231108215208331.png)
- 通过编程形式带参数启动SpringBoot程序,为程序添加运行参数
```java
public static void main(String[] args) {
String[] arg = new String[1];
arg[0] = "--server.port=8080";
SpringApplication.run(SSMPApplication.class, arg);
}1
2
3
4//不携带参数启动SpringBoot程序
public static void main(String[] args) {
SpringApplication.run(SSMPApplication.class);
}
2.2 配置文件分类
问题
SpringBoot中4级配置文件
- 1级: file :config/application.yml 最高
- 2级: file :application.yml
- 3级:classpath:config/application.yml
- 4级:classpath:application.yml
作用
1级与2级留做系统打包后设置通用属性,1级常用于运维经理进行线上整体项目部署方案调控
3级与4级用于系统开发阶段设置通用属性,3级常用于项目经理进行整体项目属性调控
2.3 自定义配置文件
通过启动参数加载指定文件路径下的配置文件
通过启动参数加载指定文件路径下的配置文件时可以加载多个配置
单服务器项目:使用自定义配置文件需求较低
多服务器项目:使用自定义配置文件需求较高,将所有配置放置在一个目录中,统一管理
基于SpringCloud技术,所有的服务器将不再设置配置文件,而是通过配置中心进行设定,动态加载配置信息
三 多环境开发
3.1 多环境开发(YAML)
生产环境、开发环境、测试环境
多配置文件
- 主配置文件中设置公共配置(全局)
- 环境分类配置文件中常用于设置冲突属性(局部)
书写技巧
根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下】
- application-devDB.yml
- application-devRedis.yml
- application-devMVC.yml
使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔
从Spring2.4版开始使用group属性替代include属性,降低了配置书写量
3.2 多环境开发(Properties)
3.3 多环境开发控制
四 日志
4.1 日志基础
作用
- 编程期调试代码
- 运营期记录信息
添加日志记录操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BookController extends BaseController {
private static final Logger log = LoggerFactory.getLogger(BookController.class);
public String getById(){
System.out.println("springboot is running...");
log.debug("debug ...");
log.info("info ...");
log.warn("warn ...");
log.error("error ...");
return "springboot is running...";
}
}日志级别
- TRACE:运行堆栈信息,使用率低
- DEBUG:程序员调试代码使用
- INFO:记录运维过程数据
- WARN:记录运维过程报警数据
- ERROR:记录错误堆栈信息
- FATAL:灾难信息,合并计入ERROR
设置日志输出级别
1
2
3
4
5
6
7# 开启debug模式,输出调试信息,常用于检查系统运行状况
debug: true
# 设置日志级别,root表示根节点,即整体应用日志级别
logging:
level:
root: debug设置日志组,控制指定包对应的日志输出级别,也可以直接控制指定包对应的日志输出级别
1
2
3
4
5
6
7
8
9
10
11logging:
# 设置日志组
group:
# 自定义组名,设置当前组中所包含的包
ebank: com.itheima.controller
level:
root: warn
# 为对应组设置日志级别
ebank: debug
# 为对包设置日志级别
com.itheima.controller: debug优化日志对象创建代码
`private static final Logger log = LoggerFactory.getLogger(BookController.class);
`
使用lombok提供的注解
@Slf4j
简化开发
4.2 日志输出格式控制
PID:进程ID,用于表明当前操作所处的进程,当多服务同时记录日志时,该值可用于协助程序员调试程序
所属类/接口名:当前显示信息为SpringBoot重写后的信息,名称过长时,简化包名书写为首字母,甚至直接删除
设置日志输出格式
- ```yml
logging:
pattern:console: "%d - %m%n"
1
2
3
4
5
6
7
- `%d`:日期 `%m`:消息 `%n`:换行
- ```yml
logging:
pattern:
console: "%d %clr(%p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"
- ```yml
4.3 日志文件
设置日志文件
1
2
3logging:
file:
name: server.log日志文件详细配置
1
2
3
4
5
6
7logging:
file:
name: server.log
logback:
rollingpolicy:
max-file-size: 3KB
file-name-pattern: server.%d{yyyy-MM-dd}.%i.log
开发实用篇
一 热部署
1.1 手动启动热部署
开发者工具
1
2
3
4
5<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>激活热部署
ctrl + F9
- 每次修改后执行一次
关于热部署
- 重启(Restart):自定义开发代码,包含类、页面、配置文件等,加载位置restart类加载器
- 重载(ReLoad):jar包,加载位置base类加载器
热部署仅仅加载当前开发者自定义开发的资源,不加载jar资源
1.2 自动启动热部署
ctrl + shift + alt
激活方式:idea失去焦点5秒后启动热部署
1.3 热部署范围配置
默认不触发重启的目录列表
/META-INF/maven
/META-INF/resources
/resources
/static
/public
/templates
自定
- ```yml
devtools:
restart:exclude: public/**,static/**
1
2
3
4
5
6
7
8
9
10
#### 1.4 关闭热部署
- 设置高优先级属性禁用热部署
- ```java
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(SSMPApplication.class);
}
- ```yml
二 配置高级
2.1 @ConfigurationProperties
使用
@ConfigurationProperties
为第三方bean绑定属性- ```java
@Bean
@ConfigurationProperties(prefix = “datasource”)
public DruidDataSource dataSource(){
}DruidDataSource ds = new DruidDataSource(); return ds;
1
2
3
4
- ```yml
datasource:
driverClassName: com.mysql.jdbc.Driver
- ```java
@EnableConfigurationProperties
注解可以将使用@ConfigurationProperties
注解对应的类加入Spring容器
2.2 宽松/松散绑定
@ConfigurationProperties
绑定属性支持属性名宽松绑定public class ServerConfig { private String ipAddress; private int port; private long timeout; }
宽松绑定不支持注解
@Value
引用单个属性的方式
2.3 常用计量单位绑定
SpringBoot支持JDK8提供的时间与空间计量单位
2.4 数据校验
开启数据校验有助于系统安全性,J2EE规范中JSR303规范定义了一组有关数据校验相关的API
开启Bean数据校验
添加JSR303规范坐标与Hibernate校验框架对应坐标
对Bean开启校验功能
设置校验规则
三 测试
3.1 加载测试专用属性
在启动测试环境时可以通过properties参数设置测试环境专用的属性
- 优势:比多环境开发中的测试环境影响范围更小,仅对当前测试类有效
在启动测试环境时可以通过args参数设置测试环境专用的传入参数
3.2 加载测试专用配置
使用
@Import
注解加载当前测试类专用的配置
3.3 Web环境模拟测试
模拟端口
- 可以选择 NONE、MOCK、DEFINED_PORT、RANDOM_PORT
虚拟请求测试
虚拟请求状态匹配
、
虚拟请求响应体匹配
虚拟请求响应体(json)匹配
虚拟请求响应头匹配
3.4 数据层测试回滚
为测试用例添加事务,SpringBoot会对测试用例对应的事务提交操作进行回滚
如果想在测试用例中提交事务,可以通过@Rollback注解设置
3.5 测试用例数据设定
- 测试用例数据通常采用随机值进行测试,使用SpringBoot提供的随机数为其赋值
四 数据层解决方案
4.1 SQL
现有数据层解决方案技术选型
Druid + MyBatis-Plus + MySQL
- 数据源:
DruidDataSource
- 持久化技术:
MyBatis-Plus / MyBatis
- 数据库:MySQL
数据源配置格式
SpringBoot提供了3种内嵌的数据源对象供开发者选择
- HikariCP(轻量级):默认内置数据源对象
- Tomcat提供DataSource:HikariCP不可用的情况下,且在web环境中,将使用tomcat服务器配置的数据源对象
- Commons DBCP:Hikari不可用,tomcat数据源也不可用,将使用dbcp数据源
内置持久化解决方案——JdbcTemplate
JdbcTemplate配置
内嵌数据库
H2
导入坐标
设置当前项目为web工程,并配置H2管理控制台参数
启动项目浏览器输入:
localhost/h2
访问操作数据库(创建表)
设置访问数据源
H2数据库控制台仅用于开发阶段,线上项目请务必关闭控制台功能
HSQL
Derby
总结
4.2 NoSQL
市面上常见的NoSQL解决方案
- Redis
- Mongo
- ES
- Solr
- 说明:上述技术通常在Linux系统中安装部署
Redis
Redis是一款key-value存储结构的内存级NoSQL数据库
- 支持多种数据存储格式、支持持久化、支持集群
导入坐标
配置
RedisTemplate以对象作为key和value,内部对数据进行序列化
StringRedisTemplate以字符串作为key和value,与Redis客户端操作等效(常用)
Mongodb
- 最像关系型数据的非关系型数据库
- ElasticSearch(ES)
- Elasticsearch是一个分布式全文搜索引擎
五 整合第三方技术
5.1 缓存
缓存是一种介于数据永久存储介质与数据应用之间的数据临时存储介质
使用缓存可以有效的减少低速数据读取过程的次数(例如磁盘IO),提高系统性能
缓存不仅可以用于提高永久性存储介质的数据读取效率,还可以提供临时的数据存储空间
缓存的使用
启用缓存
设置进入缓存的数据
设置读取缓存的数据
SpringBoot提供的缓存技术除了提供默认的缓存方案,还可以对其他缓存技术进行整合,统一接口,方便缓存技术的开发与管理
手机验证码案例(使用SB内置的缓存)
需求
开启缓存
业务层接口
业务层设置获取验证码操作,并存储缓存,手机号为key,验证码为value
业务层设置校验验证码操作,校验码通过缓存读取,返回校验结果
codeUtils
工具类
缓存供应商变更1:Ehcache
导入坐标
缓存设定为使用Ehcache(ehcache改为simple是默认)
提供ehcache配置文件ehcache.xml
缓存供应商变更2:Redis
导入坐标
配置Redis服务器,缓存设定为使用Redis
设置Reids相关配置
缓存供应商变更3:memcached
缓存供应商变更4:jetcache
- jetCache对SpringCache进行了封装,在原有功能基础上实现了多级缓存、缓存统计、自动刷新、异步调用、数据报表等功能
- jetCache设定了本地缓存与远程缓存的多级缓存解决方案
- 本地缓存
- LinkedHashMap
- Caffeine
- 远程缓存
- Redis
- Tair
- 本地缓存
- 导入坐标
- 配置远程缓存属性
- 配置本地缓存属性
缓存供应商变更4:j2cache
- j2cache是一个缓存整合框架,可以提供缓存的整合方案,使各种缓存搭配使用,自身不提供缓存功能
- 基于 ehcache + redis 进行整合
- 加入坐标
- 配置使用j2cache(application.yml)
- 配置一级缓存与二级缓存以及一级缓存数据到二级缓存的发送方式(j2cache.properties)
- 设置使用缓存
- j2cache是一个缓存整合框架,可以提供缓存的整合方案,使各种缓存搭配使用,自身不提供缓存功能
5.2 任务
定时任务是企业级应用中的常见操作
市面上流行的定时任务技术
- Quartz
- Spring Task
SpringBoot整合Quartz
相关概念
- 工作(Job):用于定义具体执行的工作
- 工作明细(JobDetail):用于描述定时工作相关的信息
- 触发器(Trigger):用于描述触发工作的规则,通常使用cron表达式定义调度规则
- 调度器(Scheduler):描述了工作明细与触发器的对应关系
导入坐标
定义具体要执行的任务,继承
QuartzJobBean
定义工作明细与触发器,并绑定对应关系
Spring Task
开启定时任务功能
设置定时执行的任务,并设定执行周期
定时任务相关配置
5.3 邮件
邮件协议
- SMTP(Simple Mail Transfer Protocol):简单邮件传输协议,用于发送电子邮件的传输协议
- POP3(Post Office Protocol - Version 3):用于接收电子邮件的标准协议
- IMAP(Internet Mail Access Protocol):互联网消息协议,是POP3的替代协议
SpringBoot整合JavaMail
导入坐标
配置JavaMail
注意:这个密码不是邮件密码,是服务器密码
开启定时功能
5.4 消息
消息发送方:生产者 消息接收方:消费者
同步消息;异步消息
企业级应用中广泛使用的三种异步消息传递技术
- JMS
- AMQP
- MQTT
JMS(Java Message Service):
- 简介:一个规范,等同于JDBC规范,提供了与消息服务相关的API接口
- JMS消息模型
- peer-2-peer:点对点模型,消息发送到一个队列中,队列保存消息。队列的消息只能被一个消费者消费,或超时
- publish-subscribe:发布订阅模型,消息可以被多个消费者消费,生产者和消费者完全独立,不需要感知对方的存在
- JMS消息种类
- TextMessage、MapMessage、BytesMessage、StreamMessage、ObjectMessage、Message
- JMS消息实现
- ActiveMQ、Redis、HornetMQ、RabbitMQ、RocketMQ(没有完全遵守JMS规范)
AMQP(advanced message queuing protocol)
- 简介:一种协议(高级消息队列协议,也是消息代理规范),规范了网络交换的数据格式,兼容JMS
AMQP消息模型
- direct exchange、fanout exchange、topic exchange、headers exchange、system exchange
AMQP消息种类:byte[]
- AMQP实现:
- RabbitMQ、StormMQ、RocketMQ
MQTT(Message Queueing Telemetry Transport)
- 消息队列遥测传输,专为小设备设计,是物联网(IOT)生态系统中主要成分之一
Kafka
- 一种高吞吐量的分布式发布订阅消息系统,提供实时消息功能。
整合ActiveMQ
下载安装
启动服务,访问服务器
SpringBoot导入ActiveMQ坐标
配置Active MQ
生产与消费消息(使用默认消息存储队列)
生产与消费消息(指定消息存储队列)
使用消息监听器对消息队列监听
流程性业务消息消费完转入下一个消息队列
整合RabbitMQ
RabbitMQ基于Erlang语言编写,需要安装Erlang
导入坐标
配置
定义消息队列(direct)
生产与消费信息(direct)
使用消息监听器对消息队列监听(direct)
使用多消息监听器对消息队列监听进行消息轮循处理(direct)
六 监控
6.1 监控的意义
意义
监控服务状态是否宕机
监控服务运行指标(内存、虚拟机、线程、请求等)
监控日志
管理服务(服务下线)
监控实施方式
6.2 可视化监控平台
Spring Boot Admin,开源社区项目,用于管理和监控SpringBoot应用程序。 客户端注册到服务端后,通过HTTP请求方式,服务端定期从客户端获取对应的信息,并通过UI界面展示对应信息。
服务端(导入坐标后)
客户端(导入坐标后),注意端口不与服务端一致
- 配置监控信息
6.3 监控原理
- Actuator提供了SpringBoot生产就绪功能,通过端点的配置与访问,获取端点信息
- 端点描述了一组监控信息,SpringBoot提供了多个内置端点,也可以根据需要自定义端点信息
- 访问当前应用所有端点信息:/actuator
- 访问端点详细信息:/actuator/端点名称