深⼊理解六边形架构
六边形架构或六⾓架构是Alistair Cockburn在2005年提出,解决了传统的分层架构所带来的问题,实际上它也是⼀种分层架构,只不过不是上下或左右,⽽是变成了内部和外部。在领域驱动设计(DDD)和微服务架构中都出现了六边形架构的⾝影,在《实现领域驱动设计》⼀书中,作者将六边形架构应⽤到领域驱动设计的实现,六边形的内部代表了application和domain层,⽽在Chris Richardson对微服务架构模式的定义中,每个微服务使⽤六边形架构设计,⾜见六边形架构的重要性。那么让我们⼀探究竟,它为何如此受青睐。
问题
传统的分层架构具有⼴泛的应⽤,例如经典的三层架构,把系统分为表⽰层、业务逻辑层、数据访问层。在Martin Fowler的《企业应⽤架构模式》⼀书中做过深⼊阐述,本书04年出版,时⾄今⽇分层架构仍然是常⽤的设计⽅法,分层架构可以降低耦合、提⾼复⽤、分⽽治之,但同时也还是存在⼀些问题:
应⽤逻辑在不同层泄露,导致替换某⼀层变得困难、难以对核⼼逻辑完整测试:你是否有过困惑,代码到底应该放在哪个层,虽然定义了各层的职责,但是总有⼈不严格遵循层次的分界,对于三层架构,常常会出现业务逻辑写在了表⽰层,或者业务逻辑直接和数据访问绑定。
传统的分层架构是⼀维的结构,有时应⽤不光是上下的依赖,可能是多维的依赖,这时⼀维的结构就⽆法适应了。
六边形架构⼜称为端⼝-适配器,这个名字更容器理解。六边形架构将系统分为内部(内部六边形)和外部,内部代表了应⽤的业务逻辑,外部代表应⽤的驱动逻辑、基础设施或其他应⽤。内部通过端⼝和外部系统通信,端⼝代表了⼀定协议,以API呈现。⼀个端⼝可能对应多个外部系统,不同的外部系统需要使⽤不同的适配器,适配器负责对协议进⾏转换。这样就使得应⽤程序能够以⼀致的⽅式被⽤户、程序、⾃动化测试、批处理脚本所驱动,并且,可以在与实际运⾏的设备和数据库相隔离的情况下开发和测试。
内涵
六边形架构的重点体现在以下⼏个⽅⾯:
常用微服务架构关注点
对于分层架构中层次的界定,Martin Fowler给出了⼀个判定的⽅法,就是如果把表⽰层换成其他实现,如果和原来的表⽰层有重复实现的内容,那么这部分内容就应该放到业务逻辑层。那么如何让开发⼈员在系统设计过程中始终保持这种视⾓,传统的分层架构是难以做到的。六边形架构有⼀个明确的关注点,
从⼀开始就强调把重⼼放在业务逻辑上,外部的驱动逻辑或被驱动逻辑存在可变性、可替换性,依赖具体技术细节。⽽业务逻辑相对更加稳定,体现应⽤的核⼼价值,需要被详尽的测试。
外部可替换
⼀个端⼝对应多个适配器,是对⼀类外部系统的归纳,它体现了对外部的抽象。应⽤通过端⼝为外界提供服务,这些端⼝需要被良好的设计和测试。内部不关⼼外部如何使⽤端⼝,从⼀开始就要假定外部使⽤者是可替换的。六边形的六并没有实质意义,只是为了留⾜够的空间放置端⼝和适配器,⼀般端⼝数不会超过4个。适配器可以分为2类,“主”、“从”适配器,也可称为“驱动者”和“被驱动者”。
⾃动测试
在六边形架构中,⾃动化测试和⽤户具有同等的地位,在实现⽤户界⾯的同时就需要考虑⾃动化测试。它们对应相同的端⼝。六边形架构不仅让⾃动化测试这件事情成为设计第⼀要素,同时⾃动化测试也保证应⽤逻辑不会泄露到⽤户界⾯,在技术上保证了层次的分界。
依赖倒置
六边形架构必须遵循如下规则:内部相关的代码不能泄露到外部。所谓的泄露是指不能出现内部依赖外部的情况,只能外部依赖内部,这样才能保证外部是可以替换的。对于驱动者适配器,就是外部依赖内
部的。但是对于被驱动者适配器,实际是内部依赖外部,这时需要使⽤依赖倒置,由驱动者适配器将被驱动者适配器注⼊到应⽤内部,这时端⼝的定义在应⽤内部,但是实现是由适配器实现。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论