上门做饭系统架构设计:基于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质检:基于计算机视觉的菜品质量检测

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

相关推荐
_codemonster3 小时前
30分钟快速搭建 Spring Cloud Alibaba 微服务实战(一)
微服务·架构·毕业设计·课程设计
Dongwoo Jeong6 小时前
微服务架构(MSA)是如何诞生的?
微服务·云原生·架构
半旧夜夏6 小时前
【保姆级】微服务组件环境搭建(Docker Compose版)
java·linux·spring cloud·微服务·云原生·容器
Devin~Y13 小时前
从内容社区到AIGC客服:Spring Boot、Redis、Kafka、K8s、RAG的三轮大厂Java面试对话(附标准答案)
java·spring boot·redis·spring cloud·kafka·kubernetes·micrometer
@insist12313 小时前
系统架构设计师-基于架构的软件开发方法(ABSD)核心原理
架构·系统架构·软考·系统架构设计师·软件水平考试
西凉的悲伤14 小时前
Spring Boot 、Spring Cloud 微服务架构认证授权方案
spring boot·spring cloud·微服务·架构·认证授权
一切皆是因缘际会15 小时前
底层重构与价值破壁人工智能产业变革
人工智能·安全·重构·系统架构
苏渡苇15 小时前
Seata 番外篇:使用 docker-compose 部署 Seata Server(TC)及 K8S 部署 Seata 高可用
spring boot·docker·微服务·容器·kubernetes·seata·springcloud
RingWu16 小时前
高并发三板斧-异步
分布式·微服务·架构
@insist12316 小时前
系统架构设计师-软件架构核心概念与描述方法
系统架构·软件工程·软考·系统架构设计师·软件水平考试