构建一个多商户商城系统(类似淘宝、京东等平台)需要设计复杂的后端架构和业务逻辑。以下是一个基于Java的技术方案,涵盖核心模块、技术选型和关键实现思路:
系统核心模块
多租户架构
采用 Schema隔离 或 租户ID字段 区分商户数据
推荐方案:共享数据库 + tenant_id 字段(简单高效)
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private BigDecimal price;
@Column(name = "tenant_id") // 商户标识
private String tenantId;
}
商户管理
功能:入驻申请、资质审核、合同管理、结算账户
数据库表设计:
CREATE TABLE merchant (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
status ENUM(‘PENDING’,‘APPROVED’,‘REJECTED’,‘FROZEN’) NOT NULL,
bank_account VARCHAR(50) COMMENT ‘结算账户’,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
商品与订单
关键点:购物车跨商户拆分订单
订单结构:
主订单(用户视角):包含多个子订单
子订单(商户视角):独立结算、发货
// 订单拆分伪代码
public List splitOrder(Cart cart) {
Map<String, SubOrder> subOrderMap = new HashMap<>();
for (CartItem item : cart.getItems()) {
String tenantId = item.getProduct().getTenantId();
SubOrder subOrder = subOrderMap.computeIfAbsent(tenantId,
k -> new SubOrder(k, cart.getUser()));
subOrder.addItem(item);
}
return new ArrayList<>(subOrderMap.values());
}
支付与分账
集成微信/支付宝分账API(需企业资质)
分账流程:
sequenceDiagram
用户->>+平台: 支付主订单100元
平台->>+支付渠道: 请求分账(商户A:80元, 平台:20元)
支付渠道–>>商户A: 结算80元
支付渠道–>>平台: 结算20元
生成失败,换个方式问问吧
权限控制
三层权限体系:
平台管理员:ROLE_ADMIN
商户管理员:ROLE_MERCHANT_ADMIN(仅操作自身数据)
普通用户:ROLE_USER
Spring Security 配置:
http.authorizeRequests()
.antMatchers(“/admin/“).hasRole(“ADMIN”)
.antMatchers(”/merchant/”).access(“@merchantGuard.checkTenant(authentication,#tenantId)”)
…
技术栈推荐
模块 技术选型
后端框架 Spring Boot 3.x + Spring Data JPA + Spring Security + OpenFeign
数据库 MySQL (主业务) + Redis (缓存/分布式锁) + Elasticsearch (商品搜索)
分布式 Alibaba Nacos (服务注册) + Spring Cloud Gateway (API网关)
消息队列 RabbitMQ/Kafka (订单超时、日志收集)
分库分表 ShardingSphere (当日志单量>千万时使用)
前端 Vue3 + Element Plus (管理后台) / UniApp (小程序)
部署 Docker + Kubernetes + Jenkins (CI/CD)
关键难点解决方案
多商户数据隔离
方案:ThreadLocal存储租户ID
public class TenantContext {
private static final ThreadLocal CURRENT_TENANT = new ThreadLocal<>();
public static void setTenantId(String tenantId) {
CURRENT_TENANT.set(tenantId);
}
// 在DAO层自动过滤
@Override
public Predicate toPredicate(...) {
return criteriaBuilder.equal(root.get("tenantId"), TenantContext.getTenantId());
}
}
跨商户购物车结算
流程:
用户从不同商户选择商品
结算时按商户拆单
调用支付平台的分账接口
异常处理:单个子订单支付失败时,触发部分退款
分布式事务
场景:支付成功 → 减库存 → 发消息通知
方案:Seata AT模式 或 本地事务表+MQ重试
数据库表设计简图
erDiagram
MERCHANT ||–o{ PRODUCT : has
MERCHANT {
BIGINT id PK
VARCHAR name
VARCHAR status
}
PRODUCT ||–o{ ORDER_ITEM : in
PRODUCT {
BIGINT id PK
VARCHAR name
DECIMAL price
VARCHAR tenant_id
}
ORDER_MAIN ||–o{ ORDER_SUB : contains
ORDER_SUB ||–o{ ORDER_ITEM : has
ORDER_MAIN {
BIGINT id PK
BIGINT user_id
DECIMAL total_amount
}
ORDER_SUB {
BIGINT id PK
BIGINT main_order_id
BIGINT merchant_id
DECIMAL sub_amount
}
部署架构示例
用户请求 → Nginx (负载均衡) → Spring Cloud Gateway → 微服务集群
│
├── 商户服务 (管理入驻/合同)
├── 商品服务 (ES搜索)
├── 订单服务 (分库分表)
└── 支付服务 (对接微信/支付宝)
安全注意事项
商户后台隔离:确保SQL查询始终带tenant_id条件
敏感操作审计:记录商户管理员的关键操作日志
防重放攻击:支付回调使用nonce校验
数据加密:结算账号用AES加密存储
通过此架构可实现日均百万级订单的多商户系统。对于初创项目,建议先采用单体应用+多租户模式,后期再拆分为微服务。务必使用压力测试工具(如JMeter)验证分账和拆单性能。