写点什么

探索六边形架构

  • 2014-11-02
  • 本文字数:1119 字

    阅读完需:约 4 分钟

端口和适配器架构风格,也叫做六边形架构,能够清晰地区分领域模型和输入输出设备之间的界限。 lan Cooper 一次演讲中为听众解释了各种架构风格的特性,尤其着重讲解了六边形架构的内容。

分层系统是一种架构风格,它的本质是避免耦合的出现。作为一名具有20 年从业经历的软件开发者及微软的MVP ,lan 相信耦合正是影响软件可维护的最大敌人。尤其是在大规模系统中,耦合的情况越多,想要在进行改动时避免连锁反应就越困难,同时也增加了测试的难度,而对每次改动所造成的影响的理解与合理解释也变得更加困难了。

端口和适配器架构正是一种分层架构,它遵循了分层系统的所有约束与特性。相比起六边形架构,lan 更倾向于使用端口和适配器架构这个名称,因为总有人怀疑六边形的边的数目是否有什么重要意义,其实它并没有任何意义。

一个六边形架构共包括三个层,其中最关键是的领域模型,它包括了所有的应用逻辑与规则。在领域层中不会直接引用技术实现,例如HTTP 上下文或数据库调用,这样就能够确保在技术方面的改动不会影响到领域层面。

包围在领域层之外的是端口层,它负责接收与用例相关的所有请求,这些请求负责在领域层中协调工作。端口层在端口内部作为领域层的边界,在端口外部则扮演了外部实体的角色。

在端口层之外的是适配器层,这一层的技术实现负责以某种格式接收输入、及产生输出。比方如,对于HTTP 请求,适配器会将转换为对领域层的调用,并将领域层传回的响应进行封送,通过HTTP 传回调用客户端。在适配器层不存在领域逻辑,它的唯一职责就是在外部世界与领域层之间进行技术性的转换。适配器能够与端口的某个协议相关联并使用该端口,多个适配器可以使用同一个端口。lan 举了一个例子,在切换到某种新的用户界面时,可以让新界面与老界面同时使用相同的端口。

lan 相信应当专注于对对象行为进行测试,通过对端口直接进行测试,可以忽略用户界面的细节。许多开发者常犯的一个错误是对领域模型的内部细节进行测试,这种方式会影响重构的进程,因为对实现细节的改动将导致测试不通过。正确的单元测试方法是对端口的边界进行测试,边界作为公开的接口,即使它的实现细节发生了变化,接口本身也能保证不受影响。

集成测试仅仅在对配置进行测试时才需要用到,例如在测试 ORM 映射时验证配置是否正确。与之类似,系统测试只在外部边界进行,通过可靠性测试以验证所有的东西都正确地连接在一起了,例如 REST API 能够正常工作,以及类似的一些测试。

Alistair Cockburn 在 2005 年时演示了六边形架构,作为对传统分层架构、耦合与牵连等问题的解决方案。

除此之外还存在着一种变体,就是 Robert C. Martin 在去年谈到干净架构(Clean Architecture)。

查看英文原文: Exploring the Hexagonal Architecture

2014-11-02 04:5811451
用户头像

发布了 428 篇内容, 共 182.2 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

Tapdata “设擂招贤”携手 LeetCode 举办全球极客技术竞赛

tapdata

下单延迟10s撤单性能测试

FunTester

性能测试 延迟队列 接口测试 测试框架 FunTester

智慧园区一体化管理平台开发,园区智能化集成系统

电微13828808271

Java 项目中使用 Resilience4j 框架实现异步超时处理

码语者

Java TimeLimiter 超时管理

微信 ClickHouse 实时数仓的最佳实践

科技热闻

高可用是什么意思啊?行云管家支持高可用部署吗?

行云管家

高可用 服务器 IT运维

ETL工具算法构建企业级数据仓库五步法

大数据技术指南

11月日更

CWE4.6标准中加入 OWASP 2021 TOP10

华为云开发者联盟

漏洞 cwe 软件安全 CWE4.6 OWASP

龙智携手Atlassian亮相GOPS全球运维大会,助力企业高效开发与运维

龙智—DevSecOps解决方案

运维 运维大会 GOPS大会

破解数据匮乏现状:纵向联邦学习场景下的逻辑回归(LR)

华为云开发者联盟

联邦学习 数据隐私 数据安全 逻辑回归 纵向联邦学习

Linux学习有用吗?《Linux一学就会》教你如何学会Linux

侠盗安全

Linux 运维 云计算架构师 linux电子书

使用kubeadm快速搭建K8s环境

walker12138

Kvrocks 发布 Exporter 工具

Kvrocks

redis Prometheus kvrocks

Java开发基础之开发环境搭建

@零度

JAVA开发

「Oracle」Oracle 数据库基本概念

恒生LIGHT云社区

数据库 oracle

架构实战营模块 9 作业指导

华仔

架构实战营

《致命愿望》:与魔鬼签订契约

爱奇艺技术产品团队

基于内存通信的gRPC调用

Robert Lu

gRPC Go 语言

【干货】大数据开发之Spark总结

@零度

大数据 spark

本周话题:元宇宙到底是不是未来?

InfoQ写作社区官方

话题讨论 元宇宙

【活动预告】Apache ShardingSphere 5.0.0 全新 Database Plus 架构演进

SphereEx

开源社区 ShardingSphere TiDB SphereEx 线下沙龙

模块四 千万级学生管理系统的考试试卷存储方案

前端开发规范之代码规范

@零度

大前端

加速云原生应用落地,焱融 YRCloudFile 与天翼云完成兼容性认证

焱融科技

云计算 分布式 云原生 高性能 文件存储

HBase 的协处理器详细剖析

五分钟学大数据

11月日更

【活动预告】下一代数据平台走向何方?

SphereEx

大数据 大前端 ShardingSphere SphereEx 线上沙龙

Apache Tomcat 7.x安全加固指南

喀拉峻

网络安全 安全 信息安全

10年阿里人告诉你:秒杀系统设计就该这么玩

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

质量基础设施“一站式”线上平台搭建,NQI一站式综合平台解决方案

电微13828808271

先到先得!Alibaba甩出第四次更新的JDK源码高级笔记(终极版)

热爱java的分享家

Java 源码 jdk 面试 经验分享

基于CarbonData的电信时空大数据探索

华为云开发者联盟

大数据 网络 电信 CarbonData 无线通信网络

探索六边形架构_架构_Jan Stenberg_InfoQ精选文章