SpringBoot 懒人部署法
💚
本文档适用于基于 MySQL + Spring Boot + Vue 架构的项目,使用 Maven 作为包管理服务,主要使用 IDEA + VS Code 开发
❤️
需要安装 Java8、Maven3.X、Node10、Vue2、MySQL5.7
项目结构
以下是一个典型的 SpringBoot 项目结构
主要是 main 文件夹下的 java 和 resources 文件夹
java 文件夹下是所有的 java 代码
resources 文件夹下的 application.yml
编译完成后的代码在文件夹 target下
├── README.md
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── imzhizi
│ │ │ └── tdd
│ │ │ ├── TddApplication.java
│ │ │ ├── annotation
│ │ │ │ └── CurrentUser.java
│ │ │ ├── config
│ │ │ │ ├── GlobalExceptionHandler.java
│ │ │ │ ├── RedisPoolConfig.java
│ │ │ │ └── WebConfig.java
│ │ │ ├── domain
│ │ │ │ ├── BusinessException.java
│ │ │ │ ├── CodeMsg.java
│ │ │ │ ├── Result.java
│ │ │ │ ├── dto
│ │ │ │ │ ├── LoginDto.java
│ │ │ │ │ └── RegisterDto.java
│ │ │ │ ├── model
│ │ │ │ │ ├── Role.java
│ │ │ │ │ └── User.java
│ │ │ │ └── vo
│ │ │ │ └── UserVo.java
│ │ │ ├── helper
│ │ │ │ └── MD5Helper.java
│ │ │ ├── repository
│ │ │ │ ├── RedisRepo.java
│ │ │ │ ├── UserRepo.java
│ │ │ │ └── redis
│ │ │ │ ├── KeyUser.java
│ │ │ │ ├── OrderKey.java
│ │ │ │ ├── RedisKey.java
│ │ │ │ └── UserKey.java
│ │ │ ├── security
│ │ │ │ ├── AuthenticationInterceptor.java
│ │ │ │ └── CurrentUserArgumentResolver.java
│ │ │ ├── service
│ │ │ │ └── UserService.java
│ │ │ └── web
│ │ │ ├── DoctorController.java
│ │ │ └── UserController.java
│ │ └── resources
│ │ ├── application.yml
│ │ └── log4j2.xml
│ └── test
├── target
│ └── tdd.jar
└── tdd.iml
配置文件
对于一个项目来说,为了能够同时在本地开发、同时在服务器上部署,这是它们的配置文件是不同的,因此需要保持多种配置的共存,方便在不同环境下切换。
以下展示的是一个常见的 application.yml 中的内容,会使用 spring: profiles: 定义不同的配置,一下就定义了 prod 和 test 两个 profiles,同时使用 spring: profiles: active: 来定义当前激活哪一个 profiles。
spring:
profiles:
active: test
---
spring:
profiles: shiyu
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/tdd?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
username: root
password: 123456
thymeleaf:
cache: false
server:
port: 8080
---
spring:
profiles: prod
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:33061/tdd?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
username: root
password: 123456
thymeleaf:
cache: false
server:
port: 8080
logging:
level:
com.imzhizi.tdd: debug
mybatis:
type-aliases-package: com.imzhizi.tdd.domain.model
configuration:
map-underscore-to-camel-case: true
default-fetch-size: 100
default-statement-timeout: 30
项目启动
IDEA 启动
可以直接运行 Application.java 文件中的main函数,此时所使用的 profiles 由 application.yml 所定义。
Maven 启动
在一些情况下,不方便使用 IDEA 启动项目,可以直接在命令行。
mvn spring-boot:run -Dspring.profiles.active=test
项目编译
前端部分
💚
本部分讲述是一种将Vue前端托管在后端的方法,thymeleaf 项目可以直接略过该部分
首先需要将前端项目构建为dist项目,构建命令的执行方式取决于项目中 config/index.js 文件中的配置,建议作出以下修改。
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'assets',
还需要将 config/env.prod.js 中的API地址配置为实际的服务器地址,例如 '"http://112.112.10.xxx"',记得需要单引号扩住双引号。
执行以下命令即可完成项目编译,默认情况下文件build后会在dist文件夹下,如上述配置所示,也可以按需要修改。
npm run build
完成以上两个步骤之后,会得到一个如图的文件夹
然后需要将该部分复制到后端的 resources 文件夹的 static 文件夹中
后端部分
Java项目的 application.yml 配置
Java 项目使用 Maven 编译打包,具体命令如下:
# 直接编译
mvn install
mvn package
# 如果存在单元测试,希望在编译阶段跳过测试
mvn package -Dmaven.test.skip=true
经过这部分的操作,会得到一个 xxx.jar 的包,一般位于 target 文件夹中,如果未自行定义,则应该是类似于 xxx-1.0-SNAPSHOT.jar 的命名,通过在 pom.xml 文件中的 build 添加一下配置可以修改每次编译得到的文件名。
<build>
<finalName>team</finalName>
……
</build>
项目部署
💚
在部署之前,需要实现准备好 MySQL,创建数据库表并导入数据,建议使用 utf8mb4 编码
从上一阶段编译得到的 jar 包可以在服务器上部署,一般通过 scp 或自行通过其他方式上传到服务器上
# 从本地将文件上传至服务器
scp target/team.jar gaomi@172.18.1.xxx:~
# 通过 java -jar 即可执行,但此时是前台运行
java -jar xxxx.jar --spring.profiles.active=prod
# 因此需要使用 nohup 保持服务后台运行
### 这是真正要用的命令
nohup java -jar xxxx.jar --spring.profiles.active=prod &
### 这是真正要用的命令
# 查看项目的运行情况
tail -f nohup.out
附录
使用PM2管理项目
PM2是一个更加现代的服务监控工具,使用 pm2 可以替代 nohup,具体用法可以参考我的博客 https://www.cnblogs.com/imzhizi/p/montior-jar-using-pm2.html
如果服务涉及到小程序或HTTPS
由于小程序要求必须使用域名和HTTPS,因此后端也要做相应的配置,其中包括项目自身和 nginx,可以查看该文章 https://www.cnblogs.com/imzhizi/p/https-server-using-nginx.html
在 Docker 中使用MySQL
如果想要使用 Docker 对MySQL 服务进行区隔,或者直接在服务器上安装MySQL遇到困难,可以参考 https://www.cnblogs.com/imzhizi/p/linux--mysqldocker-install.html