Java · 04 工程实践
项目怎么开发、测试、部署——结合 MES、CRM、AI 内容生产等真实交付。
1. 模块怎么切(我默认的骨架)
xxx-api 对外 DTO / Feign API(若需要)
xxx-app 启动模块(Boot 主类、配置)
xxx-controller 接口层(可与 app 合并)
xxx-service 用例、事务边界、领域规则
xxx-infra MyBatis、Redis、MQ、外部 HTTP
xxx-domain 实体与领域服务(中大型再拆)中小项目可以压成 单模块或多模块扁平,但逻辑上仍要有:
| 层 | 职责 | 不该做的事 |
|---|---|---|
| 接口层 | 协议、校验、鉴权入口 | 堆业务与长事务 |
| 应用/领域 | 用例、状态流转 | 直接依赖 Servlet API |
| 基础设施 | DB/缓存/三方 SDK | 反向污染领域规则 |
原则:域逻辑不散落在 Controller;外部调用有超时、重试与降级。
2. 配置与多环境
application.yml+application-{profile}.yml- 密钥、数据源密码走环境变量或配置中心,不进 Git
- 本地、测试、生产差异只留在配置,不靠改代码切环境
Boot 的价值很大一块就在这里:环境可复制,排障时可对比配置。
3. 我在项目里的实际选择
| 场景 | 选择 | 为何 |
|---|---|---|
| 业务 API | Spring Boot + MyBatis-Plus | SQL 可控,交付快 |
| 缓存 | Redis + 明确失效 | 避免脏读靠策略不是靠玄学 |
| 任务 | 本地异步 → XXL-JOB / 队列 | 按可靠性升级,不一步到位 |
| AI 编排 | Java 管状态/配额/重试;Python 管模型 | 权威状态在 Java |
| 多端 | 同一套 API 服务 Web / PDA / Electron | 设备差异放客户端 |
| 拆服务 | 默认不拆 | 减少运维与分布式复杂度 |
AI 漫剧内容生产(近期)
- 异步任务:提交 → 执行 → 重试 → 结果回写,状态机在 Java
- 多模型 API:统一任务表与错误分类,避免每个模型一套临时脚本当正式链路
- 失败可查、可重跑:比「调通一次 Demo」更接近生产
轻量 MES
- 工单、采集、追溯:强状态与追溯链,适合 Java + 关系库
- 上位机 / PDA:Node/Electron 或移动端消费同一后端
悟空类 CRM 定制
- 模块多、客户差异大:在标准产品上改;配置中心与任务调度是 存量约束
- 开发组长角色:库表设计、核心模块、联调上线,技术选型服从交付节奏
4. 测试:投多少合适
| 类型 | 我优先测什么 | 成本感 |
|---|---|---|
| 单测 | 纯逻辑、金额/状态规则、工具类 | 低,应坚持 |
| 集成测 | 登录、关键下单/工单流转、事务回滚 | 中,关键路径覆盖 |
| 契约/手工 | 对外 API 示例、错误码表 | 文档即契约 |
不追求「覆盖率数字好看」;追求 改核心规则时有人挡枪。
外部模型、真设备:mock 或实验室环境,不阻塞每次提交。
5. 构建与部署
- Maven / Gradle:多模块版本收敛;禁止各模块各引各的乱版本
- 产物:可执行 jar;健康检查(Actuator 或自建
/health) - Docker:多阶段构建,配置外置;中小项目 CI = 构建 → 测试 → 推镜像
- 日志:结构化 + 请求链路 ID,线上靠日志与指标,不靠「我感觉」
不必一上来 K8s;先把 可回滚的发布 和 配置分离 做稳。
6. 协作与代码卫生
- PR 要说清:动机、风险、如何验证
- 接口变更:同步调用方与文档;破坏性变更要版本或兼容期
- 发现「神类」「复制粘贴模块」:交付后还债,别在火烧时重构全世界
一句话
用约定换交付速度,用模块边界换可维护性。Spring 是工具箱,不是教材目录。
下一篇:05 常见问题