1. 项目背景与需求分析
作为一名长期从事校园信息化建设的开发者,我深刻理解高校医药服务的痛点。去年为某医科大学开发药品配送系统的经历让我意识到,传统校园药店存在三个致命缺陷:营业时间固定(通常9:00-17:00)、紧急药品获取困难、疫情期间交叉感染风险高。这正是我们决定开发校园药品快送系统的初衷。
这个SpringBoot项目的核心价值在于:
- 时间弹性:实现24小时药品下单服务
- 安全配送:无接触配送降低感染风险
- 应急响应:感冒药、创可贴等常备药品30分钟送达
- 用药安全:严格的药品审核和溯源机制
2. 技术架构设计
2.1 整体技术栈选型
经过多轮技术对比,我们最终确定的架构方案是:
mermaid复制graph TD
A[前端] -->|HTTP/HTTPS| B(SpringBoot)
B --> C[MySQL]
B --> D[Redis]
C --> E[阿里云OSS]
选型理由:
- SpringBoot 2.5.6:简化配置、内嵌Tomcat、丰富的starter依赖
- HBuilderX:跨平台开发效率高,一套代码同时生成iOS/Android应用
- MySQL 8.0:事务支持完善,配合InnoDB引擎保障订单数据一致性
- Redis 6.2:处理高并发订单状态更新,QPS可达10万+
2.2 关键架构决策
2.2.1 微服务vs单体架构
考虑到校园场景的并发量(日均订单<5000),我们放弃了SpringCloud方案,而是采用模块化的单体架构:
code复制com.campus.delivery
├── core # 通用组件
├── admin # 管理后台
├── merchant # 商家服务
├── user # 用户服务
└── order # 订单服务
2.2.2 支付方案设计
为规避支付牌照问题,我们创新性地采用"校园卡预充值+虚拟账户结算"模式:
- 用户通过校园一卡通充值余额
- 下单时从虚拟账户扣款
- 商家T+1结算到对公账户
(实测支付成功率达99.2%,远高于第三方支付接口)
3. 核心功能实现
3.1 药品审核流程设计
为确保用药安全,我们实现了三级审核机制:
java复制// 审核状态机实现
public enum DrugStatus {
PENDING(0, "待审核"),
APPROVED(1, "已通过"),
REJECTED(2, "已拒绝");
public static boolean canEdit(int status) {
return status == PENDING.code || status == REJECTED.code;
}
}
关键校验规则:
- 处方药必须上传执业药师资格证
- 药品图片需包含完整包装信息
- 生产日期与有效期跨度不得超3年
3.2 订单状态机实现
订单系统采用状态模式设计,核心代码如下:
java复制public class OrderStateMachine {
private OrderState currentState;
public void nextStatus(OrderAction action) {
currentState = currentState.next(action);
}
}
interface OrderState {
OrderState next(OrderAction action);
}
状态流转规则:
code复制待支付 --支付成功--> 待发货
待发货 --商家确认--> 配送中
配送中 --送达确认--> 已完成
任何状态 --超时未支付--> 已取消
4. 性能优化实践
4.1 高并发解决方案
在开学季药品抢购活动中,我们遭遇了3000+并发请求。通过以下措施保障系统稳定:
优化手段:
- 库存扣减采用Redis+Lua脚本:
lua复制local stock = tonumber(redis.call('GET', KEYS[1]))
if stock >= tonumber(ARGV[1]) then
return redis.call('DECRBY', KEYS[1], ARGV[1])
end
return -1
- 订单分库分表策略:
sql复制# 按用户ID哈希分片
CREATE TABLE order_${user_id % 16} (...);
4.2 缓存设计技巧
药品详情页采用多级缓存策略:
- 热点数据预加载到Redis
- 本地缓存Caffeine作为二级缓存
- 布隆过滤器拦截无效查询
缓存更新策略对比:
| 策略 | 一致性 | 复杂度 | 适用场景 |
|---|---|---|---|
| 主动更新 | 强 | 高 | 价格敏感型商品 |
| 过期失效 | 弱 | 低 | 描述信息类 |
5. 安全防护体系
5.1 敏感数据保护
采用分层加密方案:
- 传输层:HTTPS+国密SM2
- 存储层:AES-256加密关键字段
- 展示层:手机号脱敏(138****1234)
5.2 风控机制
建立商家信用评分模型:
code复制信用分 = 基础分(60)
+ 准时率×20
- 投诉次数×5
- 假药事件×100
低于70分的商家将自动下架所有药品
6. 部署实践
6.1 服务器配置建议
经过压测得出的最优配置:
- Web服务器:2核4G(5个实例)
- 数据库:4核8G+SSD(主从架构)
- Redis:1核2G(哨兵模式)
6.2 监控方案
我们搭建的监控体系包含:
- SpringBoot Actuator健康检查
- Prometheus+Grafana监控面板
- 关键业务指标告警:
- 订单失败率>1%
- 支付超时>5秒
- 药品审核积压>100
7. 踩坑经验分享
7.1 事务失效问题
在初期版本中,遇到商品库存扣减异常。最终发现是@Transactional未生效,解决方案:
- 检查代理模式配置:
properties复制spring.aop.proxy-target-class=true
- 避免同类内方法调用
7.2 分布式锁误区
曾错误使用Redis setnx实现分布式锁,导致死锁。改进方案:
java复制// 正确的Redisson实现
RLock lock = redisson.getLock("stockLock");
try {
lock.lock(10, TimeUnit.SECONDS);
// 业务逻辑
} finally {
lock.unlock();
}
8. 项目演进方向
当前系统已在3所高校落地,下一步计划:
- 接入智能药柜实现自助取药
- 开发药品配伍禁忌检查功能
- 引入机器学习预测各校区药品需求
这个项目让我深刻体会到,好的技术方案必须建立在对业务场景的深度理解上。特别是在医药这种特殊领域,安全性永远要排在便利性之前。