一、系统架构总览与业务背景
1.1 上门做饭系统业务场景分析
上门做饭系统是一种创新的O2O生活服务平台,连接专业厨师与有烹饪需求的用户。系统核心业务包括:用户端App(下单、支付、评价)、厨师端App(接单、路线规划、服务管理)、后台管理系统(订单监控、厨师管理、数据分析)三大模块。
1.2 微服务架构选型依据
面对高并发订单、实时地理位置服务、多角色协同等复杂需求,传统单体架构难以应对。我们选择Spring Cloud Alibaba生态体系,原因如下:
-
服务治理:Nacos同时支持服务注册发现与配置中心
-
流量控制:Sentinel在高并发订单场景下的熔断降级
-
分布式事务:Seata保证订单-支付-库存数据一致性
-
网关路由:Spring Cloud Gateway实现动态路由与权限过滤
二、核心微服务模块拆分与设计
2.1 服务拆分策略(领域驱动设计)
// 领域服务划分示例
@Service
@Slf4j
public class OrderDomainService {
// 订单核心领域服务
}
// 微服务模块划分
- user-service: 用户管理、会员体系 (端口: 8001)
- chef-service: 厨师管理、资质审核 (端口: 8002)
- order-service: 订单生命周期管理 (端口: 8003)
- payment-service: 支付、退款、对账 (端口: 8004)
- scheduling-service: 智能调度、路径规划 (端口: 8005)
- evaluation-service: 评价、评分、投诉 (端口: 8006)
- notification-service: 消息推送、短信、站内信 (端口: 8007)
2.2 服务间通信设计
// 使用OpenFeign声明式服务调用
@FeignClient(name = "scheduling-service",
fallback = SchedulingServiceFallback.class)
public interface SchedulingServiceClient {
@PostMapping("/api/scheduling/assign")
ResponseData<ChefAssignVO> assignChef(@RequestBody OrderAssignDTO dto);
@GetMapping("/api/scheduling/chef/{chefId}/status")
ResponseData<ChefStatusVO> getChefStatus(@PathVariable Long chefId);
}
// 集成Ribbon负载均衡
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
ConnectTimeout: 2000
ReadTimeout: 5000
三、关键技术实现与源码解析
3.1 基于Nacos的服务注册与发现
// 服务注册配置
@Configuration
@EnableDiscoveryClient
public class NacosConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
// application.yml配置
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:localhost}:8848
namespace: ${NAMESPACE:dev}
group: COOKING_GROUP
config:
file-extension: yaml
refresh-enabled: true
3.2 订单状态机设计与实现
// 订单状态枚举定义
public enum OrderStatus {
PENDING_PAYMENT(1, "待支付"),
PAID(2, "已支付"),
ASSIGNING_CHEF(3, "分配厨师中"),
CHEF_ACCEPTED(4, "厨师已接单"),
CHEF_ON_THE_WAY(5, "厨师前往中"),
COOKING(6, "烹饪中"),
DELIVERING(7, "送餐中"),
COMPLETED(8, "已完成"),
CANCELLED(9, "已取消");
// 状态流转校验逻辑
public boolean canTransferTo(OrderStatus targetStatus) {
Map<OrderStatus, List<OrderStatus>> transferRules = new HashMap<>();
transferRules.put(PENDING_PAYMENT, Arrays.asList(PAID, CANCELLED));
transferRules.put(PAID, Arrays.asList(ASSIGNING_CHEF, CANCELLED));
// ... 其他状态流转规则
return transferRules.getOrDefault(this, Collections.emptyList())
.contains(targetStatus);
}
}
// 状态机服务实现
@Service
public class OrderStateMachine {
@Autowired
private OrderRepository orderRepository;
@Transactional(rollbackFor = Exception.class)
public Order transferStatus(Long orderId, OrderStatus newStatus,
String operator, String remark) {
Order order = orderRepository.findByIdWithLock(orderId);
if (!order.getStatus().canTransferTo(newStatus)) {
throw new BusinessException("状态流转不合法");
}
// 记录状态变更日志
OrderStatusLog log = new OrderStatusLog();
log.setOrderId(orderId);
log.setFromStatus(order.getStatus());
log.setToStatus(newStatus);
log.setOperator(operator);
log.setRemark(remark);
orderStatusLogRepository.save(log);
// 更新订单状态
order.setStatus(newStatus);
order.setUpdateTime(new Date());
// 发布状态变更事件
applicationContext.publishEvent(
new OrderStatusChangedEvent(this, order, newStatus));
return orderRepository.save(order);
}
}
3.3 分布式事务解决方案(Seata应用)
// 订单创建-支付分布式事务
@Service
@Slf4j
public class OrderCreateService {
@GlobalTransactional(name = "createOrderAndPay",
timeoutMills = 60000,
rollbackFor = Exception.class)
public OrderVO createOrder(OrderCreateDTO dto) {
// 1. 创建订单(本地事务)
Order order = orderService.createOrder(dto);
// 2. 扣减库存(远程调用)
inventoryServiceClient.deduct(dto.getItems());
// 3. 创建支付单(远程调用)
PaymentDTO paymentDTO = buildPaymentDTO(order);
paymentServiceClient.createPayment(paymentDTO);
// 4. 发送创建成功消息
messageService.sendOrderCreatedMessage(order);
return convertToVO(order);
}
// TCC模式补偿方法
@Transactional
public boolean compensateCreateOrder(Long orderId) {
log.info("开始补偿订单创建流程,订单ID: {}", orderId);
// 回滚订单、恢复库存、取消支付单
return orderService.cancelOrder(orderId)
&& inventoryServiceClient.restore(orderId)
&& paymentServiceClient.cancel(orderId);
}
}
四、软件设计图








五、总结与优化方向
7.1 系统性能优化
-
数据库层面:读写分离、分库分表策略(按订单日期水平分表)
-
缓存策略:多级缓存(Redis + Caffeine)、热点数据预加载
-
异步处理:非核心业务异步化(评价、消息推送)
7.2 未来扩展规划
-
智能推荐:基于用户行为的个性化厨师推荐
-
动态定价:基于供需关系的智能定价模型
-
AI质检:基于计算机视觉的菜品质量检测
-
物联网集成:智能厨电设备联动控制