# spring-boot-init-template
**Repository Path**: houlinhai/spring-boot-init-template
## Basic Information
- **Project Name**: spring-boot-init-template
- **Description**: SpringBoot初始化模板
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2025-05-12
- **Last Updated**: 2025-05-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
> **作者:[AntonyCheng](https://github.com/AntonyCheng)**
>
> **版本号:v2.2.1-jdk17-pre**
>
> **开源协议:[Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0.html)**
>
> **注意事项:该README跟随版本号的更新而更新,所有Git分支其实都是Pre预览分支,其中最新的内容并不能及时展现在该README中,所以想要使用稳定且具有对应说明的版本,推荐从Releases中下载。但是想要时刻跟进模板开发进度,也可以直接从各个Git分支拉取,查看每次提交的对应说明!**
# SpringBoot初始化模板
**基于 Java Web 项目的 SpringBoot 框架初始化模板**,该模板整合了常用的框架,广泛支持JDK11和JDK17,部分版本兼容JDK8,该模板适用于前后端分离项目启动开发,保证大家在此基础上能够快速开发自己的项目,同时也适合入门学习,本项目会由作者持续更新。
* [SpringBoot初始化模板](#springboot初始化模板)
* [软件版本要求](#软件版本要求)
* [模板特点](#模板特点)
* [主流框架](#主流框架)
* [业务特性](#业务特性)
* [业务功能](#业务功能)
* [示例业务](#示例业务)
* [单元测试](#单元测试)
* [快速上手](#快速上手)
* [必须执行](#必须执行)
* [可选执行](#可选执行)
* [启动前端项目](#启动前端项目)
* [整合Spring AI](#整合spring-ai)
* [整合缓存服务](#整合缓存服务)
* [整合系统缓存(Redis)](#整合系统缓存redis)
* [整合业务缓存(Redisson)](#整合业务缓存redisson)
* [整合本地缓存(Caffeine)](#整合本地缓存caffeine)
* [整合消息队列](#整合消息队列)
* [激活消息队列](#激活消息队列)
* [自定义消息队列](#自定义消息队列)
* [整合Elasticsearch](#整合elasticsearch)
* [整合MongoDB](#整合mongodb)
* [整合对象存储服务](#整合对象存储服务)
* [整合腾讯云COS](#整合腾讯云cos)
* [整合MinIO](#整合minio)
* [整合阿里云OSS](#整合阿里云oss)
* [整合验证码](#整合验证码)
* [整合邮件](#整合邮件)
* [整合离线IP库](#整合离线ip库)
* [配置国际化](#配置国际化)
* [配置SaToken](#配置satoken)
* [开启鉴权认证功能](#开启鉴权认证功能)
* [鉴权功能](#鉴权功能)
* [认证功能](#认证功能)
* [开启JWT](#开启jwt)
* [整合Redis](#整合redis)
* [整合JWT](#整合jwt)
* [确认鉴权模式](#确认鉴权模式)
* [配置定时任务](#配置定时任务)
* [SpringBoot任务调度](#springboot任务调度)
* [XxlJob任务调度](#xxljob任务调度)
* [PowerJob任务调度](#powerjob任务调度)
* [配置WebSocket](#配置websocket)
* [配置SpringBootAdmin](#配置springbootadmin)
* [配置Canal](#配置canal)
* [Canal简介](#canal简介)
* [搭建Deployer&Adapter系统](#搭建deployeradapter系统)
* [搭建Deployer&Client系统](#搭建deployerclient系统)
* [容器化部署](#容器化部署)
* [准备工作](#准备工作)
* [启动基础组件](#启动基础组件)
* [启动前后端服务](#启动前后端服务)
* [前端预览](#前端预览)
* [申明&联系我](#申明联系我)
* [项目历史](#项目历史)
* [下一步开发计划](#下一步开发计划)
## 软件版本要求
MySQL 8.0.X(推荐)
Redis 7.X.X(强制)
Elasticsearch 7.X.X(强制,特别推荐7.14.0)
RaabbitMQ 3.X.X(推荐)
说明:其他没有提及到的软件版本均广泛支持
## 模板特点
### 主流框架
- **Java 17**
- **SpringBoot 3.2.5**
- spring-boot-starter-web == 基于 Spring MVC 的 Web 应用依赖
- spring-boot-starter-undertow == 轻量级、高性能 Servlet 容器
- spring-boot-starter-aop == 提供面向切面编程功能
- spring-boot-starter-validation == 参数校验依赖
- spring-boot-starter-data-mongodb == Spring Data MongoDB 依赖
- spring-boot-starter-email == Spring Data Email 依赖
- spring-boot-starter-freemaker == 模板引擎依赖
- spring-boot-starter-test == Spring Boot Test 依赖
- spring-boot-configuration-processor == 生成配置元数据信息,辅助开发工具
- **前端模板**
- vue-admin-template 4.4.0 == 这是一个极简的 vue admin 管理后台,只包含了 Vue 2 & Element UI & axios & iconfont & permission control & lint
- **Spring AI 1.1.0**
- spring-ai-openai-spring-boot-starter == Spring AI OpenAI模型依赖
- spring-ai-zhipuai-spring-boot-starter == Spring AI 智谱AI模型依赖
- spring-ai-ollama-spring-boot-starter == Spring AI Ollama框架AI模型依赖
- **Netty**
- netty-all 4.1.114.Final == Netty 框架
- **数据驱动层**
- mysql-connector-j 8.0.33 == Java 连接 MySQL 依赖
- mybatis-spring 3.0.4 == MyBatis Spring 依赖
- mybatis-plus-boot-starter 3.5.8 == MyBatis-Plus 框架
- mybatis-plus-annotation 3.5.7 == MyBatis-Plus 注解依赖
- shardingsphere-jdbc 5.5.0 == 分布式数据库解决方案
- druid-spring-boot-3-starter 1.2.23 == Druid 连接池
- **工具类**
- lombok 1.18.34 == POJO 简化工具
- hutool-all 5.8.32 == Hutool 工具类
- commons-lang3 3.17.0 == Apache Commons Lang 工具类
- commons-io 2.17.0 == Apache Commons IO 工具类
- commons-codec 1.17.1 == Apache Commons Codec 工具类
- commons-pool2 2.12.0 == Apache Commons Pool 工具类
- commons-collections4 4.5.0-M2 == Apache Commons Collections 工具类
- commons-math3 3.6.1 == Apache Commons Math 工具类
- commons-compress 1.27.1 == Apache Commons Compress 工具类
- okhttp 4.12.0 == OK Http 工具类
- okio 3.9.0 == OK IO 工具类
- fastjson2 2.0.53 == FastJSON 工具类
- ip2region 2.7.0 == 离线 IP 地址定位库
- **权限校验**
- sa-token-spring-boot3-starter 1.39.0 == SaToken 认证鉴权框架
- sa-token-core 1.39.0 == SaToken 认证鉴权框架核心依赖
- sa-token-jwt 1.39.0 == SaToken 认证鉴权框架 JWT 依赖
- sa-token-redis-jackson 1.39.0 == SaToken 认证鉴权框架 Redis 依赖
- **缓存服务**
- spring-boot-starter-data-redis == Spring Data Redis 依赖
- spring-boot-starter-cache == Spring Cache 依赖
- redisson 3.37.0 == Redis 的基础上实现的 Java 驻内存数据网格
- **本地缓存服务**
- caffeine 3.1.8 == Caffeine 本地缓存依赖
- **消息队列**
- spring-boot-starter-amqp == 支持 AMQP (高级消息队列协议)消息代理
- spring-rabbit-test == Spring 支持对 RabbitMQ 消息队列的单元测试
- **搜索引擎**
- easy-es-boot-starter 2.0.0 == 简化 Elasticsearch 搜索引擎,可以像 Mybatis-Plus 操作 MySQL 一样操作 Elasticsearch 的开源框架
- elasticsearch 7.14.0 == Elasticsearch 依赖
- elasticsearch-rest-high-level-client 7.14.0 == ES 高级别客户端依赖
- logstash-logback-encoder 7.3 == Logstash 依赖
- **对象存储(OSS)**
- cos_api 5.6.233 == 腾讯云 COS
- aliyun-sdk-oss 3.18.1 == 阿里云 OSS
- minio 8.5.12 == Minio 对象存储
- **文件操作**
- poi 5.3.0 == 操作 Word
- poi-tl 1.12.2 == 操作 Word 模板
- easyexcel 4.0.3 == 操作 Excel
- x-easypdf 3.1.1 == 操作 PDF
- thymeleaf 3.1.2.RELEASE == 操作 PDF Thymeleaf 模板
- jte 2.3.2 == 操作 PDF JTE 数据源模板
- **接口文档 & API调试**
- knife4j-openapi3-jakarta-spring-boot-starter 4.5.0 == Knife4j 依赖
- **外接平台(建议生产环境上使用 Docker 容器化技术自行部署一套平台,不要通过模板中的模块代码直接进行编译部署,主要原因是为了适配模板,外接平台中的某些代码被作者修改过)**
- xxl-job-core 2.4.1 == 分布式定时任务管理平台
- powerjob-worker-spring-boot-starter 4.3.9 == 更强劲的分布式定时任务管理平台(个人认为,针对于中小型项目而言,PowerJob 并不适用,可以对比一下 XxlJob ,就能发现 PowerJob 很多功能用不上,当然这得让开发者自己考虑,所以模板依然保留了 XxlJob 的集成模块)
- spring-boot-admin-client 2.7.9 == SpringBoot 服务监控平台
- canal.client 1.1.7 == Canal-Deployer & Canal-Adapter 数据同步系统
### 业务特性
- 使用 Undertow 服务器替换掉 Tomcat 服务器,无阻塞更适合高并发
- Web UI 选用 vue-admin-template 前端模板,基于 Vue 2 和 Element UI ,极易上手开发调试
- SaToken 可配置分布式登录 & 认证 & 鉴权
- Spring AI 接入大语言模型(OpenAI、智谱清言以及Ollama本地大模型)
- AOP 逻辑处理示例
- Docker Compose 脚本”一键部署“
- 自定义注解处理示例
- 验证码分布式校验
- 注解式记录日志
- 注解式幂等/防重/限流
- 注解式请求参数加密解密
- 全局请求拦截器 & 过滤器
- 全局异常处理器
- 封装统一响应对象
- 自定义响应码
- 可配置式国际化
- 可配置式多类型对象存储
- 可实现多级缓存
- 毫秒级离线 IP 查询
- SpringDoc + Knife4j 接口文档
- 全局跨域处理
- Spring 上下文处理工具
- JSON 长整型精度处理
- 自动字段填充器
- 基于 Netty 的 WebSocket 全双工通信模块
- 对象存储、消息队列、缓存、分布式锁、限流、国际化、网络、Excel、Word、PDF、加密等工具类
## 业务功能
### 示例业务
- 提供模板 SQL 示例文件(业务数据库 & XxlJob 数据库 & PowerJob 数据库)
- 用户、日志、文件以及示例演示等后端接口及前端页面
- Spring Scheduler 单机版定时任务示例
- XxlJob & PowerJob 使用逻辑代码示例
- RabbitMQ 多类型消息队列逻辑代码示例
- AOP 逻辑代码示例
- 自定义注解逻辑代码示例
- 国际化逻辑代码示例
- 验证码逻辑代码示例
- 操作 Elasticsearch 代码示例
- 操作 MongoDB 代码示例
- 操作 Excel、Word 以及 PDF 文件代码示例
### 单元测试
- JUnit5 单元测试
- 示例单元测试类
## 快速上手
> 拉取项目模板之后需要确保所有依赖下载完成,以下的操作都是针对于 application-xxx.yaml 文件,即按需修改配置就能引入相关模板功能。
### 必须执行
1. 执行 `sql/init_db.sql` 、 `sql/init_xxl_job.sql` 以及 ` sql/init_power_job.sql` 文件,模板默认管理员账号:admin,默认用户账号:user,密码均为123456;
2. 修改 `src/main/resources/mysql/mysql-xxx.yaml` 文件( `xxx` 取决于 application.yaml 文件中激活的配置项):
```yaml
dataSources:
ds_master:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/init_db?serverZoneId=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
username: root
password: 123456
```
> 在这个文件中还能看到很多其他的配置,如有需要,请开发者自行学习 ShardingSphere 5.5.0 版本框架,理解相关配置;
3. 直到这一步之后,模板后端代码就已经可以直接启动了,访问 `http://localhost:38080/api/doc.html` 即可打开接口文档;
### 可选执行
> 为了方便开发者快速找到配置文件需要修改的位置,一律使用 todo 待办进行标识,请务必“**必须执行**”。
#### 启动前端项目
如果需要启动前端进行开发或者调试,开发者需要前往 `ui` 文件夹,打开 `vue-admin-template` 项目,参考其 `README.md` 文件启动即可。
#### 整合Spring AI
如今AIGC在开发过程中或多或少会被实际运用,而它们确实能够为开发者带来许多便利,提高开发效率,所以作为开发者能够基于AIGC开发应用将会是一条必经之路,赋予底层开发模板AI能力自然而然变成了顺应时代潮流的事情。而 Spring AI 可谓是后起之秀,它在 Java 领域开发 AI 应用大概率会成为主流,著名的 Spring Cloud Alibaba 宣称在2023版本支持 Spring AI 就证明了这一点,所以该模板也整合了 Spring AI。目前配置文件内容如下:
```yaml
spring:
# Spring AI相关注解(要调用OpenAI API时需要特殊网络环境,否则会超时)
ai:
# Open AI
openai:
# OpenAI 密钥
api-key: sk-xxx
chat:
options:
# 模型名称
model: gpt-3.5-turbo
# 用于决定生成文本的随机性,值越高表示生成的答案可能性越多样化。
temperature: 0.9
# 高值生成更多样化的文本,低值生成较为集中和保守的文本。
top-p: 0.3
# 智谱 AI
zhipuai:
# 智谱AI 密钥
api-key: xxx.xxx
chat:
options:
# 模型名称
model: GLM-3-Turbo
# 用于决定生成文本的随机性,值越高表示生成的答案可能性越多样化。
temperature: 0.9
# 高值生成更多样化的文本,低值生成较为集中和保守的文本。
top-p: 0.3
# Ollama AI
ollama:
# Ollama 服务地址
base-url: http://127.0.0.1:11434
chat:
options:
# 模型名称
model: llama3.1:8b-instruct-q8_0
# 用于决定生成文本的随机性,值越高表示生成的答案可能性越多样化。
temperature: 0.9
# 限制生成概率较低的文本,高值会生成更多样化的答案,低值则较为保守。
top-k: 10
# 与top-k相似,高值生成更多样化的文本,低值生成较为集中和保守的文本。
top-p: 0.3
```
目前集成最为著名的 OpenAI、国内知名的智谱清言以及 Ollama 本地大语言模型,在模板往后的发展中会集成更多类型的大语言模型。这些配置文件内容和 Spring AI 的相关用法详情请访问 [Spring AI](https://spring.io/projects/spring-ai#learn) 官网。
#### 整合缓存服务
**说明**:该模板中存在两种 Redis 服务,第一种是系统缓存服务( **对应整合系统缓存** ),第二种是业务缓存服务( **对应整合业务缓存** )。前者承担系统框架本身的缓存服务,例如用户分布式登录信息的缓存;后者承担开发者业务逻辑所需的缓存操作,例如分布式锁、限流工具等。除了 Redis 服务,还有 Caffeine 本地缓存服务,详情请查看以下内容。
##### 整合系统缓存(Redis)
系统缓存服务主要为一些依赖 spring-boot-starter-data-redis 原生操作的框架而设计,例如模板中用于校验权限的 SaToken 框架就有借用 Redis 进行分布式登录或校验的需求,系统缓存的过程对开发者能做到透明。
1. 取消排除 `RedisAutoConfiguration` 类:
```yaml
spring:
# 框架依赖自动配置选择
autoconfigure:
exclude:
# todo 是否开启Redis依赖类(如果要启动Redis,就将RedisAutoConfiguration注释掉,该配置类一旦被注释,就需要设置Redis相关配置,预先关闭)
#- org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
```
2. 修改 Redis 相关配置,切记注意单机模式和集群模式无法共存,默认开启单机模式,注释掉集群模式相关代码,同时默认没有密码,所以密码也被注释掉:
```yaml
spring:
data:
# 系统缓存Redis配置(这里的Redis配置主要用于鉴权认证等模板自带服务的系统缓存服务,要求Redis版本在7.0以上)
redis:
# 单机地址(单价模式配置和集群模式配置只能存在一个)
host: 127.0.0.1
# 单机端口,默认为6379
port: 6379
# 集群地址(单价模式配置和集群模式配置只能存在一个)
#cluster:
# nodes:
# - 127.0.0.1:6379
# - 127.0.0.1:6380
# - 127.0.0.1:6381
# - 127.0.0.1:6382
# - 127.0.0.1:6383
# - 127.0.0.1:6384
# 数据库索引
database: 0
# 密码(考虑是否需要密码)
#password: 123456
# 连接超时时间
timeout: 3s
# redis连接池
lettuce:
pool:
# 最小空闲连接数
min-idle: 8
# 最大空闲连接数
max-idle: 25
# 最大活动连接数
max-active: 50
# 最大等待时间/ms
max-wait: 3000
```
3. 此时项目就能够直接启动, Redis 相关配置就完成了,特别说明一下,为了适应模板的通用性,该模板中依旧保留了 spring-boot-starter-data-redis 中 RedisTemplate 的原生操作途径,在 `top.sharehome.springbootinittemplate.config.redis` 包中设计了 RedisTemplate 的 Bean,同时更新了其序列化方式以防止存入 Redis 之后出现乱码,这意味着开发者依旧可以使用 RedisTemplate 的方式将系统缓存和业务缓存合二为一,这种保留做法仅仅是为了可拓展性,所以没有围绕 RedisTemplate 编写缓存工具类,如果需要使用缓存工具类,详情见 **整合业务缓存** 。
##### 整合业务缓存(Redisson)
业务缓存服务主要是为了满足开发者在编码过程中的缓存需求,例如接口限流、分布式锁等。
1. 修改 Redisson 配置,此时单机版本和集群版本的启动状态可以自定义:
- 都不开启(都为 false ):模版不会将 Redisson 相关依赖纳入反转控制容器中;
- 仅开启一个(一个为 true ,一个为 false );
- 都开启(都为 true ):模版只会加载单机版本的 Redisson 配置;
```yaml
# 业务缓存Redisson配置(这里的Redisson配置主要用来系统业务逻辑的缓存服务,要求Redis版本在7.0以上)
# 如果同时开启单机版本和集群版本,只有单机版本生效
redisson:
# 线程池数量
threads: 4
# Netty线程池数量
netty-threads: 8
# Redis单机版本
single-server-config:
# todo 是否启动单机Redis(Redisson)缓存(预先关闭)
enable-single: true
# 单机地址(一定要在redis协议下)
address: redis://127.0.0.1:6379
# 数据库索引
database: 1
# 密码(考虑是否需要密码)
#password: 123456
# 命令等待超时,单位:毫秒
timeout: 3000
# 发布和订阅连接池大小
subscription-connection-pool-size: 25
# 最小空闲连接数
connection-minimum-idle-size: 8
# 连接池大小
connection-pool-size: 32
# 连接空闲超时,单位:毫秒
idle-connection-timeout: 10000
# Redis集群版本
cluster-servers-config:
# todo 是否启动集群Redis(Redisson)缓存(预先关闭)
enable-cluster: false
# Redis集群节点(一定要在Redis协议下)
node-addresses:
- redis://127.0.0.1:6379
- redis://127.0.0.1:6380
- redis://127.0.0.1:6381
- redis://127.0.0.1:6382
- redis://127.0.0.1:6383
- redis://127.0.0.1:6384
# 密码(考虑是否需要密码)
#password: 123456
# master最小空闲连接数
master-connection-minimum-idleSize: 16
# master连接池大小
master-connection-pool-size: 32
# slave最小空闲连接数
slave-connection-minimum-idle-size: 16
# slave连接池大小
slave-connection-pool-size: 32
# 连接空闲超时,单位:毫秒
idle-connection-timeout: 10000
# 命令等待超时,单位:毫秒
timeout: 3000
# 发布和订阅连接池大小
subscription-connection-pool-size: 25
```
2. 此时项目就能够直接启动, Redisson 相关配置就完成了,模板为了降低开发者的模板使用门槛,特意针对 Redisson 进行进一步封装,在 `top.sharehome.springbootinittemplate.utils.redisson` 包中设计了缓存工具类 CacheUtils 、限流工具类 RateLimitUtils 以及 LockUtils 分布式锁工具类供开发者使用,使用参考示例单元测试类。
##### 整合本地缓存(Caffeine)
本地缓存服务主要是为了满足开发者在编码过程中的多级缓存的需求,通过牺牲本地机器空间换取网络通讯时间的做法,理论上这种服务器内存缓存的效率是最高的,但是不推荐用其替代上面系统缓存或者业务缓存,此种缓存方式仅作系统性能提升的辅助方案,例如获取登录信息可以做“本地缓存 ==> 业务缓存 ==> 数据库”三级缓存方案。
1. 修改 Caffeine 配置:
```yaml
# Caffeine本地缓存配置
caffeine:
# todo 是否启动(预先关闭)
enable: true
# 最后一次写入或访问后经过固定时间过期,单位:秒
expired: 1800
# 缓存初始容量
init-capacity: 256
# 缓存最大容量,超过之后会按照最近最少策略进行缓存剔除
max-capacity: 10000
# 是否允许空值null作为缓存的value
allow-null-value: true
```
2. Caffeine 相关配置就完成了,模板为了降低开发者的模板使用门槛,特意针对 Caffeine 进行进一步封装,在 `top.sharehome.springbootinittemplate.utils.caffeine` 包中设计了本地缓存工具类 LocalCacheUtils 供开发者使用,使用参考示例单元测试类。
#### 整合消息队列
**说明**:该模板中存在一套较为全面的 RabbitMQ 消息队列解决方案,具有消费者手动 ACK 示例、死信队列、延迟队列等特性,开发者不仅可以直接使用模板中存在的默认队列,还可以根据自己的需求对原有的解决方案进行拓展以设计出满足自身项目特色的消息队列,同时该模板对拓展的消息队列具有一定规则性兼容。
##### 激活消息队列
1. 修改消息队列相关配置,同时选择配置单机 RabbitMQ 或者集群 RabbitMQ ,切记这两者无法共存,使用其中一个配置的同时需要把另一个配置给注释或者删除掉(不建议删除,说不一定万一哪天有用呢),然后根据自己搭建的 RabbitMQ 进行相关配置:
```yaml
spring:
# RabbitMQ配置
rabbitmq:
# todo 是否开启RabbitMQ(预先关闭)
enable: true
# 获取消息最大等待时间(单位:毫秒)
max-await-timeout: 3000
# 单机 RabbitMQ IP(单价模式配置和集群模式配置只能存在一个)
host: 127.0.0.1
# 单机 RabbitMQ 端口
port: 5672
# 集群RabbitMQ(单价模式配置和集群模式配置只能存在一个)
#addresses: 127.0.0.1:5672,127.0.0.1:5673,127.0.0.1:5674
# 虚拟主机
virtual-host: /
# 用户名
username: guest
# 密码
password: guest
# 消息确认(ACK)
publisher-confirm-type: correlated #确认消息已发送到交换机(Exchange)
publisher-returns: true #确认消息已发送到队列(Queue)
template:
mandatory: true
# 是否手动ACK
listener:
type: simple
direct:
acknowledge-mode: manual
simple:
acknowledge-mode: manual
```
2. 配置好之后即可启动项目,在模板中存在默认的三个消息队列配置,它们在 `top.sharehome.springbootinittemplate.config.rabbitmq.defaultMq` 包下,分别是 `DefaultRabbitMq` (默认的普通队列)、`DefaultRabbitMqWithDlx` (默认的带有死信队列的消息队列)、`DefaultRabbitMqWithDelay` (默认的延迟队列),这三个队列可以直接使用,它们在 `top.sharehome.springbootinittemplate.utils.rabbitmq.RabbitMqUtils` 工具类中由“default”开头的方法,当然开发者也可以按照一定的模板规则来自定义消息队列,这些消息队列会与 RabbitMqUtils 工具类兼容。
##### 自定义消息队列
1. 关于自定义消息队列,这里给出最简单的方式,首先开发者需要考虑自定义哪种形式的消息队列:
- 普通消息队列:即最基础的消息队列,能够支持最基本的消息投递和消息消费的能力,简单易懂;
- 带有死信队列的消息队列:与普通消息队列相比,带有死信队列的消息队列能够在消息被拒绝消费之后选择将消息列入死信队列中,而并不是直接丢弃或者再次扔进队列中等待消费,这种的应用场景多用于不可丢失消息的处理或者对拒绝消费的消息再处理;
- 延迟队列:投递消息之后并不能从队列中马上取出消息进行消费;
这些具体的消息队列特性往往需要开发者掌握一定的前置知识基础;
2. 然后粘贴 `top.sharehome.springbootinittemplate.config.rabbitmq.defaultMq.DefaultRabbitMq` 类,复制到 `top.sharehome.springbootinittemplate.config.rabbitmq.customizeMq` 包中,并且重命名(在 DefaultRabbitMq 的文档注释中有具体说明),注意不要和 DefaultRabbitMq 类重复,不然会造成 Bean 注入冲突,这里假设命名成 TestRabbitMq ;
3. 在 TestRabbitMq 中进行文本替换,将所有 “default” 替换成 “test” 即可,如果想要使用自定义的消息队列配置,直接使用 RabbitMqUtils 工具类中形参带有 “Class” 类型的方法即可(详情见 RabbitMqUtils 文档注释)。
注意:这里只给出了最简单的自定义方式,开发者在理解这种“替换”变换和阅读相关源码的基础上可以对模板进行更加自定义的改造。
#### 整合Elasticsearch
与其说是整合 Elasticsearch 搜索引擎,不如说是整合 Easy-ES 框架,正因为 Easy-ES 框架过于强大, Elasticsearch 中繁琐的操作才能得以简化,但是不要依赖这个工具而不去深入了解学习 Elasticsearch 这个伟大的搜索引擎,Easy-ES 的开发者就已经说得很明白了:这套框架的是站在 elasticsearch-rest-high-level-client 和 MyBatis-Plus 的肩膀上创作的,而前者的底层操作逻辑正是 Elasticsearch 的操作逻辑。
在使用该模板中的 Elasticsearch 相关功能之前一定要前往 Easy-ES 官网将快速入门部分通读一遍,要有一个大概的了解才能容易上手。
1. 修改 Easy-ES 相关配置,重点关注 Elasticsearch 的部署地址,由于框架自身原因, Elasticsearch 的相关依赖被固定在 **7.14.0** ,好在 Elasticsearch 在小版本之间兼容性还不错,所以理论上部署 7.x.x 的 Elasticsearch 即可满足要求,当然推荐部署 7.14.0 版本的 Elasticsearch ,然而 Elasticsearch 7.x.x 这个大版本依旧在更新维护,所以可以放心使用:
```yaml
# Easy-ES配置
easy-es:
# todo 是否启动(预先关闭)
enable: true
# es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开
address: 127.0.0.1:9200
# 如果无账号密码则可不配置此行
#username:
# 如果无账号密码则可不配置此行
#password:
# 多数据源
#dynamic:
#datasource:
#ds1:
#address: 127.0.0.1:9201
# 如果无账号密码则可不配置此行
#username:
# 如果无账号密码则可不配置此行
#password:
#...(以下配置和单数据源类似)
#ds2:
#...(以下配置和ds1相似)
# 默认为http 可缺省
schema: http
# 打印banner 若您不期望打印banner,可配置为false(预先关闭)
banner: false
# 心跳策略时间 单位:ms
keep-alive-millis: 30000
# 连接超时时间 单位:ms
connect-timeout: 5000
# 通信超时时间 单位:ms
socket-timeout: 600000
# 连接请求超时时间 单位:ms
connection-request-timeout: 5000
# 最大连接数 单位:个
max-conn-total: 100
# 最大连接路由数 单位:个
max-conn-per-route: 100
global-config:
# 索引处理模式,smoothly:平滑模式, not_smoothly:非平滑模式, manual:手动模式,,默认开启此模式
process-index-mode: manual
# 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能
print-dsl: true
# 当前项目是否分布式项目,默认为true,在非手动托管索引模式下,若为分布式项目则会获取分布式锁,非分布式项目只需synchronized锁.
distributed: false
# 重建索引超时时间 单位小时,默认72H 可根据ES中存储的数据量调整
reindexTimeOutHours: 72
# 异步处理索引是否阻塞主线程 默认阻塞 数据量过大时调整为非阻塞异步进行 项目启动更快
async-process-index-blocking: true
db-config:
# 是否开启下划线转驼峰 默认为false
map-underscore-to-camel-case: false
# 索引前缀,可用于区分环境 默认为空 用法和MP的tablePrefix一样的作用和用法
index-prefix: template_
# id生成策略
# 1、customize为自定义,_id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则_id默认策略为ES自动生成
# 2、none为默认策略,由ES自动生成id
# 3、uuid为全局唯一策略
id-type: none
# 数据刷新策略,默认为不刷新,若对数据时效性要求比较高,可以调整为immediate,但性能损耗高,也可以调整为折中的wait_until
refresh-policy: immediate
```
2. 配置完之后已经就能够使用一些方法了,但是并不是全部,想要让框架功能得以发挥就必须有操作 Mybatis-Plus 的思想,具体代码示例在最后一步,下面仅作文字说明;
3. 准备一个包来存放属于 Easy-ES 映射接口,然后在项目启动类上使用 @EsMapperScan 注解注明该包的全包名:
```java
......
@EsMapperScan("xxx.xxx.xxx.mapper")
......
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
```
4. 创建一个包来存放属于 Easy-ES 的实体类,在实体类上使用 @IndexName 注解注明该类所对应的索引名(类似于 MySQL 中的表名),强制该模型存在一个 id 字段来作为实体类的 id ,这个 id 非常重要,在 Easy-ES 框架有许多方法依赖实体类 id;
```java
......
@IndexName("i_user")
......
public class UserEs implements Serializable {
......
private Long id;
......
}
```
5. 该模板中也提供了使用的一个范例,在 `top.sharehome.springbootinittemplate.elasticsearch` 包中,同时在测试用例中也存在相关框架操作,如果还想了解更多,请在 Easy-ES 官网自行学习。
#### 整合MongoDB
MongoDB 作为最受欢迎的非关系型数据库之一,主要目的是解决“三高”需求,即高并发、高访问以及高可用。具体的一些应用场景如下:
1. 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
2. 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
3. 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
4. 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
5. 视频直播,使用 MongoDB 存储用户信息、点赞互动信息等。
该模板整合 MongoDB 的方式与整合 Redis 的方式相同,主要基于 spring-boot-starter-data-mongodb 依赖,想要接入 MongoDB 功能,只需要取消排除 `MongoAutoConfiguration` 类:
```yaml
spring:
# 框架依赖自动配置选择
autoconfigure:
exclude:
# todo 是否开启MongoDB依赖类(如果要启用MongoDB,就将MongoAutoConfiguration注释掉,该配置类一旦被注释,就需要设置MongoDB相关配置,预先关闭)
#- org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
```
此时启动模板,就能够在控制台中查看到有关于 MongoDB 的日志。
模板中定义了两个注解:`MgRepository` 和 `MgService`,这两个注解分别是 `Repository` 和 `Service` 的 MongoDB 版本,会随着是否接入 MongoDB 功能而变化,控制不必要的依赖注入。
该模板中也提供了使用的一个范例,在 `top.sharehome.springbootinittemplate.mongo` 包中,如果想了解更多,可以自行前往 MongoDB 官方网站学习或者前往模板作者的 [MongoDB 笔记仓库](https://github.com/AntonyCheng/mongodb-notes)入门。
#### 整合对象存储服务
**说明**:对象存储是一种计算机数据存储架构,旨在处理大量非结构化数据,说直白点主要就是存储文件这一类数据,其中腾讯云 COS 和 MinIO 对象存储是可以对文件进行网页预览的,而阿里云 OSS 则需要配置自定义域名(从 2024 年起腾讯云 COS 也将对新建的桶作此要求,在次之前建立的桶不受影响),所以针对于个人的中小型项目,推荐优先使用腾讯云 COS 和 MinIO 对象存储服务,以免给自己挖坑。
##### 整合腾讯云COS
该模板中整合腾讯云 COS 非常容易,仅仅需要开发者开通腾讯云 COS 服务,从中获取到一些必要的参数:
- region ==> 地域
- secretId ==> 用户公钥
- secretKey ==> 用户私钥
- bucketName ==> 桶名称
然后将这些参数写入 `application-xxx.yaml` 文件中,同时开启 enable 配置项:
```yaml
# 对象存储配置
oss:
# 腾讯云COS配置
tencent:
# todo 是否开启(预先关闭)
enable: true
# 地域
region: ap-xxxxxxxx
# 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
secret-id: xxxxxxxx
# 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
secret-key: xxxxxxxx
# 桶名称
bucket-name: xxxxxxxx
```
修改完之后即可使用模板中对象存储工具类 `top.sharehome.springbootinittemplate.utils.oss.tencent.TencentUtils` ,这个类中提供文件上传和文件删除的操作,至于文件下载,通常是上传后拿到文件地址,当需要下载时直接访问文件地址即可。
##### 整合MinIO
该模板中整合 MinIO 非常容易,仅仅需要开发者部署 MinIO 服务,从中获取到一些必要的参数:
- endpoint ==> 域名
- enableTls ==> 是否开启TLS
- secretId ==> 用户公钥
- secretKey ==> 用户私钥
- bucketName ==> 桶名称
然后将这些参数写入 `application-xxx.yaml` 文件中,同时开启 enable 配置项:
```yaml
# 对象存储配置
oss:
# MinIO OSS配置
minio:
# todo 是否开启(预先关闭)
enable: true
# 域名(格式:【ip:port】)
endpoint: 127.0.0.1:9000
# 是否开启TLS
enable-tls: false
# 用户的 SecretId
secret-id: xxxxxxxx
# 用户的 SecretKey
secret-key: xxxxxxxx
# 桶名称
bucket-name: xxxxxxxx
```
修改完之后即可使用模板中对象存储工具类 `top.sharehome.springbootinittemplate.utils.oss.minio.MinioUtils` ,这个类中提供文件上传和文件删除的操作,至于文件下载,通常是上传后拿到文件地址,当需要下载时直接访问文件地址即可。
##### 整合阿里云OSS
该模板中整合阿里云 OSS 非常容易,仅仅需要开发者开通阿里云 OSS 服务,从中获取到一些必要的参数:
- endpoint ==> 域名
- secretId ==> 用户公钥
- secretKey ==> 用户私钥
- bucketName ==> 桶名称
然后将这些参数写入 `application-xxx.yaml` 文件中,同时开启 enable 配置项:
```yaml
# 对象存储配置
oss:
# 阿里云OSS配置
ali:
# todo 是否开启(预先关闭)
enable: true
# 域名 以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint: https://oss-xx-xxx.aliyuncs.com
# 用户的 SecretId
secret-id: xxxxxxxx
# 用户的 SecretKey
secret-key: xxxxxxxx
# 桶名称
bucket-name: xxxxxxxx
```
修改完之后即可使用模板中对象存储工具类 `top.sharehome.springbootinittemplate.utils.oss.ali.AliUtils` ,这个类中提供文件上传和文件删除的操作,至于文件下载,通常是上传后拿到文件地址,当需要下载时直接访问文件地址即可。
#### 整合验证码
验证对于大多数项目而言已经成为了一种刚需,即使市面上已经出现了很多类似于 Cloudflare 的验证服务,但是中小型项目对接 Cloudflare 验证服务可谓是杀鸡用牛刀,所以这里基于 Hutool-Captcha 模块对验证码进行二次封装,相关代码在 `top.sharehome.springbootinittemplate.config.captcha` 包中;
1. 修改验证码相关配置,开发者可以自行配置验证码的风格以及参数:
```yaml
# 业务缓存Redisson配置(这里的Redisson配置主要用来系统业务逻辑的缓存服务)
# 如果同时开启单机版本和集群版本,只有单机版本生效
redisson:
# Redis单机版本
single-server-config:
# todo 是否启动单机Redis(Redisson)缓存(预先关闭)
enable-single: true
# Redis集群版本
cluster-servers-config:
# todo 是否启动集群redisson(Redisson)缓存(预先关闭)
enable-cluster: true
# 验证码配置
captcha:
# todo 是否使用验证码(启用的前提是redisson配置完成和启用离线IP库ip2region,预先关闭)
enable: true
# 验证码类型:char 字符类型;math 数字类型。
type: char
# 验证码类别:line 线段干扰;circle 圆圈干扰;shear 扭曲干扰。
category: line
# 数字验证码位数(1-9,否则默认为1)
number-length: 1
# 字符验证码长度(1-99,否则默认为4)
char-length: 4
# 验证码存活时间(单位:秒)
expired: 180
```
2. 配置完成之后只需要以 GET 请求调用 `/api/captcha` 接口即可获取验证码图片的 Base64 编码值以及该验证码的 UUID ,前端拿到 Base64 编码值之后将其转换为图片即可;
3. 该模板将 AOP 应用于验证码校验,使用自定义注解 `@EnableCaptcha` 即可做到校验,校验的前提就是被校验方法是一个 POST 请求,且在接受请求体参数实体类中需要存在一个名为 `captcha` 的 `Captcha` 类型(位置在 `top.sharehome.springbootinittemplate.config.captcha.model.Captcha` )参数字段,下面以登录接口为例:
```java
/**
* 用户登录
*
* @param authLoginDto 用户登录Dto类
* @return 返回登录用户信息
*/
@PostMapping("/login")
@EnableCaptcha
@ControllerLog(description = "用户登录", operator = Operator.OTHER)
public R