10种常见的架构风格,你用过几种?

嗨,你好呀,我是猿java

软件架构风格是描述软件系统高层次组织和结构的模式,它定义了组件之间的交互方式、通信协议以及系统的整体设计原则。不同的架构风格适用于不同的应用场景,影响系统的可维护性、可扩展性、性能和可靠性。这篇文章,我们来分析 10种常见的软件架构风格及其特点。

1. 软件架构风格

1.1 分层架构

分层架构(Layered Architecture)的核心思想是将系统垂直划分为多个层级,每层提供特定功能,且仅能调用下一层的服务(严格分层)或相邻层(松散分层)。其特点是将系统划分为若干层(如表现层、业务逻辑层、数据访问层),每层仅依赖下一层。

常见的典型分层:表现层(UI)→ 业务逻辑层(BLL)→ 数据访问层(DAL)→ 数据库。

  • 优点:职责分离、易于维护、适合团队分工。
  • 缺点:层间调用可能引发性能瓶颈,过度分层会增加复杂性。
  • 应用场景:企业级应用(如ERP、CRM)、传统Web应用。
scss 复制代码
┌─────────────────┐
│     表现层      │ (UI/API)
└────────┬────────┘
         ↓
┌─────────────────┐
│   业务逻辑层    │ (Service)
└────────┬────────┘
         ↓
┌─────────────────┐
│   数据访问层    │ (DAO/Repository)
└────────┬────────┘
         ↓
┌─────────────────┐
│     数据库      │
└─────────────────┘

箭头:严格分层仅允许上层调用下层(禁止跨层或逆向调用)。

1.2 客户端-服务器架构

客户端-服务器架构(Client-Server)的核心思想:功能分离为两个角色:

  • 客户端:发起请求(如浏览器、移动App)。
  • 服务器:处理请求并返回响应(如Web服务器、数据库服务器)。

其特点是客户端请求服务,服务器提供服务,两者通过网络通信。

arduino 复制代码
┌─────────────┐       HTTP/GRPC       ┌─────────────┐
│   Client    │ ────────────────────> │   Server    │
│(Browser/App)│ <──────────────────── │ (Web/DB)    │
└─────────────┘       Response        └─────────────┘

双向箭头:客户端发起请求,服务器返回响应。

  • 优点:职责清晰、易于扩展服务器端。
  • 缺点:服务器可能成为单点故障,网络延迟影响性能。
  • 应用场景:Web应用、电子邮件系统。

1.3 微服务架构

微服务架构(Microservices)的核心思想:将单体应用拆分为多个小型服务,每个服务:

  • 独立进程,轻量级通信(HTTP/gRPC)。
  • 独立开发、部署、扩展(如订单服务、支付服务)。

微服务架构的特点是将系统拆分为多个小型、独立的服务,每个服务负责特定功能,通过API通信。

arduino 复制代码
┌─────────────┐       API Gateway       ┌─────────────┐
│   Client    │ ──────────────────────> │  Service A  │
└─────────────┘                         └─────────────┘
            │                           ▲
            │  Service Discovery        │
            └───────────────────────────┘
              (Consul/Eureka/Nacos)

关键组件:API网关统一入口,服务注册中心管理动态服务地址。

  • 优点:高内聚低耦合、独立部署、技术栈灵活。
  • 缺点:分布式系统复杂性(如事务管理、服务发现)、运维成本高。
  • 应用场景:大型复杂系统(如电商平台、云原生应用)。

1.4 事件驱动架构

事件驱动架构(Event-Driven Architecture, EDA)的核心思想:组件通过事件异步通信,典型模式:

  • 发布/订阅:生产者发布事件,消费者订阅事件队列(如Kafka)。
  • 事件总线:中央调度器管理事件(如Node.js的EventEmitter)。

事件驱动架构的特点是组件通过发布/订阅事件异步通信,解耦生产者和消费者。

