上门做饭系统架构设计:基于Spring Cloud的微服务实践与源码解析

一、系统架构总览与业务背景

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质检:基于计算机视觉的菜品质量检测

  • 物联网集成:智能厨电设备联动控制

相关推荐
2603_954708313 小时前
多微电网系统架构:集群协同与能量互济的网络设计
网络·人工智能·分布式·物联网·架构·系统架构
8Qi83 小时前
RabbitMQ高级篇:消息可靠性、幂等性与延迟消息
java·分布式·微服务·中间件·rabbitmq·springcloud
却话巴山夜雨时i6 小时前
互联网大厂Java面试:从Spring Boot到Kafka的业务场景深度剖析
spring boot·redis·spring cloud·微服务·kafka·prometheus·java面试
姚不倒6 小时前
构建高可用可观测性平台:VictoriaMetrics 集群 + VictoriaLogs 统一接入实践
运维·docker·微服务·云原生·架构
代码漫谈8 小时前
微服务 vs 单体架构:架构选型、实战拆解与决策指南
java·微服务·springboot·springcloud
黑牛儿8 小时前
K8s 1.36 新特性解读:服务网格如何解决微服务安全与通信难题?生产级对比
安全·微服务·kubernetes
weixin_397578028 小时前
基于 Docker 的 CI/CD 方案
微服务
不光头强14 小时前
spring cloud知识总结
后端·spring·spring cloud