关于软件架构的一些疑惑

关于软件架构的一些疑惑

疑惑

在学习Bob大叔的《架构整洁之道》的过程中,涉及软件组织的架构。但是这与平日开发中谈论的架构风格,例如:单体/微服务/SOA/事件驱动/云原生等,谈论的内容大不一样。这其中的却别是什么呢?

结合AI解惑

整洁架构 中的"架构"与 单体/微服务/SOA 中的"架构"虽然用了同一个词,但描述的完全是两个不同维度、不同层次的东西。

1.层次不同:逻辑架构 vs 物理/部署架构

  • 整洁架构(以及六边形架构、洋葱架构、DDD分层架构等)

    属于 逻辑架构。它们解决的是代码内部的依赖关系、业务逻辑与技术实现的分离。核心目标是让业务逻辑不依赖于数据库、Web框架、外部API等具体技术细节,从而提高代码的可测试性、可维护性,并让业务逻辑能够"独立存在"。

    在整洁架构中,我们讨论的是:实体(Entities)、用例(Use Cases)、接口适配器(Interface Adapters)、框架与驱动(Frameworks & Drivers)这些层如何组织,依赖方向只能由外向内。

  • 单体、微服务、SOA、面向事件、云原生

    属于 物理/部署架构。它们解决的是系统如何拆分为独立的部署单元、服务之间如何通信、如何扩展、如何运维。

    • 单体:所有功能打包成一个进程,一起部署。
    • 微服务:拆分为多个独立的小服务,各自部署,独立演进。
    • SOA:企业级的服务化架构,通常依赖ESB(企业服务总线)。
    • 面向事件:强调通过事件进行异步通信,解耦生产者与消费者。
    • 云原生:指充分利用云计算模型(容器、编排、弹性、声明式API等)来构建和运行应用。

关键点:这两类架构是正交的,可以任意组合。完全可以用整洁架构的思想去设计一个单体应用,也同样可以用整洁架构去设计每个微服务内部的代码结构。

2.关注点不同:内部依赖管理 vs 外部系统协作

  • 整洁架构关心的是"一个边界之内"的事情。它告诉,在一个特定的业务边界(如一个微服务、一个模块)内部,应该如何组织代码,才能让核心业务逻辑不被技术细节污染。它的核心原则是依赖倒置------高层模块(业务规则)不依赖低层模块(数据库、网络),而是大家都依赖抽象。

  • 微服务/SOA关心的是"边界之间"的事情。它告诉,一个大型系统应该拆分成多少个独立的、可以各自部署的单元,这些单元之间通过什么协议(HTTP、gRPC、消息)通信,如何保证数据最终一致性,如何做服务发现、熔断、限流等。

一个常见的误区:有人觉得"用了微服务,代码自然就是整洁的"。实际上,如果每个微服务内部都是"大泥球"(没有分层、业务逻辑和SQL混在一起),那么微服务只会让拥有多个难以维护的"分布式大泥球"。

3.为什么它们经常被一起提及?

因为"整洁架构"提供的依赖倒置能力,是实现"架构的灵活性与可替换性"的关键。而微服务、事件驱动、云原生这些架构风格,往往都强调"技术选型的灵活性"。

举例说明:

  • 如果用整洁架构设计了一个微服务的内部代码,那么:
    • 这个服务的数据库从MySQL换成PostgreSQL,只需要修改最外层的"接口适配器"和"框架层",核心用例层完全不动。
    • 这个服务原本通过HTTP暴露API,后来需要改成通过消息队列(Kafka)消费事件,同样只需要在最外层替换适配器,业务逻辑层不受影响。

所以,整洁架构通常被视为"在单体或微服务内部,实现高质量代码结构"的一种方法论。

总体理解建议:把概念分层

可以用下面这张"分层地图"来统一理解这些术语:

层次 关注点 典型术语
部署架构层 系统由几个部署单元组成?它们如何通信?如何运维? 单体、微服务、SOA、无服务器(Serverless)
交互风格层 服务之间是同步调用还是异步事件?数据如何流动? 面向事件、请求-响应、消息驱动
运行环境层 是否利用云基础设施?是否容器化? 云原生、容器、K8s、DevOps
代码逻辑层 单个部署单元内部,如何组织代码、分离关注点? 整洁架构、六边形架构、DDD、分层架构

会发现,整洁架构处于最内层(代码逻辑层),它与其他层的术语并不冲突,而是互补的。一个系统可以同时是:

  • 云原生(运行环境)
  • 微服务(部署架构)
  • 面向事件(交互风格)
  • 并且每个微服务内部都采用整洁架构(代码逻辑)
  1. 总结

感觉"整洁架构里的'架构'与单体、微服务等术语总体理解上不同",这种感觉是完全正确的。因为它们确实不是同一类概念:

  • 整洁架构是一套代码组织与依赖管理的范式,旨在保护业务逻辑不受技术细节侵蚀。整洁架构:基于领域驱动设计,通过核心原则单一职责和依赖倒置,将业务和技术分离。
  • 单体、微服务等是系统部署与拆分的范式,旨在解决团队协作、独立部署、弹性伸缩等问题。

它们是不同维度的架构决策,可以共存,也可以交叉组合。 理解这一点后,再去看整洁架构的图示(同心圆)时,可以把它想象成一个"放大镜"------它放大的是单个服务或模块内部的微观结构,而不是描述整个系统的宏观拓扑。


愿我都能在各自的领域里不断成长,勇敢追求梦想,同时也保持对世界的好奇与善意!

相关推荐
贵慜_Derek10 小时前
《从零实现 Agent 系统》连载 32|闭集 IE 与小模型:分类、意图与字段抽取
人工智能·架构·agent
江米小枣tonylua21 小时前
译:设计生产级 RAG 架构
架构
怕浪猫1 天前
领域特定语言(Domain-Specific Language, DSL)
设计模式·程序员·架构
怕浪猫1 天前
哪些软件对 Chrome DevTools Protocol 频繁使用
人工智能·架构·前端框架
Jack201 天前
HarmonyOS APP事件驱动大揭秘
架构
米丘1 天前
微前端之 Web Components 完全指南
微服务·html
秋播1 天前
国内本地WSL2编译rancher源码
云原生
Colin草率地做慢慢地改1 天前
关于QuickStore这个项目的重构(2)- 数据库建表文件
后端·面试·架构
candyTong2 天前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
唐某人丶2 天前
从画架构图开始:架构分析与进阶指南
架构