前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊六边形架构

聊聊六边形架构

作者头像
oec2003
发布于 2023-10-25 02:24:45
发布于 2023-10-25 02:24:45
1.7K0
举报
文章被收录于专栏:不止dotNET不止dotNET

指导我们写出漂亮代码有一种方式是学习设计模式,自从 Gof 四人组的《设计模式》出版后,各类设计模式的书层出不穷。熟读这类书籍,对面试肯定是有帮助的,但代码能力是否有大的长进就不一定了,如果没能理解背后的思想,去生搬硬套,只会起反作用。

背后的思想就是指面向对象的原则:

  • 单一职责原则(SRP)
  • 开放封闭原则(OCP)
  • 里氏替换原则(LSP)
  • 接口隔离原则(ISP)
  • 依赖倒置原则(DIP)

这些原则就是告诉我们应该怎么合理地组织类和方法。最终使我们开发的程序能够满足:可扩展、可复用、可阅读。只是看这些原则比较抽象,最近又看了下六边形架构,我认为对代码的编写有很好的指导作用,下面就聊聊六边形架构。

什么是六边形架构?

六边形架构(Hexagonal Architecture),也被称为端口与适配器架构(Ports and Adapters Architecture),是一种软件架构模式,旨在实现高内聚、低耦合和可测试性的应用程序设计。该架构由 Alistair Cockburn 发明,他是敏捷宣言的签署者之一。

从上图可以看出有内外两层六边形,深蓝色和浅蓝色。

  • 内层(深蓝色):负责领域内的业务逻辑,相对独立,不用关注任何外部依赖或技术细节,也不用关心外部的客户端和服务,我们定义为领域层。
  • 外层(浅蓝色):负责获取不同的业务域的数据,进行业务逻辑的组装,并与外界进行交互,我们定义为应用层。

上图中的紫色部分的 context 是我们在实践过程中添加的,在应用层中进行逻辑组装时,如果没有业务上下文的概念,会导致很多方法被重复调用,所以在业务入口会进行上下文的初始化,将上下文贯穿整个调用链。

端口和适配器

六边形架构也被称为端口与适配器架构,端口和适配器是两个非常关键且重要的概念。

端口

端口是应用程序定义的接口,必须由外界实现,以便应用程序可以接收或发送信息,进行解耦。这个接口是广义的,不光是指 Interface,WebAPI 接口,一些类的公共方法也属于接口的范畴。

端口有分为两种:

  • 入站端口:业务服务对外暴露的公有方法;
  • 出站端口:出站端口只一组方法的接口定义,提供一种规范,供出站适配器来实现。

使用端口和适配器进行处理应用程序的输入和输出,端口只是一种抽象,是应用程序在不了解任何内容的情况下与外界交互的一种方式。

例如:如果想要进行数据库的读取和写入,不是直接操作数据库,而是在接口中定义读取和写入的方法。应用程序不需要知道数据来自哪里,需要写到什么地方去,可能是数据库,也可能是文件系统或缓存,甚至会同时进行操作。

适配器

适配器是连接应用程序核心和外部接口的桥梁。它负责将外部请求转换为应用程序核心可以理解的格式,并将核心的响应转换为外部接口可以接受的格式。

适配器也分为两种:

  • 入站适配器:通常就是对外的 RestAPI,通过调用入站端口来处理外部的请求,也可以是消息队列的消费者,进行一些事件的监听,来处理异步业务,当接收到消息时也是调用入站端口来进行处理;
  • 出站适配器:出站适配器实现出站接口,调用外部的服务来实现一个完整的业务逻辑,出站适配器也可以是消息队列的生产者。

当要将数据保存到数据库中时,适配器从接口定义的数据格式中获取数据,并将其转换为可以写入数据库的内容,重要的是,无论在适配器中怎么变化,核心域和接口不会发生变化。这就非常有用,将应用程序的核心逻辑和外部存储隔离开了。

正是由于端口和适配器的存在,程序变得稳定和容易变化。

为什么叫六边形架构?

为什么叫六边形架构?而不是三角形、圆形、正方形呢?

目前没有明确的理由说明为什么是六边形,而不是其他的形状。或许只是因为六边形比较好看。又或许,一个小的六边形代表这一个模块,一个系统有很多这种模块组成,模块之间有输入输出的交互,就像蜂窝一样。

而蜂窝正好是六边形的。

六边形架构的特点

通过六边形架构,应用程序核心成为了架构的中心,具有清晰的边界和职责,可以独立于外部接口进行测试和演进。外部接口和适配器负责处理与外部系统的交互,使应用程序核心保持独立和可复用。主要有以下特点:

  • 高内聚和低耦合:应用程序核心独立于外部依赖,使得不同部分的修改不会对其他部分产生影响,提高了代码的可维护性。
  • 可测试性:应用程序核心可以轻松地进行单元测试,因为它不依赖于具体的外部接口或技术细节。
  • 可扩展性:通过添加新的适配器,可以很容易地与新的外部系统进行集成,而不会对应用程序核心产生影响。

六边形架构的原则

