部署与运行基础
1. 这是什么
部署与运行基础描述了应用从本地开发到构建、发布、启动和运行维护的整个过程。
它是工程闭环的重要组成部分。
一句话理解:
- 代码写完并不算结束
- 只有它能被稳定构建、正确启动、按预期运行,工程才算闭环
2. 为什么重要
高级开发者不能只会写代码,还要知道代码最后怎样进入生产环境。
很多问题都发生在“运行环境”而不是“业务逻辑”里,例如:
- 本地能跑,线上不能跑
- 配置错环境
- 启动参数不一致
- 容器资源限制不合理
部署与运行能力本质上是在解决:
- 如何让程序可重复交付、可稳定运行
3. 先建立直觉:构建、部署、运行是三件不同的事
这三件事很容易被混成一件:
| 阶段 | 核心问题 |
|---|---|
| 构建 | 代码如何变成可交付产物 |
| 部署 | 产物如何进入目标环境 |
| 运行 | 应用如何带着正确配置和资源约束工作 |
你只有把这三步分清楚,排查“为什么线上不对”时才不容易乱。
4. 核心内容
4.1 Maven / Gradle 构建
在 Java 项目里,最常见的构建目标是:
- 生成可运行 jar
- 生成 war
- 产出测试报告和依赖信息
学习阶段最重要的不是区分每个插件细节,而是理解:
- 构建是把源码和依赖打成可交付产物
4.2 环境配置管理
配置管理的目标不是“把配置放进文件”这么简单,而是:
- 分环境
- 可追踪
- 可切换
- 不写死在代码里
所以要尽量避免:
- 直接把生产地址、密码、开关硬编码进代码
4.3 启动参数
运行一个 Java 应用时,启动参数通常会影响:
- 内存大小
- GC 策略
- 系统属性
- 配置文件位置
- 端口和环境标识
所以启动命令本身就是运行配置的一部分。
4.4 资源限制与运行约束
应用能不能稳定运行,不只看代码,还看:
- CPU 限额
- 内存限额
- 容器限制
- 线程数
- 数据库连接数
如果这些约束没有设计好,系统很容易出现:
- 本地正常、线上雪崩
4.5 Docker 基础部署
Docker 的价值在于:
- 把运行环境和应用一起打包
- 让部署行为更一致
学习阶段先抓住主线即可:
- 用 Dockerfile 描述镜像构建
- 用容器承载应用运行
5. 学习重点
这一章最重要的是掌握:
- 部署和运行能力是工程闭环的一部分
- 配置必须分环境管理
- 启动参数本身就是运行配置
- 构建、部署、运行不能混为一谈
- 资源限制会直接影响系统稳定性
6. 常见问题
6.1 本地能跑,线上不能跑
这通常不是“玄学”,而是:
- 环境差异
- 配置差异
- 依赖差异
- 启动参数差异
6.2 配置和代码强耦合
一旦环境变化,就需要改代码重新发版,代价非常高。
6.3 启动参数和资源限制缺乏统一规范
这会让系统行为不可预测,也不利于排障。
7. 动手验证
这一节我优先用本机可直接验证的最小实验来讲“构建 -> 打包 -> 运行”。
7.1 准备一个最小应用
新建文件 RunApp.java,内容如下:
java
public class RunApp {
public static void main(String[] args) {
String profile = System.getProperty("app.profile", "default");
long maxHeapMb = Runtime.getRuntime().maxMemory() / 1024 / 1024;
System.out.println("appStarted=true");
System.out.println("profile=" + profile);
System.out.println("maxHeapMb=" + maxHeapMb);
}
}7.2 编译、打包并运行 jar
先编译:
bash
javac RunApp.java再打包成可执行 jar:
bash
jar --create --file app.jar --main-class RunApp RunApp.class然后运行:
bash
java -Dapp.profile=prod -Xms64m -Xmx64m -jar app.jar如果你在 PowerShell 中直接执行,建议把系统属性参数整体加引号,避免参数被误拆:
powershell
java "-Dapp.profile=prod" -Xms64m -Xmx64m -jar app.jar7.3 你应该观察到什么
输出应包含这些关键信息:
text
appStarted=true
profile=prod
maxHeapMb=647.4 每一行在验证什么
appStarted=true:说明应用已作为可交付产物成功运行profile=prod:说明系统属性可以作为运行配置输入maxHeapMb=64:说明启动参数会直接影响运行时资源边界
7.5 Docker 的最小示意
如果你本地有 Docker,可以继续准备一个最小 Dockerfile:
dockerfile
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY app.jar app.jar
ENTRYPOINT ["java","-jar","/app/app.jar"]当前环境里我实际确认了 docker --version 可用,所以你可以继续在本机按下面命令实验:
bash
docker build -t demo-app:1.0 .
docker run --rm demo-app:1.0是否真的执行这一步,还取决于本地是否已有基础镜像或网络能否拉镜像。
8. 练习建议
下面这些练习做完,这一章会更扎实:
- 将一个简单项目打包并运行
- 用 Docker 部署一个基础服务
- 总结一份项目启动与配置说明
- 对比“系统属性、环境变量、配置文件”三种配置输入方式
9. 自测问题
- 为什么部署和运行能力是高级开发者的基础项?
- 配置分环境管理解决了什么问题?
- 代码上线前最值得检查哪些运行项?
- 为什么说启动参数本身就是运行配置的一部分?
10. 自测核对要点
如果你的回答能覆盖下面这些点,说明这一章基本掌握到位了:
- 构建、部署、运行是三件不同但关联紧密的事
- 配置必须与代码解耦并分环境管理
- 启动参数会直接影响运行行为和资源边界
- 资源限制设计会直接影响系统稳定性
- Docker 的价值在于提升环境一致性和交付稳定性