scss 复制代码
┌─────────────┐       Publish        ┌─────────────┐
│  Producer   │ ───────────────────> │ Event Bus   │
└─────────────┘       (OrderCreated) └─────────────┘
                                           ↑
                                           │ Subscribe
                                           │
                                    ┌─────────────┐
                                    │  Consumer   │
                                    │ (Inventory) │
                                    └─────────────┘

事件流:生产者发布事件到消息队列(如Kafka),消费者订阅感兴趣的事件。

  • 优点:高扩展性、实时响应、松耦合。
  • 缺点:事件流复杂、难以调试。
  • 应用场景:实时数据处理、消息队列系统(如Kafka)、GUI应用。

1.5 管道-过滤器架构

管道-过滤器架构(Pipe-Filter)的核心思想:数据流经一系列过滤器(处理单元),每个过滤器:

  • 输入数据 → 处理 → 输出数据。
  • 管道(Pipe)连接过滤器,传递数据流。

管道-过滤器架构的特点是数据通过一系列过滤器(处理单元)流动,每个过滤器对数据做特定处理。

scss 复制代码
┌─────────┐     ┌─────────┐     ┌─────────┐
│  Data   │ ──> │ Filter  │ ──> │ Filter  │ ──> Output
│ Source  │     │ (Parse) │     │ (Enrich)│
└─────────┘     └─────────┘     └─────────┘

线性管道:数据流经多个过滤器,每个过滤器完成特定转换。

  • 优点:模块化、易于重用过滤器。
  • 缺点:不适合交互式应用,数据转换开销大。
  • 应用场景:编译器、数据处理流水线(如ETL)。

1.6 面向服务架构

面向服务架构(SOA)的核心思想是将业务功能抽象为可复用服务,通过企业服务总线(ESB)集成:

  • 服务提供者注册到ESB,消费者通过ESB调用服务。
  • 通信协议:SOAP(XML)、REST或消息队列。

它的特点是将功能封装为可重用的服务,通过标准协议(如SOAP、REST)通信。

scss 复制代码
┌─────────────┐       SOAP/REST       ┌─────────────┐
│  Consumer   │ ────────────────────> │   Service   │
└─────────────┘                       └─────────────┘
            │                           ▲
            │          ESB              │
            └───────────────────────────┘
 (Enterprise Service Bus)

ESB核心作用:路由、协议转换、消息增强。

  • 优点:服务复用、跨平台集成。
  • 缺点:ESB(企业服务总线)可能成为瓶颈,复杂性高。
  • 应用场景:企业系统集成(如银行系统)。

1.7 单体架构

单体架构(Monolithic)的核心思想是:所有功能模块(UI、业务逻辑、数据库访问)打包为单一可执行文件。 它的特点是将所有功能集中在一个代码库中,统一部署。

css 复制代码
┌───────────────────────────────────┐
│            Monolith               │
│ ┌─────────┐ ┌─────────┐ ┌───────┐ │
│ │ Module A │ │ Module B │ │ DB   │ │
│ └─────────┘ └─────────┘ └───────┘ │
└───────────────────────────────────┘

单一进程:所有模块共享同一内存空间和数据库连接。

  • 优点:开发简单、部署直接。
  • 缺点:难以扩展、维护成本高。
  • 应用场景:小型应用或早期快速迭代阶段。

1.8 无服务器架构

无服务器架构(Serverless)的核心思想是:开发者只编写函数(如AWS Lambda),云平台负责:

  • 动态扩缩容(按请求量自动调整实例)。
  • 按实际执行时间计费("零成本"闲置时)。

它的特点是开发者专注于函数(Function)开发,云平台管理资源调度。

scss 复制代码
┌─────────────┐       Event        ┌─────────────┐
│   Trigger   │ ─────────────────> │   Function  │
│ (HTTP/S3)   │ <───────────────── │ (Lambda)    │
└─────────────┘       Response     └─────────────┘