当我们谈论六边形架构时,会涉及到几个核心原则。这些原则指导我们持续优化软件架构,使系统保持其整体的稳定性。

1、分离关注点:六边形架构将系统划分为不同的层次,每个层次都有其特定的职责和关注点。这种分离使得每个组件可以专注于自身的任务,降低了耦合性,提高了模块的可复用性和可测试性。

2、内外部分离:六边形架构将系统划分为内部和外部两个六边形,分别代表核心业务逻辑和外部接口。内部六边形负责处理核心业务逻辑,而外部六边形则负责处理业务整合和外部系统的交互。这种内外部分离的设计使得系统更容易扩展和适应变化。

3、依赖注入:六边形架构鼓励使用依赖注入来管理组件之间的依赖关系。通过依赖注入,组件的依赖关系可以在运行时进行配置,而不是在编译时固定。这样可以实现组件之间的松耦合,并且方便进行替换和测试。

4、接口驱动:六边形架构强调基于接口编程,通过定义清晰的接口和协议来促进组件之间的通信。接口的使用让各层之间解耦,又便于扩展。

5、测试驱动:六边形架构鼓励在开发过程中采用测试驱动开发(TDD)的方法。通过编写测试用例来定义组件的行为,然后逐步实现和改进组件以满足测试的要求。这种测试驱动的开发方法有助于保证系统的质量和稳定性。

根据这些原则,可以发现,这些就是在文章开头提到的那些面向对象的原则,通过六边形架构的包装后,更具备实操性。

和 DDD 、微服务的关系

在网上查六边形架构的资料,六边形架构往往都跟 DDD 、微服务在一起被提及,但他们之间其实没有很必然的联系。

就像微服务和 DDD 一样,也没有必然联系,因为:

1、DDD 中子域和限界上下文的概念可以对应到微服务中的服务;

2、微服务中一个服务可以由一个团队进行开发,DDD 的一个领域模型也是建议由一个独立的团队负责。

所以,微服务和领域驱动开发(DDD)常常会一起提及,在学习的时候,也会两种一起学,互相配合能够更好地落地。

如果说,微服务是架构风格、DDD 是架构设计方法、那么六边形架构就是一种具体的指导编码的架构实践。

一些资料

1、VS 的 HexagonalX 扩展

在 VS 中可以安装六边形架构的扩展,安装后在创建项目时就会多出六边形架构的项目类型可供选择。

image-20231023183747985

2、几个 GitHub 上的示例项目和文章

https://github.com/alesimoes/hexagonal-clean-architecture

https://github.com/ivanpaulovich/clean-architecture-manga

