软件架构编年史:洋葱架构

简介: 软件架构编年史:洋葱架构

2008 年 Jeffrey Palermo 提出了洋葱架构。在我看来,它在端口和适配器架构的基础上贯彻了将领域放在应用中心,将传达机制(UI)和系统使用的基础设施(ORM、搜索引擎、第三方 API...)放在外围的思路。但是它前进了一步,在其中加入了内部层次。

 

我们从通常拥有四个层次(表现层、应用层、领域层、持久化层)的分层架构发展到了端口和适配器架构,它只是含蓄地提到了两个同心圆层次:

  • 代表传达机制和基础设施的外层;
  • 代表业务逻辑的内层。


端口和适配器架构与洋葱架构有着相同的思路,它们都通过编写适配器代码将应用核心从对基础设施的关注中解放出来,避免基础设施代码渗透到应用核心之中。这样应用使用的工具和传达机制都可以轻松地替换,可以一定程度地避免技术、工具或者供应商锁定。


另外,它还有着脱离真实基础设施和传达机制应用仍然可以运行的便利,这样可以使用 mock 代替它们方便测试。


然而,洋葱架构还告诉我们,企业应用中存在着不止两个层次,它在业务逻辑中加入了一些在领域驱动设计的过程中被识别出来的层次:


image.png


此外,它明确了端口和适配器架构中关于依赖方向的暗示:

  • 外层依赖内层;
  • 内层对外层无感知。


也就是说耦合的方向是从外层指向中心,它提供了一个完全独立的对象模型(领域模型),该模型位于架构的核心,不依赖其它任何层次。我们拥有了在不影响内层的情况下改变外层的灵活性。它在架构层面运用了依赖倒置原则。

洋葱架构的关键原则:


围绕独立的对象模型构建应用

内层定义接口,外层实现接口

依赖的方向指向圆心

所有的应用代码可以独立于基础设施编译和运行


—— Jeffrey Palermo 2008, The Onion Architecture: part 3


还有,任何一个外部层次都可以直接调用任何一个内部层次,这样既不会破坏耦合的方向,也避免了仅仅为了追求分层模式而创建一些没有任何业务逻辑的代理方法甚至代理类。这和 Martin Flowler 表达的偏好一致。


[…] 上层可以使用它们下面的任意层次,而不仅仅是它们直接的下层。——Jeffrey Palermo 2008, The Onion Architecture: part 3张逸按:这一方式遵循松散分层架构的做法,但它有可能会破坏必要的封装,导致内部的模型泄漏出去。要知道,变化的影响是双向的,包括外部变化对领域模型的影响,领域模型变化对外部产生的影响。领域驱动设计的上下文映射只建议针对确定稳定的领域模型,采用直接调用的共享内核,否则,直接调用领域模型会被认为是遵奉者反模式。


洋葱架构在端口和适配器架构的基础之上增加了一些的应用业务逻辑的内部组织,这些组织基于领域驱动设计的概念划分的。


这又是一次职责分离的更深入的演化,带来了高内聚低耦合,反过来也带来了更好的可测试性和可维护性。


引用来源



  • 2002 – Martin Fowler – Patterns of Enterprise Application Architecture
  • 2008 – Jeffrey Palermo – The Onion Architecture: part 1
  • 2008 – Jeffrey Palermo – The Onion Architecture: part 2
  • 2008 – Jeffrey Palermo – The Onion Architecture: part 3
  • 2013 – Jeffrey Palermo – The Onion Architecture: part 4 – After Four Years
相关文章
|
4天前
|
架构师 微服务
什么是软件架构?架构的本质是什么?
定义 ”架构是什么“ 是件非常困难的事情,不同的组织对于软件架构有不同的定义,每个人心中也有自身对于系统架构定义的认知。就好比我们无法百分之百表述模型而只能产出模型不同维度的视图,对架构进行完备的定义是不可能的。
18 4
|
4月前
|
存储 监控 微服务
微服务和单体架构是两种不同的软件架构风格,每种都有其自身的优缺点
【1月更文挑战第1天】微服务和单体架构是两种不同的软件架构风格,每种都有其自身的优缺点
54 0
|
18天前
|
前端开发 Oracle 安全
软件架构设计 C/S与B/S架构的区别
C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle或SQLServer。
17 0
|
3月前
|
缓存 监控 Java
DP读书:鲲鹏处理器 架构与编程(十四)ACPI与软件架构具体调优
DP读书:鲲鹏处理器 架构与编程(十四)ACPI与软件架构具体调优
101 1
|
3月前
|
安全 前端开发 Linux
DP读书:鲲鹏处理器 架构与编程(十一)鲲鹏生态软件架构 AND 硬件特定软件
DP读书:鲲鹏处理器 架构与编程(十一)鲲鹏生态软件架构 AND 硬件特定软件
38 0
|
5天前
|
存储 监控 API
构建高效微服务架构:后端开发的现代实践
【5月更文挑战第9天】 在本文中,我们将深入探讨如何在后端开发中构建一个高效的微服务架构。通过分析不同的设计模式和最佳实践,我们将展示如何提升系统的可扩展性、弹性和维护性。我们还将讨论微服务架构在处理复杂业务逻辑和高并发场景下的优势。最后,我们将分享一些实用的工具和技术,以帮助开发者实现这一目标。
|
1天前
|
负载均衡 持续交付 API
构建高效微服务架构的五大关键技术
【5月更文挑战第13天】在当前软件开发领域,微服务架构已经成为一种流行趋势。本文将探讨构建高效微服务架构的五大关键技术,包括容器化部署、服务发现与注册、API网关、负载均衡以及持续集成与持续部署。这些技术可以帮助开发团队更快速、更可靠地构建和部署微服务应用,提高系统的可扩展性和可维护性。
|
1天前
|
负载均衡 JavaScript Java
构建高效微服务架构:后端开发的新视角
【5月更文挑战第13天】在现代软件开发中,微服务架构已经成为一种流行趋势。它通过将应用程序拆分为一组小型、独立的服务来提高可扩展性、弹性和可维护性。本文将探讨如何构建一个高效的微服务架构,包括选择合适的技术栈、设计良好的服务接口、确保数据一致性以及实现有效的服务发现和负载均衡。
|
1天前
|
监控 Java 开发者
构建高效微服务架构:后端开发的新趋势
【5月更文挑战第13天】随着现代应用的复杂性日益增加,传统的单体应用架构已不足以满足快速迭代和可扩展性的需求。本文将探讨如何通过微服务架构来提升后端开发的效率和系统的可靠性,涵盖微服务设计原则、技术栈选择、部署策略以及维护实践。我们将分析微服务的优势与挑战,并提供一系列实施建议,帮助开发者在构建和维护分布式系统时做出明智决策。
|
1天前
|
存储 监控 API
构建高效微服务架构:后端开发的新趋势
【5月更文挑战第13天】在现代软件开发中,随着业务需求的多样化和开发流程的复杂化,传统的单体应用架构逐渐显得笨重且难以适应快速变化。微服务架构作为一种新兴的分布式系统设计方式,以其灵活性、可扩展性和技术多样性受到广泛关注。本文旨在探讨微服务架构的核心概念、设计原则以及实施策略,为后端开发人员提供一种提升系统性能和开发效率的有效途径。
11 2