事件触发:云平台自动管理函数实例的创建和销毁。

  • 优点:自动扩缩容、按需付费。
  • 缺点:冷启动延迟、厂商锁定。
  • 应用场景:事件触发任务(如文件处理、API后端)。

1.9 空间架构

空间架构的核心思想:通过分布式共享内存(如元组空间)实现数据共享,避免集中式数据库。

  • 组件通过读写共享空间通信(如JavaSpaces)。
  • 数据分区存储(如用户A数据在节点1,用户B在节点2)。

它的特点是通过共享内存(如元组空间)实现分布式组件通信,避免集中式数据库。

scss 复制代码
┌─────────────┐       Read/Write       ┌─────────────┐
│   Node 1    │ ────────────────────>  │  Tuple      │
└─────────────┘                        │  Space      │
┌─────────────┐       Data Grid        └─────────────┘
│   Node 2    │ ────────────────────>  (Shared Memory)
└─────────────┘

共享空间:所有节点通过分布式内存(如Redis集群)交换数据。

  • 优点:高扩展性、高可用性。
  • 缺点:数据一致性难保证。
  • 应用场景:高频交易系统、实时分析。

1.10 点对点架构

点对点架构(Peer-to-Peer, P2P)的核心思想: 节点(Peer)既消费又提供服务,无中心服务器。

  • 结构化P2P:基于DHT(如Chord算法)定位资源。
  • 非结构化P2P:随机广播查询(如Gnutella)。

它的特点是节点平等,既消费又提供服务(如文件共享)。

css 复制代码
       ┌─────────────┐
       │   Peer A    │
       └──────┬──────┘
              │ Query File
       ┌──────▼──────┐
       │   Peer B    │
       └──────┬──────┘
              │ Forward
       ┌──────▼──────┐
       │   Peer C    │
       └─────────────┘

去中心化网络:节点间直接通信,无中心协调者。

  • 优点:去中心化、抗单点故障。
  • 缺点:安全性挑战(如恶意节点)。
  • 应用场景:区块链、文件共享(如BitTorrent)。

1.11 趋势与混合风格

现代系统常混合多种风格(如微服务+事件驱动),并结合云原生技术(容器化、Kubernetes)。架构风格的选择需权衡业务需求与技术约束,没有"银弹"。

2. 总结

本文,我们分析了 11种常见的软件架构风格,并且花了它们简要的模型图。每种架构风格都有它的特点以及对应的使用场景,不过在现实工作中,为了业务需求,我们通常会多种架构风格混合使用。所以,掌握这些架构风格还是很有必要的。

3. 交流学习

最后,把猿哥的座右铭送给你:投资自己才是最大的财富。 如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注公众号:猿java,持续输出硬核文章。

相关推荐
常年游走在bug的边缘8 分钟前
Spring Boot 集成 tess4j 实现图片识别文本
java·spring boot·后端·图片识别
zhu_zhu_xia8 分钟前
C86国产x86兼容架构介绍和应用场景分析
架构
Hello.Reader8 分钟前
IaaS架构剖析、场景实践
架构
魔道不误砍柴功27 分钟前
Java 2025:解锁未来5大技术趋势,Kotlin融合&AI新篇
java·人工智能·kotlin
小可爱的大笨蛋1 小时前
十倍开发效率 - IDEA 插件之RestfulBox - API
java·ide·intellij-idea
佳腾_1 小时前
【消息队列RocketMQ】一、RocketMQ入门核心概念与架构解析
中间件·架构·消息队列·云计算·rocketmq
爱的叹息1 小时前
【java实现+4种变体完整例子】排序算法中【桶排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
java·开发语言·排序算法
热爱编程的小李1 小时前
智能麻将出牌组件
java
侧耳倾听1112 小时前
java 设计模式之单例模式
java·单例模式·设计模式
李新_2 小时前
Android 多进程并发控制如何实现
android·java