CSDN多平台一键发布功能开通链接https://mp.csdn.net/vip?utm_sourceweitingfu目录开篇架构选择的困境什么是混合架构分层架构设计实践核心域单体/模块化单体支撑域微服务边缘场景Serverless数据一致性保障运维复杂度管理实战案例某电商平台混合架构演进文末三件套开篇架构选择的困境你是否经历过这样的场景团队开会讨论架构选型有人高举微服务大旗说单体是上古遗物有人坚持单体够用微服务是过度设计。两派争得面红耳赤最后老板一拍板“先单体后面再说。”三个月后系统复杂度飙升单体成了大泥球。又开会这次决定拆微服务。半年后20个微服务运维成本爆炸一个小改动要改5个仓库…问题出在哪不是单体错了也不是微服务错了而是用一把锤子砸所有钉子的思维错了。2026年了还在争论单体 vs 微服务就像争论筷子 vs 刀叉——场景不同工具不同。真正的智慧是不同场景用不同架构取长补短各得其所。这就是混合架构Hybrid Architecture的核心理念。什么是混合架构混合架构不是大杂烩而是基于领域边界的理性分层。它的设计哲学很简单让合适的架构解决合适的问题。┌─────────────────────────────────────────────────────────────┐ │ 混合架构全景图 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ │ │ │ 边缘场景 │ ← Serverless / FaaS │ │ │ (低频/突发) │ 活动页、爬虫、定时任务 │ │ └──────┬───────┘ │ │ │ │ │ ┌──────▼───────┐ │ │ │ 支撑域 │ ← 微服务 (Microservices) │ │ │ (独立演进) │ 订单、支付、库存、物流 │ │ └──────┬───────┘ │ │ │ │ │ ┌──────▼───────┐ │ │ │ 核心域 │ ← 单体 / 模块化单体 (Modular Monolith) │ │ │ (稳定高频) │ 用户、商品、搜索 │ │ └──────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘为什么不是单一架构架构类型优势劣势适用场景单体开发快、调试易、部署简扩展难、技术债累积核心域、稳定业务微服务独立部署、技术异构复杂度高、运维重支撑域、快速迭代Serverless按需付费、自动扩缩冷启动、 vendor lock-in边缘场景、低频任务单一架构的问题纯单体后期难以扩展技术栈锁定纯微服务前期成本过高运维噩梦纯 Serverless复杂业务难以表达调试困难混合架构的优势✅ 核心域稳定单体足够✅ 支撑域灵活微服务解耦✅ 边缘场景省心Serverless托管✅ 成本最优复杂度可控分层架构设计实践核心域单体/模块化单体什么是核心域核心域是系统的心脏——用户系统、商品系统、搜索系统。这些模块的特点是业务逻辑稳定变更频率低数据一致性要求高性能敏感需要本地调用为什么不用微服务想象一下用户注册要调用户服务、权限服务、积分服务、通知服务… 一次注册4个RPC调用网络抖动一下用户体验就崩了。**模块化单体Modular Monolith**是更好的选择┌─────────────────────────────────────────────────────────────┐ │ 模块化单体架构示意 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ API Gateway │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ┌────────────────────────┼────────────────────────┐ │ │ │ ▼ │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ 用户模块 │ │ 商品模块 │ │ 搜索模块 │ │ │ │ │ │ (User) │ │(Product)│ │ (Search)│ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ │ │ │ │ │ │ │ │ └────────────┼────────────┘ │ │ │ │ ▼ │ │ │ │ ┌─────────────┐ │ │ │ │ │ 共享数据库 │ │ │ │ │ │ (PostgreSQL)│ │ │ │ │ └─────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ 同一个进程 / 同一个部署单元 │ │ │ └─────────────────────────────────────────────────────────────┘代码结构示例// 模块化单体的包结构 com.example.core ├── user // 用户模块 - 独立包禁止跨模块直接访问 │ ├── api // 对外暴露的接口 │ ├── service // 业务逻辑 │ └── repository // 数据访问 ├── product // 商品模块 │ ├── api │ ├── service │ └── repository ├── search // 搜索模块 │ ├── api │ ├── service │ └── repository └── shared // 共享基础设施 ├── config └── common关键约束模块间通过api包暴露接口禁止直接访问内部实现数据库表按模块前缀隔离user_xxx,product_xxx未来拆分微服务时只需把模块打包成独立服务支撑域微服务什么是支撑域支撑域是支撑核心业务的器官——订单、支付、库存、物流。这些模块的特点是业务逻辑相对独立需要快速迭代独立部署团队规模扩大需要并行开发微服务拆分原则┌─────────────────────────────────────────────────────────────┐ │ 支撑域微服务架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ │ │ │ API GW │ │ │ └──────┬──────┘ │ │ │ │ │ ┌──────▼──────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │ │ │ 订单服务 │ │ 支付服务 │ │ 库存服务 │ │ 物流服务 │ │ │ │ │ │ │ │ │ │ │ │ │ │ - 创建订单 │ │ - 发起支付 │ │ - 扣减库存 │ │ - 创建运单│ │ │ │ - 取消订单 │ │ - 查询状态 │ │ - 释放库存 │ │ - 轨迹查询│ │ │ │ - 订单查询 │ │ - 退款 │ │ - 库存查询 │ │ - 签收确认│ │ │ │ │ │ │ │ │ │ │ │ │ │ MySQL │ │ MySQL │ │ Redis │ │ MySQL │ │ │ └─────────────┘ └──────────┘ └──────────┘ └─────────┘ │ │ │ │ 通信方式异步消息队列 (RabbitMQ / Kafka) │ │ │ └─────────────────────────────────────────────────────────────┘订单服务代码示例Service public class OrderService { Autowired private OrderRepository orderRepository; Autowired private PaymentClient paymentClient; // Feign 调用支付服务 Autowired private InventoryClient inventoryClient; // Feign 调用库存服务 Autowired private RabbitTemplate rabbitTemplate; // 消息队列 /** * 创建订单 - orchestration 模式 */ Transactional public Order createOrder(CreateOrderRequest request) { // 1. 扣减库存 boolean deducted inventoryClient.deduct(request.getSkuId(), request.getQuantity()); if (!deducted) { throw new BizException(库存不足); } // 2. 创建订单本地事务 Order order new Order(); order.setUserId(request.getUserId()); order.setSkuId(request.getSkuId()); order.setQuantity(request.getQuantity()); order.setStatus(OrderStatus.CREATED); orderRepository.save(order); // 3. 发送延迟消息15分钟后未支付自动取消 rabbitTemplate.convertAndSend( order.delay.exchange, order.delay.key, new OrderDelayMessage(order.getId()), msg - { msg.getMessageProperties().setDelay(15 * 60 * 1000); // 15分钟 return msg; } ); // 4. 异步通知物流系统预留运力 rabbitTemplate.convertAndSend( logistics.exchange, logistics.reserve, new ReserveLogisticsRequest(order.getId(), request.getAddress()) ); return order; } }微服务设计要点数据库独立每个服务有自己的数据库禁止直接访问其他服务的数据库异步优先服务间通信优先用消息队列降低耦合接口契约使用 OpenAPI / Protobuf 定义接口版本化管理熔断降级Hystrix / Sentinel 防止级联故障边缘场景Serverless什么是边缘场景边缘场景是那些低频、突发、独立的任务运营活动页一年几次大促数据爬虫定时抓取外部数据图片处理用户上传后生成缩略图定时报表每天凌晨生成为什么用 Serverless这些任务如果用传统服务器部署大部分时间空闲资源浪费突发流量时需要手动扩容运维成本高监控、日志、告警Serverless 的优势按需付费、自动扩缩、零运维。┌─────────────────────────────────────────────────────────────┐ │ Serverless 场景示意 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ API Gateway │ │ │ │ (触发器HTTP / 定时 / 事件) │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ┌────────────────┼────────────────┐ │ │ ▼ ▼ ▼ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ 活动页函数 │ │ 图片处理 │ │ 数据爬虫 │ │ │ │ (Activity) │ │ (ImageProc) │ │ (Spider) │ │ │ │ │ │ │ │ │ │ │ │ 大促H5页面 │ │ 上传→压缩水印 │ │ 定时抓取竞品 │ │ │ │ 秒杀落地页 │ │ 生成多尺寸 │ │ 价格监控 │ │ │ │ │ │ │ │ │ │ │ │ 运行时长: │ │ 运行时长: │ │ 运行时长: │ │ │ │ 100ms │ │ 3s │ │ 5min │ │ │ │ │ │ │ │ │ │ │ │ 调用次数: │ │ 调用次数: │ │ 调用次数: │ │ │ │ 大促时激增 │ │ 随上传量 │ │ 定时触发 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ 成本对比 │ │ - 传统ECS24小时运行月均 ¥500 │ │ - Serverless按调用付费月均 ¥50 以下 │ │ │ └─────────────────────────────────────────────────────────────┘Serverless 函数示例Python / AWS Lambdaimport json import boto3 from PIL import Image import io def lambda_handler(event, context): 图片处理函数接收 S3 上传事件生成缩略图 s3 boto3.client(s3) # 从事件获取上传的文件信息 bucket event[Records][0][s3][bucket][name] key event[Records][0][s3][object][key] # 下载原图 response s3.get_object(Bucketbucket, Keykey) image Image.open(io.BytesIO(response[Body].read())) # 生成缩略图 (200x200) thumbnail image.copy() thumbnail.thumbnail((200, 200)) # 生成预览图 (800x800) preview image.copy() preview.thumbnail((800, 800)) # 上传处理后的图片 thumbnail_buffer io.BytesIO() thumbnail.save(thumbnail_buffer, formatJPEG, quality85) thumbnail_buffer.seek(0) preview_buffer io.BytesIO() preview.save(preview_buffer, formatJPEG, quality90) preview_buffer.seek(0) # 保存到目标路径 s3.put_object( Bucketbucket, Keyfthumbnails/{key}, Bodythumbnail_buffer, ContentTypeimage/jpeg ) s3.put_object( Bucketbucket, Keyfpreviews/{key}, Bodypreview_buffer, ContentTypeimage/jpeg ) return { statusCode: 200, body: json.dumps({ message: Image processed successfully, original: key, thumbnail: fthumbnails/{key}, preview: fpreviews/{key} }) }Serverless 使用建议冷启动优化使用 Provisioned Concurrency 或保持函数温热超时设置根据任务复杂度设置合理的超时时间日志集中使用 CloudWatch / SLS 等统一收集日志避免长连接不适合 WebSocket 等长连接场景数据一致性保障混合架构最大的挑战跨架构的数据一致性。场景下单扣库存用户下单时需要同时操作订单服务创建订单库存服务扣减库存如果订单创建成功库存扣减失败就会出现超卖。解决方案Saga 模式┌─────────────────────────────────────────────────────────────┐ │ Saga 分布式事务示意 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 正常流程 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ 创建订单 │───→│ 扣减库存 │───→│ 发起支付 │ │ │ │ [成功] │ │ [成功] │ │ [成功] │ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ │ │ │ │ └──────────────┴──────────────┘ │ │ 事务完成 ✓ │ │ │ │ 补偿流程扣减库存失败 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ 创建订单 │───→│ 扣减库存 │───→│ 补偿订单 │ │ │ │ [成功] │ │ [失败] │ │ [取消订单]│ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ │ │ │ │ └──────────────┴──────────────┘ │ │ 事务回滚 ✓ │ │ │ └─────────────────────────────────────────────────────────────┘Saga 实现代码示例Service public class OrderSagaOrchestrator { Autowired private OrderService orderService; Autowired private InventoryService inventoryService; Autowired private PaymentService paymentService; /** * Saga 编排器协调多个服务的本地事务 */ public SagaResult executeOrderSaga(CreateOrderRequest request) { ListCompensateAction compensateActions new ArrayList(); try { // Step 1: 创建订单 Order order orderService.createOrder(request); compensateActions.add(() - orderService.cancelOrder(order.getId())); // Step 2: 扣减库存 boolean inventoryResult inventoryService.deduct( request.getSkuId(), request.getQuantity() ); if (!inventoryResult) { throw new BizException(库存不足); } compensateActions.add(() - inventoryService.release( request.getSkuId(), request.getQuantity() )); // Step 3: 发起支付异步不阻塞 paymentService.initiatePayment(order.getId(), request.getAmount()); return SagaResult.success(order); } catch (Exception e) { // 执行补偿操作逆序 Collections.reverse(compensateActions); for (CompensateAction action : compensateActions) { try { action.execute(); } catch (Exception ex) { // 补偿失败记录日志人工介入 log.error(补偿操作失败, ex); } } return SagaResult.failure(e.getMessage()); } } FunctionalInterface interface CompensateAction { void execute(); } }最终一致性保障策略场景方案工具强一致性要求Saga 补偿自研编排器 / Seata最终一致性消息队列 重试RabbitMQ / Kafka定时对账对账任务 人工修复XXL-JOB / Quartz运维复杂度管理混合架构的运维挑战三种架构三套运维体系。统一可观测性┌─────────────────────────────────────────────────────────────┐ │ 统一可观测性架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 单体应用 │ │ 微服务 │ │ Serverless │ │ │ │ (核心域) │ │ (支撑域) │ │ (边缘场景) │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ └────────────────┼────────────────┘ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 数据采集层 │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ Log │ │ Metric │ │ Trace │ │ │ │ │ │(ELK/Loki)│ │(Prometheus)│ │(Jaeger) │ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 统一展示层 │ │ │ │ Grafana AlertManager │ │ │ │ 统一大盘 / 统一告警 / 统一追踪 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘日志规范统一 JSON 格式{ timestamp: 2026-01-15T10:30:00.000Z, level: INFO, service: order-service, traceId: abc123def456, spanId: span789, message: 订单创建成功, context: { orderId: ORD202601150001, userId: U10086, amount: 199.99 } }部署策略架构类型部署方式工具单体蓝绿部署 / 滚动部署Kubernetes Deployment微服务金丝雀发布 / 灰度发布Istio FlaggerServerless直接部署Serverless Framework / Terraform实战案例某电商平台混合架构演进背景某垂直电商平台年 GMV 10亿技术团队 50人。初期架构2020年纯单体Spring Boot MySQL日均订单 1万系统稳定第一次危机2022年大促期间订单模块性能瓶颈全站发布需要 2小时回滚困难决定拆分微服务过度拆分2023年拆出 30 微服务运维成本飙升调用链路复杂一次下单涉及 8 个服务 RPC 调用混合架构改造2024年至今┌─────────────────────────────────────────────────────────────┐ │ 电商平台混合架构现状 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ CDN WAF │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ┌────────────────────────┼────────────────────────┐ │ │ │ ▼ │ │ │ │ ┌─────────────────────────────────────────┐ │ │ │ │ │ API Gateway │ │ │ │ │ │ (Kong / Spring Cloud Gateway) │ │ │ │ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ ┌────────────┼────────────┐ │ │ │ │ ▼ ▼ ▼ │ │ │ │ ┌─────────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ 核心域单体 │ │ 支撑域微服务│ │ Serverless│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ • 用户中心 │ │ • 订单服务 │ │ • 活动页 │ │ │ │ │ │ • 商品中心 │ │ • 支付服务 │ │ • 图片处理│ │ │ │ │ │ • 搜索服务 │ │ • 库存服务 │ │ • 数据报表│ │ │ │ │ │ • 推荐引擎 │ │ • 物流服务 │ │ • 消息推送│ │ │ │ │ │ │ │ • 营销服务 │ │ │ │ │ │ │ │ 8个模块 │ │ 12个服务 │ │ 20函数 │ │ │ │ │ │ 本地调用 │ │ 异步消息 │ │ 按需触发 │ │ │ │ │ └─────────────┘ └──────────┘ └──────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ 效果 │ │ - 核心接口 P99 延迟从 800ms → 120ms │ │ - 发布耗时从 2小时 → 15分钟核心域/ 5分钟微服务 │ │ - 运维成本降低 40% │ │ - 服务器成本降低 30%Serverless 替代低频任务 │ │ │ └─────────────────────────────────────────────────────────────┘关键决策点为什么核心域保留单体用户、商品、搜索是高频核心链路本地调用性能最优这些模块变更频率低不需要独立部署为什么支撑域用微服务订单、支付、库存需要快速迭代独立团队负责大促期间可以单独扩容库存服务为什么边缘场景用 Serverless活动页一年只有几次大促Serverless 成本最低图片处理是突发流量自动扩缩容省心文末三件套1. 源码获取本文涉及的代码示例已整理到 GitHubhttps://github.com/example/hybrid-architecture-demo包含模块化单体项目模板微服务 Saga 实现示例Serverless 函数模板Kubernetes 部署 YAML2. 思考题看完本文不妨思考以下问题你的系统现在处于哪个阶段是单体臃肿期还是微服务过度拆分期如果让你重新设计你会如何划分核心域和支撑域你觉得混合架构是妥协还是智慧欢迎在评论区讨论 3. 系列预告这是《后端架构实战》系列的第14篇后续计划第15篇《从 0 搭建混合架构技术选型与项目初始化》第16篇《模块化单体拆微服务数据迁移与双写方案》第17篇《Serverless 生产实践冷启动优化与成本控制》关注专栏不错过更新总结混合架构不是和稀泥而是基于领域边界的理性分层核心域单体/模块化单体追求稳定与性能支撑域微服务追求灵活与独立演进边缘场景Serverless追求成本与省心架构没有银弹适合当下的就是最好的。标签#混合架构 #微服务 #单体架构 #Serverless #架构设计 #后端开发 #系统设计互动话题你觉得混合架构是妥协还是智慧欢迎在评论区分享你的观点CSDN多平台一键发布功能开通链接https://mp.csdn.net/vip?utm_sourceweitingfu
后端技术14-单一架构已死?混合架构才是2026年的正确打开方式,单体+微服务+Serverless:我们的三层架构实战
发布时间:2026/6/7 4:02:35
CSDN多平台一键发布功能开通链接https://mp.csdn.net/vip?utm_sourceweitingfu目录开篇架构选择的困境什么是混合架构分层架构设计实践核心域单体/模块化单体支撑域微服务边缘场景Serverless数据一致性保障运维复杂度管理实战案例某电商平台混合架构演进文末三件套开篇架构选择的困境你是否经历过这样的场景团队开会讨论架构选型有人高举微服务大旗说单体是上古遗物有人坚持单体够用微服务是过度设计。两派争得面红耳赤最后老板一拍板“先单体后面再说。”三个月后系统复杂度飙升单体成了大泥球。又开会这次决定拆微服务。半年后20个微服务运维成本爆炸一个小改动要改5个仓库…问题出在哪不是单体错了也不是微服务错了而是用一把锤子砸所有钉子的思维错了。2026年了还在争论单体 vs 微服务就像争论筷子 vs 刀叉——场景不同工具不同。真正的智慧是不同场景用不同架构取长补短各得其所。这就是混合架构Hybrid Architecture的核心理念。什么是混合架构混合架构不是大杂烩而是基于领域边界的理性分层。它的设计哲学很简单让合适的架构解决合适的问题。┌─────────────────────────────────────────────────────────────┐ │ 混合架构全景图 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ │ │ │ 边缘场景 │ ← Serverless / FaaS │ │ │ (低频/突发) │ 活动页、爬虫、定时任务 │ │ └──────┬───────┘ │ │ │ │ │ ┌──────▼───────┐ │ │ │ 支撑域 │ ← 微服务 (Microservices) │ │ │ (独立演进) │ 订单、支付、库存、物流 │ │ └──────┬───────┘ │ │ │ │ │ ┌──────▼───────┐ │ │ │ 核心域 │ ← 单体 / 模块化单体 (Modular Monolith) │ │ │ (稳定高频) │ 用户、商品、搜索 │ │ └──────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘为什么不是单一架构架构类型优势劣势适用场景单体开发快、调试易、部署简扩展难、技术债累积核心域、稳定业务微服务独立部署、技术异构复杂度高、运维重支撑域、快速迭代Serverless按需付费、自动扩缩冷启动、 vendor lock-in边缘场景、低频任务单一架构的问题纯单体后期难以扩展技术栈锁定纯微服务前期成本过高运维噩梦纯 Serverless复杂业务难以表达调试困难混合架构的优势✅ 核心域稳定单体足够✅ 支撑域灵活微服务解耦✅ 边缘场景省心Serverless托管✅ 成本最优复杂度可控分层架构设计实践核心域单体/模块化单体什么是核心域核心域是系统的心脏——用户系统、商品系统、搜索系统。这些模块的特点是业务逻辑稳定变更频率低数据一致性要求高性能敏感需要本地调用为什么不用微服务想象一下用户注册要调用户服务、权限服务、积分服务、通知服务… 一次注册4个RPC调用网络抖动一下用户体验就崩了。**模块化单体Modular Monolith**是更好的选择┌─────────────────────────────────────────────────────────────┐ │ 模块化单体架构示意 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ API Gateway │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ┌────────────────────────┼────────────────────────┐ │ │ │ ▼ │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ 用户模块 │ │ 商品模块 │ │ 搜索模块 │ │ │ │ │ │ (User) │ │(Product)│ │ (Search)│ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ │ │ │ │ │ │ │ │ └────────────┼────────────┘ │ │ │ │ ▼ │ │ │ │ ┌─────────────┐ │ │ │ │ │ 共享数据库 │ │ │ │ │ │ (PostgreSQL)│ │ │ │ │ └─────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ 同一个进程 / 同一个部署单元 │ │ │ └─────────────────────────────────────────────────────────────┘代码结构示例// 模块化单体的包结构 com.example.core ├── user // 用户模块 - 独立包禁止跨模块直接访问 │ ├── api // 对外暴露的接口 │ ├── service // 业务逻辑 │ └── repository // 数据访问 ├── product // 商品模块 │ ├── api │ ├── service │ └── repository ├── search // 搜索模块 │ ├── api │ ├── service │ └── repository └── shared // 共享基础设施 ├── config └── common关键约束模块间通过api包暴露接口禁止直接访问内部实现数据库表按模块前缀隔离user_xxx,product_xxx未来拆分微服务时只需把模块打包成独立服务支撑域微服务什么是支撑域支撑域是支撑核心业务的器官——订单、支付、库存、物流。这些模块的特点是业务逻辑相对独立需要快速迭代独立部署团队规模扩大需要并行开发微服务拆分原则┌─────────────────────────────────────────────────────────────┐ │ 支撑域微服务架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ │ │ │ API GW │ │ │ └──────┬──────┘ │ │ │ │ │ ┌──────▼──────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │ │ │ 订单服务 │ │ 支付服务 │ │ 库存服务 │ │ 物流服务 │ │ │ │ │ │ │ │ │ │ │ │ │ │ - 创建订单 │ │ - 发起支付 │ │ - 扣减库存 │ │ - 创建运单│ │ │ │ - 取消订单 │ │ - 查询状态 │ │ - 释放库存 │ │ - 轨迹查询│ │ │ │ - 订单查询 │ │ - 退款 │ │ - 库存查询 │ │ - 签收确认│ │ │ │ │ │ │ │ │ │ │ │ │ │ MySQL │ │ MySQL │ │ Redis │ │ MySQL │ │ │ └─────────────┘ └──────────┘ └──────────┘ └─────────┘ │ │ │ │ 通信方式异步消息队列 (RabbitMQ / Kafka) │ │ │ └─────────────────────────────────────────────────────────────┘订单服务代码示例Service public class OrderService { Autowired private OrderRepository orderRepository; Autowired private PaymentClient paymentClient; // Feign 调用支付服务 Autowired private InventoryClient inventoryClient; // Feign 调用库存服务 Autowired private RabbitTemplate rabbitTemplate; // 消息队列 /** * 创建订单 - orchestration 模式 */ Transactional public Order createOrder(CreateOrderRequest request) { // 1. 扣减库存 boolean deducted inventoryClient.deduct(request.getSkuId(), request.getQuantity()); if (!deducted) { throw new BizException(库存不足); } // 2. 创建订单本地事务 Order order new Order(); order.setUserId(request.getUserId()); order.setSkuId(request.getSkuId()); order.setQuantity(request.getQuantity()); order.setStatus(OrderStatus.CREATED); orderRepository.save(order); // 3. 发送延迟消息15分钟后未支付自动取消 rabbitTemplate.convertAndSend( order.delay.exchange, order.delay.key, new OrderDelayMessage(order.getId()), msg - { msg.getMessageProperties().setDelay(15 * 60 * 1000); // 15分钟 return msg; } ); // 4. 异步通知物流系统预留运力 rabbitTemplate.convertAndSend( logistics.exchange, logistics.reserve, new ReserveLogisticsRequest(order.getId(), request.getAddress()) ); return order; } }微服务设计要点数据库独立每个服务有自己的数据库禁止直接访问其他服务的数据库异步优先服务间通信优先用消息队列降低耦合接口契约使用 OpenAPI / Protobuf 定义接口版本化管理熔断降级Hystrix / Sentinel 防止级联故障边缘场景Serverless什么是边缘场景边缘场景是那些低频、突发、独立的任务运营活动页一年几次大促数据爬虫定时抓取外部数据图片处理用户上传后生成缩略图定时报表每天凌晨生成为什么用 Serverless这些任务如果用传统服务器部署大部分时间空闲资源浪费突发流量时需要手动扩容运维成本高监控、日志、告警Serverless 的优势按需付费、自动扩缩、零运维。┌─────────────────────────────────────────────────────────────┐ │ Serverless 场景示意 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ API Gateway │ │ │ │ (触发器HTTP / 定时 / 事件) │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ┌────────────────┼────────────────┐ │ │ ▼ ▼ ▼ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ 活动页函数 │ │ 图片处理 │ │ 数据爬虫 │ │ │ │ (Activity) │ │ (ImageProc) │ │ (Spider) │ │ │ │ │ │ │ │ │ │ │ │ 大促H5页面 │ │ 上传→压缩水印 │ │ 定时抓取竞品 │ │ │ │ 秒杀落地页 │ │ 生成多尺寸 │ │ 价格监控 │ │ │ │ │ │ │ │ │ │ │ │ 运行时长: │ │ 运行时长: │ │ 运行时长: │ │ │ │ 100ms │ │ 3s │ │ 5min │ │ │ │ │ │ │ │ │ │ │ │ 调用次数: │ │ 调用次数: │ │ 调用次数: │ │ │ │ 大促时激增 │ │ 随上传量 │ │ 定时触发 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ 成本对比 │ │ - 传统ECS24小时运行月均 ¥500 │ │ - Serverless按调用付费月均 ¥50 以下 │ │ │ └─────────────────────────────────────────────────────────────┘Serverless 函数示例Python / AWS Lambdaimport json import boto3 from PIL import Image import io def lambda_handler(event, context): 图片处理函数接收 S3 上传事件生成缩略图 s3 boto3.client(s3) # 从事件获取上传的文件信息 bucket event[Records][0][s3][bucket][name] key event[Records][0][s3][object][key] # 下载原图 response s3.get_object(Bucketbucket, Keykey) image Image.open(io.BytesIO(response[Body].read())) # 生成缩略图 (200x200) thumbnail image.copy() thumbnail.thumbnail((200, 200)) # 生成预览图 (800x800) preview image.copy() preview.thumbnail((800, 800)) # 上传处理后的图片 thumbnail_buffer io.BytesIO() thumbnail.save(thumbnail_buffer, formatJPEG, quality85) thumbnail_buffer.seek(0) preview_buffer io.BytesIO() preview.save(preview_buffer, formatJPEG, quality90) preview_buffer.seek(0) # 保存到目标路径 s3.put_object( Bucketbucket, Keyfthumbnails/{key}, Bodythumbnail_buffer, ContentTypeimage/jpeg ) s3.put_object( Bucketbucket, Keyfpreviews/{key}, Bodypreview_buffer, ContentTypeimage/jpeg ) return { statusCode: 200, body: json.dumps({ message: Image processed successfully, original: key, thumbnail: fthumbnails/{key}, preview: fpreviews/{key} }) }Serverless 使用建议冷启动优化使用 Provisioned Concurrency 或保持函数温热超时设置根据任务复杂度设置合理的超时时间日志集中使用 CloudWatch / SLS 等统一收集日志避免长连接不适合 WebSocket 等长连接场景数据一致性保障混合架构最大的挑战跨架构的数据一致性。场景下单扣库存用户下单时需要同时操作订单服务创建订单库存服务扣减库存如果订单创建成功库存扣减失败就会出现超卖。解决方案Saga 模式┌─────────────────────────────────────────────────────────────┐ │ Saga 分布式事务示意 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 正常流程 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ 创建订单 │───→│ 扣减库存 │───→│ 发起支付 │ │ │ │ [成功] │ │ [成功] │ │ [成功] │ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ │ │ │ │ └──────────────┴──────────────┘ │ │ 事务完成 ✓ │ │ │ │ 补偿流程扣减库存失败 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ 创建订单 │───→│ 扣减库存 │───→│ 补偿订单 │ │ │ │ [成功] │ │ [失败] │ │ [取消订单]│ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ │ │ │ │ └──────────────┴──────────────┘ │ │ 事务回滚 ✓ │ │ │ └─────────────────────────────────────────────────────────────┘Saga 实现代码示例Service public class OrderSagaOrchestrator { Autowired private OrderService orderService; Autowired private InventoryService inventoryService; Autowired private PaymentService paymentService; /** * Saga 编排器协调多个服务的本地事务 */ public SagaResult executeOrderSaga(CreateOrderRequest request) { ListCompensateAction compensateActions new ArrayList(); try { // Step 1: 创建订单 Order order orderService.createOrder(request); compensateActions.add(() - orderService.cancelOrder(order.getId())); // Step 2: 扣减库存 boolean inventoryResult inventoryService.deduct( request.getSkuId(), request.getQuantity() ); if (!inventoryResult) { throw new BizException(库存不足); } compensateActions.add(() - inventoryService.release( request.getSkuId(), request.getQuantity() )); // Step 3: 发起支付异步不阻塞 paymentService.initiatePayment(order.getId(), request.getAmount()); return SagaResult.success(order); } catch (Exception e) { // 执行补偿操作逆序 Collections.reverse(compensateActions); for (CompensateAction action : compensateActions) { try { action.execute(); } catch (Exception ex) { // 补偿失败记录日志人工介入 log.error(补偿操作失败, ex); } } return SagaResult.failure(e.getMessage()); } } FunctionalInterface interface CompensateAction { void execute(); } }最终一致性保障策略场景方案工具强一致性要求Saga 补偿自研编排器 / Seata最终一致性消息队列 重试RabbitMQ / Kafka定时对账对账任务 人工修复XXL-JOB / Quartz运维复杂度管理混合架构的运维挑战三种架构三套运维体系。统一可观测性┌─────────────────────────────────────────────────────────────┐ │ 统一可观测性架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 单体应用 │ │ 微服务 │ │ Serverless │ │ │ │ (核心域) │ │ (支撑域) │ │ (边缘场景) │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ └────────────────┼────────────────┘ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 数据采集层 │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ Log │ │ Metric │ │ Trace │ │ │ │ │ │(ELK/Loki)│ │(Prometheus)│ │(Jaeger) │ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 统一展示层 │ │ │ │ Grafana AlertManager │ │ │ │ 统一大盘 / 统一告警 / 统一追踪 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘日志规范统一 JSON 格式{ timestamp: 2026-01-15T10:30:00.000Z, level: INFO, service: order-service, traceId: abc123def456, spanId: span789, message: 订单创建成功, context: { orderId: ORD202601150001, userId: U10086, amount: 199.99 } }部署策略架构类型部署方式工具单体蓝绿部署 / 滚动部署Kubernetes Deployment微服务金丝雀发布 / 灰度发布Istio FlaggerServerless直接部署Serverless Framework / Terraform实战案例某电商平台混合架构演进背景某垂直电商平台年 GMV 10亿技术团队 50人。初期架构2020年纯单体Spring Boot MySQL日均订单 1万系统稳定第一次危机2022年大促期间订单模块性能瓶颈全站发布需要 2小时回滚困难决定拆分微服务过度拆分2023年拆出 30 微服务运维成本飙升调用链路复杂一次下单涉及 8 个服务 RPC 调用混合架构改造2024年至今┌─────────────────────────────────────────────────────────────┐ │ 电商平台混合架构现状 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ CDN WAF │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ┌────────────────────────┼────────────────────────┐ │ │ │ ▼ │ │ │ │ ┌─────────────────────────────────────────┐ │ │ │ │ │ API Gateway │ │ │ │ │ │ (Kong / Spring Cloud Gateway) │ │ │ │ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ ┌────────────┼────────────┐ │ │ │ │ ▼ ▼ ▼ │ │ │ │ ┌─────────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ 核心域单体 │ │ 支撑域微服务│ │ Serverless│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ • 用户中心 │ │ • 订单服务 │ │ • 活动页 │ │ │ │ │ │ • 商品中心 │ │ • 支付服务 │ │ • 图片处理│ │ │ │ │ │ • 搜索服务 │ │ • 库存服务 │ │ • 数据报表│ │ │ │ │ │ • 推荐引擎 │ │ • 物流服务 │ │ • 消息推送│ │ │ │ │ │ │ │ • 营销服务 │ │ │ │ │ │ │ │ 8个模块 │ │ 12个服务 │ │ 20函数 │ │ │ │ │ │ 本地调用 │ │ 异步消息 │ │ 按需触发 │ │ │ │ │ └─────────────┘ └──────────┘ └──────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ 效果 │ │ - 核心接口 P99 延迟从 800ms → 120ms │ │ - 发布耗时从 2小时 → 15分钟核心域/ 5分钟微服务 │ │ - 运维成本降低 40% │ │ - 服务器成本降低 30%Serverless 替代低频任务 │ │ │ └─────────────────────────────────────────────────────────────┘关键决策点为什么核心域保留单体用户、商品、搜索是高频核心链路本地调用性能最优这些模块变更频率低不需要独立部署为什么支撑域用微服务订单、支付、库存需要快速迭代独立团队负责大促期间可以单独扩容库存服务为什么边缘场景用 Serverless活动页一年只有几次大促Serverless 成本最低图片处理是突发流量自动扩缩容省心文末三件套1. 源码获取本文涉及的代码示例已整理到 GitHubhttps://github.com/example/hybrid-architecture-demo包含模块化单体项目模板微服务 Saga 实现示例Serverless 函数模板Kubernetes 部署 YAML2. 思考题看完本文不妨思考以下问题你的系统现在处于哪个阶段是单体臃肿期还是微服务过度拆分期如果让你重新设计你会如何划分核心域和支撑域你觉得混合架构是妥协还是智慧欢迎在评论区讨论 3. 系列预告这是《后端架构实战》系列的第14篇后续计划第15篇《从 0 搭建混合架构技术选型与项目初始化》第16篇《模块化单体拆微服务数据迁移与双写方案》第17篇《Serverless 生产实践冷启动优化与成本控制》关注专栏不错过更新总结混合架构不是和稀泥而是基于领域边界的理性分层核心域单体/模块化单体追求稳定与性能支撑域微服务追求灵活与独立演进边缘场景Serverless追求成本与省心架构没有银弹适合当下的就是最好的。标签#混合架构 #微服务 #单体架构 #Serverless #架构设计 #后端开发 #系统设计互动话题你觉得混合架构是妥协还是智慧欢迎在评论区分享你的观点CSDN多平台一键发布功能开通链接https://mp.csdn.net/vip?utm_sourceweitingfu