Spring Boot 部署与运行机制¶
本教案针对前后端分离项目,讲解 Spring Boot 项目从本地开发到服务器部署的完整流程。 内容包括运行机制、打包方式、多环境配置、外部化参数、Nginx 反向代理、日志与进程守护。
一、Spring Boot 运行原理概述¶
Spring Boot 的核心特征是可独立运行(无需外部服务器)。
其内嵌 Tomcat/Jetty,并通过 SpringApplication.run() 启动 IoC 容器与自动配置。
flowchart TD
A[main 方法执行] --> B[SpringApplication 初始化]
B --> C[加载 SpringFactories 自动配置]
C --> D[创建 IoC 容器]
D --> E[扫描 @Component 与配置类]
E --> F[创建 WebServer (Tomcat)]
F --> G[启动监听端口并接收请求]
💡 关键点:
@EnableAutoConfiguration会根据依赖自动装配组件。SpringApplication会加载application.yml并合并外部配置。
二、项目打包与运行方式¶
Spring Boot 项目可通过 Maven 一键打包为 可执行 Jar 包。
1️⃣ 打包命令¶
mvn clean package -DskipTests
生成目标:
target/demo-0.0.1-SNAPSHOT.jar
2️⃣ 运行命令¶
java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
--spring.profiles.active用于指定运行环境。
3️⃣ War 打包(补充)¶
若需部署到外部 Tomcat:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
三、多环境配置(Profiles)¶
1️⃣ 配置结构¶
Spring Boot 支持多环境配置文件自动加载:
application.yml
application-dev.yml
application-test.yml
application-prod.yml
2️⃣ 示例配置¶
# application.yml
spring:
profiles:
active: dev # 默认激活开发环境
server:
port: 8080
---
# application-dev.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/dev_db
username: root
password: 123456
---
# application-prod.yml
spring:
datasource:
url: jdbc:mysql://10.0.0.5:3306/prod_db
username: admin
password: xxxxxx
server:
port: 8081
💡 讲解要点:
application.yml可同时定义多个文档块(用---分隔)。- 也可单独创建
application-dev.yml等文件。 - 优先级:命令行参数 > 环境变量 > 外部配置文件 > 内部配置。
3️⃣ 环境切换方式¶
# 方法1:命令行参数
java -jar app.jar --spring.profiles.active=prod
# 方法2:环境变量
export SPRING_PROFILES_ACTIVE=prod
# 方法3:IDE 运行配置中设置 VM Options
-Dspring.profiles.active=test
四、外部化配置优先级¶
Spring Boot 启动时会自动加载以下配置来源(从高到低):
| 优先级 | 来源 | 说明 |
|---|---|---|
| 1 | 命令行参数 | --server.port=9000 |
| 2 | Java 系统属性 | -Dserver.port=9000 |
| 3 | 环境变量 | SERVER_PORT=9000 |
| 4 | application.yml |
默认项目配置 |
| 5 | 内部默认配置 | 来自依赖 Jar 的默认配置 |
💡 应用场景:
- 生产环境常使用外部化配置以避免修改 Jar 文件。
五、部署架构与流程¶
1️⃣ 前后端分离部署架构图¶
flowchart LR
Frontend[Vue/React 前端] -->|API 请求| Nginx
Nginx -->|反向代理| SpringBootApp[(Spring Boot 应用)]
SpringBootApp -->|数据持久化| MySQL[(数据库)]
SpringBootApp -->|缓存| Redis[(缓存服务器)]
2️⃣ Nginx 反向代理配置¶
示例: /etc/nginx/conf.d/app.conf
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://127.0.0.1:8081/; # 转发给 Spring Boot
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
root /usr/share/nginx/html; # 前端静态资源目录
index index.html;
}
}
💡 讲解:
/api/反向代理后端接口;/提供前端资源。proxy_set_header保留客户端 IP。- 前后端分离中,前端通过 Nginx 部署在
/usr/share/nginx/html。
六、Linux 部署实战¶
1️⃣ 上传与运行¶
scp target/demo.jar user@server:/opt/app/
ssh user@server
cd /opt/app
nohup java -jar demo.jar --spring.profiles.active=prod > app.log 2>&1 &
nohup让程序在后台持续运行。
2️⃣ systemd 服务守护配置¶
/etc/systemd/system/demo.service
[Unit]
Description=Spring Boot Application
After=network.target
[Service]
User=appuser
ExecStart=/usr/bin/java -jar /opt/app/demo.jar --spring.profiles.active=prod
SuccessExitStatus=143
Restart=on-failure
StandardOutput=append:/var/log/demo.log
StandardError=append:/var/log/demo.err
[Install]
WantedBy=multi-user.target
3️⃣ 常用命令¶
sudo systemctl daemon-reload
sudo systemctl enable demo
sudo systemctl start demo
sudo systemctl status demo
sudo journalctl -u demo -f
七、日志与监控¶
1️⃣ 日志配置¶
logging:
level:
root: INFO
com.example.demo: DEBUG
file:
name: /var/log/springboot/app.log
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"
💡 重点说明:
logging.file.name指定日志文件路径。logging.level控制不同包的日志级别。pattern.console定义输出格式。
2️⃣ 健康检查端点¶
Spring Boot Actuator 提供监控端点:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml 示例:
management:
endpoints:
web:
exposure:
include: health,info
访问:http://localhost:8081/actuator/health
八、课堂任务¶
1️⃣ 配置多环境(dev/test/prod)数据库。
2️⃣ 使用 Nginx 实现前后端分离部署。
3️⃣ 配置 systemd 服务守护程序。
4️⃣ 启用 Actuator 监控端点。
5️⃣ 调整日志级别并验证文件输出。