0%

架构落地中常见的架构模式总结

本文系统梳理架构落地中常见的几种核心架构模式,分析各自的优势与适用场景,并给出选型建议。

一、分层架构(Layered Architecture)

常见分层

  • 经典四层:展现层 → 业务层 → 持久层 → 数据库层
  • DDD 分层:接口层 → 应用层 → 领域层 → 基础设施层

优势

  • 关注点分离:每层职责清晰,便于团队分工
  • 可测试性强:各层可独立进行单元测试和 Mock
  • 易于维护:修改某一层不影响其他层(接口契约不变)
  • 技术栈解耦:例如业务层不依赖具体 ORM 框架

适用场景

  • 企业级 CRUD 应用、传统 ERP / OA 系统
  • 团队规模较大、需要明确职责边界的项目

二、微服务架构(Microservices Architecture)

核心特征

  • 每个服务独立部署、独立数据库
  • 服务间通过轻量通信(REST / gRPC / 消息队列)
  • 围绕业务能力组织服务边界

优势

  • 独立扩展:高负载服务单独扩容,节省资源
  • 技术异构:不同服务可用不同技术栈(如 Java + Go 混合)
  • 故障隔离:一个服务崩溃不会拖垮整个系统
  • 快速迭代:小团队独立开发部署,发布周期缩短至天级

典型配套

  • 注册中心(Nacos / Eureka)
  • 网关(Spring Cloud Gateway)
  • 配置中心(Apollo / Nacos)
  • 链路追踪(SkyWalking)

三、事件驱动架构(Event-Driven Architecture, EDA)

两种模式

  • 事件通知:生产者发布事件,消费者订阅处理
  • 事件溯源:以事件序列作为唯一事实来源

优势

  • 高度解耦:生产者和消费者完全不知道彼此存在
  • 异步削峰:秒杀、订单等突发流量通过 MQ 缓冲
  • 最终一致性:适合跨服务的分布式事务场景
  • 可追溯性:事件溯源模式下,所有状态变更都有完整记录

常用组件

  • 消息队列:Kafka / RocketMQ / RabbitMQ
  • 事件存储:Event Store
  • 数据捕获:Debezium(CDC)

四、CQRS(命令查询职责分离)

核心思想

  • Command(命令):写操作(Insert / Update / Delete),使用写模型
  • Query(查询):读操作(Select),使用读模型(可反范式化或使用 ES)

优势

  • 读写性能独立优化:读库可以建大量索引甚至用 NoSQL
  • 复杂查询友好:避免 JOIN 带来的写性能瓶颈
  • 安全管控:读写权限可分别控制
  • 与 EDA 天然结合:写端产生事件 → 更新读端

注意代价

  • 数据最终一致性,需要处理延迟窗口
  • 系统复杂度显著增加(需维护两份数据模型)

五、六边形架构(Hexagonal / Ports and Adapters)

结构

  • 内部:核心业务逻辑(纯 POJO,无框架依赖)
  • 端口(Port):定义输入输出接口(Repository 接口、Service 接口)
  • 适配器(Adapter):实现端口的技术细节(JPA 实现、REST 控制器)

优势

  • 业务与技术彻底解耦:核心代码可脱离 Spring / Database 运行
  • 极致可测试性:核心逻辑无需启动容器即可测试
  • 框架无关:更换 ORM、消息中间件只需替换适配器
  • DDD 最佳实践载体

六、管道-过滤器架构(Pipe-and-Filter)

结构

  • Filter(过滤器):数据处理单元(验证、转换、增强)
  • Pipe(管道):连接 Filter 的数据通道

优势

  • 高度可复用:Filter 可任意组合
  • 并行处理:不同 Filter 可部署在不同节点
  • 易于扩展:新增 Filter 不影响已有逻辑

典型场景

  • ETL 流程、日志处理流水线、数据清洗任务

七、Serverless / FaaS 架构

特点

  • 函数即服务(AWS Lambda / 腾讯云 SCF)
  • 按调用次数计费,自动弹性伸缩

优势

  • 零运维:无需管理服务器
  • 极致弹性:从 0 到 10000 并发瞬间完成
  • 成本优化:空闲时段几乎零成本

局限性

  • 冷启动延迟(Java 尤其明显)
  • 有状态场景不友好
  • 执行时长有限制

架构选型建议

业务特征 推荐架构
CRUD 为主、团队成熟度一般 分层架构 + 模块化单体
业务复杂、多团队协作 微服务 + DDD 限界上下文
高并发、异步流 事件驱动 + CQRS
核心业务需长期演进 六边形架构 + DDD
数据处理流水线 管道-过滤器
低频、突发型任务 Serverless

关键原则

  • 不要为了架构而架构——简单系统用分层即可
  • 架构是演进而非设计出来的——先单体再拆分
  • 一致性比先进性更重要——团队能驾驭的才是好架构