在开发二手交易平台时,技术选型需要综合考虑开发效率、性能需求、团队技术栈和长期维护成本。我们最终选择了SpringBoot+MyBatis+Vue3的全栈方案,这个组合在电商类项目中具有明显优势:
提示:技术选型时要特别注意各组件版本的兼容性,例如SpringBoot 2.7.x默认集成的是MyBatis 3.5.x,如果混用不同大版本可能导致难以排查的问题。
采用经典的三层架构,但针对电商特点做了优化:
code复制表现层(Web)
├── 用户端:Vue3 SPA
└── 管理端:Vue3 + Element Plus
业务层(Service)
├── 商品服务
├── 订单服务
├── 支付服务(对接第三方)
└── 消息服务
数据访问层(DAO)
├── MyBatis映射
├── Redis缓存
└── MySQL持久化
这种架构的扩展性体现在:
采用RBAC模型设计权限系统,关键表结构:
sql复制CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '登录账号',
`password` varchar(100) NOT NULL COMMENT 'BCrypt加密',
`phone` varchar(20) NOT NULL COMMENT '手机号',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像URL',
`credit_score` int DEFAULT 100 COMMENT '信用分',
`status` tinyint DEFAULT 1 COMMENT '状态(0禁用1正常)',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `role` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT '角色名',
`code` varchar(20) NOT NULL COMMENT '角色编码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
安全实现要点:
商品模块的核心难点在于状态管理和搜索优化:
商品状态机设计:
java复制public enum ItemStatus {
DRAFT(0, "草稿"),
AUDITING(1, "审核中"),
ONLINE(2, "已上架"),
OFFLINE(3, "已下架"),
SOLD(4, "已售出"),
DELETED(5, "已删除");
// 状态转换校验逻辑
public static boolean allowTransition(ItemStatus from, ItemStatus to) {
// 具体转换规则...
}
}
搜索优化方案:
订单状态流转是交易系统的核心,我们采用状态模式实现:
java复制public class Order {
private OrderState state;
public void pay() {
state.handlePayment(this);
}
public void cancel() {
state.handleCancel(this);
}
// 其他操作...
}
interface OrderState {
void handlePayment(Order order);
void handleCancel(Order order);
// 其他处理方法...
}
关键状态包括:
支付模块需要特别注意安全性和幂等性处理:
支付流程:
mermaid复制graph TD
A[创建支付订单] --> B[跳转支付网关]
B --> C{支付成功?}
C -->|是| D[异步通知]
C -->|否| E[返回失败]
D --> F[验签]
F --> G[处理业务]
防重复支付措施:
对账机制:
采用多级缓存架构提升响应速度:
本地缓存:Caffeine(高频访问数据)
java复制@Bean
public CacheManager cacheManager() {
CaffeineCacheManager manager = new CaffeineCacheManager();
manager.setCaffeine(Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(1000));
return manager;
}
分布式缓存:Redis集群
缓存一致性:
针对MySQL的优化措施:
索引优化:
分表策略:
SQL优化:
sql复制-- 反例:全表扫描
SELECT * FROM items WHERE status = 2 ORDER BY create_time DESC;
-- 正例:使用索引
SELECT id,title,price FROM items
WHERE status = 2 AND create_time > '2023-01-01'
ORDER BY create_time DESC LIMIT 20;
采用容器化部署方案:
dockerfile复制# SpringBoot应用Dockerfile示例
FROM openjdk:11-jre
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
部署架构:
完善的监控是系统稳定的保障:
指标监控:
日志收集:
链路追踪:
告警规则:
秒杀方案设计:
核心代码片段:
java复制public boolean seckill(Long itemId, Long userId) {
String key = "seckill:stock:" + itemId;
Long remain = redisTemplate.opsForValue().decrement(key);
if (remain < 0) {
// 库存不足,回滚
redisTemplate.opsForValue().increment(key);
return false;
}
// 发送MQ消息异步创建订单
mqTemplate.send("seckill_order", new SeckillMessage(itemId, userId));
return true;
}
采用最终一致性方案解决分布式事务:
本地消息表:
RocketMQ事务消息:
java复制// 发送半消息
TransactionSendResult sendResult = producer.sendMessageInTransaction(msg, arg);
// 实现LocalTransactionExecute
@Override
public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
try {
// 执行业务逻辑
return LocalTransactionState.COMMIT_MESSAGE;
} catch(Exception e) {
return LocalTransactionState.ROLLBACK_MESSAGE;
}
}
Saga模式:
在实际开发中,我们发现分阶段提交(TCC)模式虽然理论完美,但开发成本过高,最终选择了消息队列+本地事件表的折中方案,在保证基本一致性的同时兼顾了开发效率。