1. 技术栈选型与架构设计
当Java全家桶技术栈与多用户商城需求相遇时,我们需要构建一个兼顾性能、扩展性和开发效率的技术架构。以下是经过多个商业项目验证的成熟方案:
后端核心组件:
- Spring Boot 2.7.x(当前LTS版本)作为基础框架
- Spring Security + JWT实现认证授权
- MyBatis-Plus 3.5.x增强数据层操作
- Redis 6.x缓存热点数据
- RocketMQ 4.9.x处理异步消息
- Elasticsearch 7.x实现商品搜索
- Seata 1.6.x管理分布式事务
前端技术矩阵:
- 管理后台:Vue 3 + Element Plus + Vite
- 移动端:Uni-app跨端方案(编译到小程序/H5)
- 微信小程序原生开发(关键业务模块)
- ECharts 5.x实现数据可视化
部署架构:
mermaid复制graph TD
A[CDN] --> B[Nginx]
B --> C[前端静态资源]
B --> D[API Gateway]
D --> E[用户服务]
D --> F[商品服务]
D --> G[订单服务]
D --> H[支付服务]
E --> I[MySQL集群]
F --> J[ES集群]
G --> K[Redis集群]
实际项目中需注意:Spring Boot与Vue的版本兼容性问题。推荐使用Spring Boot 2.7.x + Vue 3.2.x的组合,避免因依赖冲突导致启动失败。
2. 核心业务模块实现
2.1 用户系统设计
多用户商城区别于单商户系统的核心在于角色权限体系:
java复制// 基于Spring Security的角色继承设计
@Configuration
@EnableWebSecurity
public class MultiRoleSecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("SUPER_ADMIN")
.antMatchers("/merchant/**").hasAnyRole("MERCHANT","SUPER_ADMIN")
.antMatchers("/user/**").authenticated()
.anyRequest().permitAll();
return http.build();
}
}
关键实现细节:
- 采用RBAC模型扩展商户维度
- JWT令牌携带商户ID信息
- 使用ThreadLocal存储当前商户上下文
- 敏感操作增加商户权限校验注解:
java复制@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize("hasRole('MERCHANT') && @merchantService.isOwned(#shopId)")
public @interface MerchantPermission {}
2.2 商品中心架构
多用户商城的商品系统需要解决的核心问题:
- 商户隔离:不同商户的商品数据物理/逻辑隔离
- 类目管理:平台类目与商户自定义类目并存
- 搜索聚合:跨商户商品联合搜索
数据库设计示例:
sql复制CREATE TABLE `goods` (
`id` bigint NOT NULL AUTO_INCREMENT,
`merchant_id` bigint NOT NULL COMMENT '所属商户',
`platform_category_id` bigint COMMENT '平台类目',
`custom_category_id` bigint COMMENT '自定义类目',
`goods_sn` varchar(64) NOT NULL COMMENT '商品编码',
`name` varchar(128) NOT NULL,
`keywords` varchar(255) COMMENT '搜索关键词',
`status` tinyint DEFAULT 1 COMMENT '1上架 0下架',
PRIMARY KEY (`id`),
UNIQUE KEY `udx_merchant_goods` (`merchant_id`,`goods_sn`),
KEY `idx_category` (`platform_category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
性能优化点:
- 使用Redis缓存商户商品列表(带版本控制)
- ES索引按商户ID分片存储
- 图片资源使用商户隔离的OSS路径
3. 订单与支付系统
3.1 分布式事务处理
多用户商城的订单创建涉及多个服务调用:
- 库存服务扣减
- 优惠券服务核销
- 积分服务变更
- 订单服务创建主单
采用Seata的AT模式实现分布式事务:
java复制@GlobalTransactional
public OrderDTO createOrder(OrderRequest request) {
// 1. 预扣库存
stockService.reduceStock(request.getItems());
// 2. 使用优惠券
couponService.useCoupon(request.getCouponId());
// 3. 创建订单
Order order = orderMapper.create(request);
// 4. 增加积分
pointsService.addPoints(order.getUserId(), order.getPoints());
return convertToDTO(order);
}
踩坑记录:
- 商户结算金额计算必须在订单服务本地完成,避免跨服务金额计算
- 支付超时订单需考虑商户自动取消时间配置
- 分账信息需要持久化到订单扩展表
3.2 支付对接方案
多用户商城需要支持:
- 平台统一收单
- 自动分账给商户
- 多种支付渠道接入
微信分账实现示例:
java复制public void handleWxPayNotify(NotifyData data) {
// 1. 验证签名并更新订单状态
orderService.updatePayStatus(data.getOrderNo());
// 2. 发起分账请求(延迟3分钟)
wxPayService.requestSplitAccount(
data.getTransactionId(),
buildSplitRules(data.getOrderNo())
);
// 3. 记录分账流水
accountFlowService.recordSplit(data);
}
特别注意:微信分账API有频率限制(5次/秒),需要实现请求队列控制
4. 性能优化实战
4.1 缓存设计策略
多级缓存方案:
- 本地缓存(Caffeine):商户基础信息、平台类目
- 分布式缓存(Redis):商品详情、库存数量
- 客户端缓存(HTTP缓存):静态资源、商品图片
缓存key设计规范:
code复制业务前缀:商户ID:资源类型:资源ID[:版本]
示例:
goods:1001:detail:2048 // 商品详情
merchant:1001:info // 商户信息
4.2 高并发场景应对
秒杀方案实现:
java复制@Transactional
public boolean seckill(Long userId, Long goodsId) {
// 1. 校验秒杀资格(Redis原子操作)
Long remain = redisTemplate.opsForValue()
.decrement("seckill:stock:" + goodsId);
if (remain < 0) {
redisTemplate.opsForValue()
.increment("seckill:stock:" + goodsId);
return false;
}
// 2. 创建秒杀订单(异步处理)
mqTemplate.send("seckill_order",
new SeckillMessage(userId, goodsId));
return true;
}
优化技巧:
- 使用Redis Lua脚本保证原子性
- 库存预热避免瞬时数据库压力
- 秒杀订单单独走特殊处理流程
- 前端增加随机延迟提交策略
5. 部署与监控
5.1 容器化部署
Docker Compose核心配置:
yaml复制version: '3'
services:
mall-gateway:
image: openjdk:17-jdk
ports:
- "8080:8080"
deploy:
resources:
limits:
cpus: '2'
memory: 2G
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
mall-order:
image: openjdk:17-jdk
environment:
- SPRING_PROFILES_ACTIVE=prod
depends_on:
mysql:
condition: service_healthy
deploy:
replicas: 3
5.2 监控指标采集
Prometheus关键指标:
- 商户API请求成功率
- 订单创建耗时百分位
- 商品查询缓存命中率
- JVM内存使用情况
- 分布式事务成功率
Grafana监控看板要点:
- 按商户维度统计API性能
- 支付成功率实时监控
- 商品搜索热词分析
- 异常交易行为预警
在项目后期,我们通过Arthas诊断发现商品分类查询存在N+1问题。通过添加二级缓存和批量查询优化,将接口响应时间从120ms降低到35ms。这提醒我们:即使使用了Spring Data JPA等ORM框架,仍然需要持续关注实际SQL执行情况