https://blog.allegro.tech/2020/05/hexagonal-architecture-by-example.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 不止dotNET 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
六边形架构:三个原则和一个实现示例
由Alistair Cockburn于 2005 年记录的Hexagonal Architecture 是一种具有许多优势的软件架构,并且自 2015 年以来再次受到关注。 Hexagonal Architecture的初衷是: 允许应用程序同样由用户、程序、自动测试或批处理脚本驱动,并在与其最终运行时设备和数据库隔离的情况下进行开发和测试。 要探索通过自动化测试试点应用程序或独立于数据库进行开发和测试的好处,我们建议您阅读我们最近发布的关于测试金字塔的这一系列博客文章:实践测试金字塔。 这个 Promis
IT大咖说
2022/09/27
1.7K0
六边形架构:三个原则和一个实现示例
六边形架构和分层架构的区别?
六边形架构(Hexagonal Architecture)和分层架构(Layered Architecture)是两种常见的软件架构模式。 六边形架构强调将核心业务逻辑与外部依赖解耦,通过接口与外部世界进行通信。核心业务逻辑位于架构的中心,而外部依赖通过适配器与核心业务逻辑连接在一起。这种架构具有灵活性高、易于测试和扩展的优点。 分层架构将软件系统划分为多个逻辑层,每个层具有特定的职责和功能。常见的层包括表示层、应用层、领域层和基础设施层。分层架构提供了清晰的分离和组织方式,使得各个层的职责清晰可见,并且易于理解、测试和维护。 这两种架构模式在软件系统设计和开发中有不同的应用场景和优势,可以根据具体需求选择适合的架构模式。
逍遥壮士
2023/09/01
7780
六边形架构和分层架构的区别?
「首席看软件架构」DDD,六边形,洋葱的,干净的,CQRS的整合架构
这篇文章是软件架构编年史的一部分,一系列关于软件架构的文章。在这些文章中,我写了我对软件架构的了解,我如何看待它,以及我如何使用这些知识。如果您阅读了本系列以前的文章,那么本文的内容可能更有意义。
架构师研究会
2019/12/26
5.3K0
中型前端应用,就别折腾什么微前端、DDD、六边形架构了
Hi,我是 ssh,今天带来一篇关于中型应用中需要什么、不需要什么的思考,避免过度设计,把精力放在最重要的技术功能中,才是你成功带领项目的关键:Stop Over-Engineering your Medium Size Front-End Application
ssh_晨曦时梦见兮
2023/10/14
2990
了解不同架构思维,赏析架构之美
系统架构(System Architecture),软件架构(Soft Architecture)是 IT 领域常见的名词,架构设计是软件系统构建过程中极其关键的一部分。
码哥字节
2020/08/31
1.1K0
构建可扩展的应用:六边形架构详解与实践
在现代软件开发中,构建可扩展、可维护、可测试的应用程序是一个不断挑战的任务。为了解决这一挑战,开发人员需要采用适当的架构模式,以确保代码的灵活性和可维护性。本文将介绍一种被称为六边形架构(Hexagonal Architecture)的架构模式,它是一种强大的方法,可以帮助开发人员构建高质量的应用程序。
疯狂的KK
2023/09/06
1.2K0
构建可扩展的应用:六边形架构详解与实践
美团专家漫谈分层架构
如果系统没有分层,当业务规模增加或流量增大时我们只能针对整体系统来做扩展。分层之后可以很方便的把一些模块抽离出来,独立成一个系统。
肉眼品世界
2021/01/06
1.4K0
端口和适配器架构
覃宇,Android开发者/ThoughtWorks技术教练//译者,热衷于探究软件开发的方方面面,从端到云,从工具到实践。喜欢通过翻译来学习和分享知识,译作有《Kotlin实战》、《领域驱动设计精粹》、《Serverless架构:无服务器应用与AWS Lambda》和《云原生安全与DevOps保障》。
张逸
2023/03/23
4620
端口和适配器架构
「应用架构」六边型架构:三个原则和一个实现示例
Hexagonal Architecture于2005年由Alistair Cockburn撰写,是一个具有许多优势的软件架构,自2015年以来又重新引起了人们的兴趣。
架构师研究会
2019/09/08
1.7K0
微服务:如何拆分服务?
在微服务的落地中,第一步就需要进行微服务的拆分,服务的拆分很困难也很重要,本文就讲讲怎么进行服务的拆分。
oec2003
2022/04/26
1.3K0
微服务:如何拆分服务?
软件架构编年史:整洁架构
覃宇,Android开发者/ThoughtWorks技术教练//译者,热衷于探究软件开发的方方面面,从端到云,从工具到实践。喜欢通过翻译来学习和分享知识,译作有《Kotlin实战》、《领域驱动设计精粹》、《Serverless架构:无服务器应用与AWS Lambda》和《云原生安全与DevOps保障》。
张逸
2023/03/23
7410
软件架构编年史:整洁架构
解读六边形架构
追溯微服务架构的渊源,一般会涉及到六边形架构。追溯六边形架构的起源,要看始作俑者Alistair Cockburn的这篇文章 http://alistair.cockburn.us/Hexagonal+architecture, 读原文,译重点,记感受, 如下:
半吊子全栈工匠
2018/08/22
2.3K0
解读六边形架构
从微服务到微服务测试
如果要追溯微服务的定义,大家一般都会去看Martin Fowler在2014年发表的Microservices那篇文章。
王新栋
2019/07/28
8010
六边形架构 (应用服务风格)
晚上好,欢迎阅读本架构文档。很高兴你成功了!在您阅读时,此文档可能已过时,请随时更新!
gemron的空间
2022/08/04
7990
六边形架构 (应用服务风格)
前端代码复用学习笔记:整洁架构与清晰架构
基础代码的复用往往比较简单,但是业务代码的复用通常是困难的,如果没有特殊的手段去治理项目会逐渐发展为难以维护的巨石应用,按照维基百科记载,代码的复用形式主要有三种,程序库,应用框架,设计模式
周陆军博客
2023/03/18
9960
停止过度设计中等规模的前端应用程序
开发一个小型应用程序很简单。另一方面,开发大规模应用程序极其困难,但至少有大量可用的资源可以指导你。
前端小智@大迁世界
2023/08/16
3290
在 .NET Core 中应用六边形架构
在本文中,您会看到一个Web API应用的模板,在.NET Core 中应用了六边形架构,并且里面包含了一些基础功能。
全球技术精选
2021/03/23
5920
在 .NET Core 中应用六边形架构
架构师必知必会,聊聊后端架构设计的演进
你想成为一名架构师,对吗?别对我撒谎,我知道你想成为架构师。即使你不想,你还是想成为一名更好的开发者。否则,你就不会花时间阅读这篇文章😁
架构精进之路
2023/08/18
8470
架构师必知必会,聊聊后端架构设计的演进
架构杂谈
架构设计是基于架构原则和目标给出问题解决方案的过程。架构和设计遵循相同的原则和方法,只是解决问题的规模和层次不同,而这规模和层次没有明显界限。
lyb-geek
2021/12/13
5500
架构杂谈
DDD分层架构浅析
微服务架构模型有好多种,例如整洁架构、CQRS和六边形架构等等。每种架构模式虽然提出的时代和背景不同,但其核心理念都是为了设计出“高内聚低耦合”的架构,轻松实现架构演进。而DDD分层架构的出现,使架构边界变得越来越清晰,它在微服务架构模型中,占有非常重要的位置。
架构狂人
2023/08/16
1.8K0
DDD分层架构浅析
相关推荐
六边形架构:三个原则和一个实现示例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档