1. 项目背景与核心需求
校园打印服务一直是学生群体中的高频需求,但传统打印店普遍存在排队时间长、文件传输不便、进度不透明等问题。这个基于微服务架构的打印预约系统,正是为了解决这些痛点而生。
我在实际开发中发现,校园打印场景有几个特殊需求:1)高峰期并发量大(如课程作业提交前);2)需要支持多种文件格式预览;3)师生对打印进度有实时追踪需求;4)支付环节需要对接校园卡系统。这些需求决定了传统单体架构难以支撑,采用SpringCloud微服务架构成为必然选择。
2. 系统架构设计
2.1 技术栈选型
前端部分:
- Vue3 + Element Plus:选用组合式API提升代码复用性
- ECharts:用于展示打印店负载情况的可视化数据
- WebSocket:实现打印进度实时推送
后端部分:
- SpringBoot 2.7:基础框架
- SpringCloud Alibaba 2021.0.4:包含Nacos、Sentinel等组件
- Seata:处理分布式事务(如支付与订单状态同步)
- MinIO:对象存储服务,解决文件上传需求
特别注意:校园网环境要求安装包体积要小,因此前端采用Vite打包,最终产物比传统webpack小40%
2.2 微服务拆分方案
| 服务名称 | 端口 | 主要职责 | 关键技术点 |
|---|---|---|---|
| user-service | 8001 | 用户认证、权限管理 | JWT+Spring Security |
| file-service | 8002 | 文件上传/预览/转换 | Apache POI+PDFBox |
| order-service | 8003 | 订单创建/状态管理 | Redis分布式锁 |
| payment-service | 8004 | 校园卡支付对接 | 校园一卡通API封装 |
| notify-service | 8005 | 消息推送/邮件通知 | WebSocket+MailSender |
3. 核心功能实现细节
3.1 文件预处理流程
- 前端通过加密通道上传文件(采用AES-256加密)
- 文件服务进行病毒扫描(集成ClamAV)
- 格式转换处理:
- Office文档转PDF(使用LibreOffice无头模式)
- 图片文件压缩(Tinify API)
- 生成缩略图预览(Thumbnailator)
java复制// 文件转换示例代码
public File convertToPdf(MultipartFile file) {
String tempPath = "/tmp/" + UUID.randomUUID();
Files.write(Paths.get(tempPath), file.getBytes());
Process process = Runtime.getRuntime().exec(
"soffice --headless --convert-to pdf " + tempPath
);
process.waitFor();
return new File(tempPath.replaceFirst("\\..*$", ".pdf"));
}
3.2 高并发预约处理
采用多级缓存策略:
- 本地缓存(Caffeine):存储打印店实时状态
- Redis集群:存储热门时间段预约余量
- 数据库分库分表:按学期分片订单数据
sql复制-- 分表策略示例
CREATE TABLE orders_2023_spring (
id BIGINT PRIMARY KEY,
user_id VARCHAR(20),
shop_id INT,
time_slot DATETIME
) ENGINE=InnoDB PARTITION BY HASH(MOD(shop_id,10));
4. 典型问题与解决方案
4.1 文件转换超时问题
现象:
复杂PPT文件转换时超过30秒限制
解决方案:
- 前端大文件分片上传
- 服务端增加异步转换接口
- 引入消息队列削峰
4.2 支付状态同步延迟
现象:
校园卡扣款成功但订单状态未更新
解决方案:
- 引入Seata分布式事务
- 增加对账补偿任务
- 设计状态机保证最终一致性
mermaid复制stateDiagram
[*] --> PENDING
PENDING --> PAID: 支付成功
PENDING --> FAILED: 支付失败
FAILED --> PENDING: 重试支付
PAID --> PRINTING: 开始打印
PRINTING --> COMPLETED: 打印完成
PRINTING --> FAILED: 打印异常
5. 部署与性能优化
5.1 容器化部署方案
使用Docker Compose编排服务:
yaml复制version: '3'
services:
nacos:
image: nacos/nacos-server:2.0.3
ports:
- "8848:8848"
redis:
image: redis:6.2-alpine
ports:
- "6379:6379"
5.2 关键性能指标
经过压力测试(JMeter):
- 单节点可支撑800+ TPS
- 99%的请求响应时间<500ms
- 文件上传平均耗时2.3s(校园网环境)
6. 安全防护措施
- 接口防刷:
- 滑动窗口限流(Sentinel)
- 验证码二次确认
- 文件安全:
- 沙箱环境处理可疑文件
- 自动清除24小时未取件文件
- 支付安全:
- 校园卡支付二次密码确认
- 单日消费限额控制
实际运行中,这套系统在某高校日均处理2300+打印订单,高峰期能支撑15个打印店同时在线服务。最大的收获是:微服务拆分要适度,初期我们按功能拆分了8个服务,后来发现file-service和order-service调用太频繁,最终合并为print-core服务,性能提升了35%。