Dr. Alistair Cockburn;被评选为“历史上最伟大的150位i-Technology英雄”之一。
他以敏捷方法和有效用例的编写而闻名,他的最新作品是敏捷的核心
六边形架构,又称“端口和适配器模式”,
使用过过设计模式的都知道适配器模式;,适配器模式是为了解决两个不兼容的接口之间的对接。这种类型的设计模式属于结构型模式;
Dr. Alistair Cockburn提出的六边形架构主张使用适配器模式与外部交互,将应用服务于领域服务封装再系统内部。
这种架构的思想也契合了面向领域驱动设计;面向领域设计,强调以所需解决的领域业务为核心;
先做领域模型的设计,领域边界的划分;围绕领域核心,定义仓储层,缓存,消息队列,外部服务,通信的接口;通过这些接口,完成领域核心与仓储层,缓存,消息队列,外部服务的功能对接;
在这个过程中,领域模型,应用程序便是我们的六边形架构的核心;围绕领域核心,定义的仓储层,缓存,消息队列,外部服务的接口便是我们的六边形架构的适配器
近年来,业务逻辑渗入到用户界面的代码中,已经成了一个老大难问题。这带来了三后果:
首先,我们无法干净地对系统进行自动化测试。这是因为有一些被测逻辑依赖于可视化界面的细节,比如说字段长度和按钮位置,而这些细节常常发生变化。
由于同样的原因,我们不可能将一个人工操作的系统切换为批处理系统。
仍然基于这个原因, 当我们想让一个程序被另一个程序驱动时,也会很困难甚至根本不可能;六边形的架构初衷是为了解决技术与业务领域的解耦问题,技术与技术之间的解耦问题;
网上常见到的六边形经典架构图:
使用面向接口编程的设计,以端口和适配器的设计模式具体实现
六边形架构的特征
1,面向接口编程,依赖倒置,依赖于抽象
内部的逻辑不泄露到外部;只能外部依赖内部;不能内部依赖外部
对于驱动者适配器,外部依赖内部:举例:app层与领域层的接口,由领域层定义接口;由app层适配调用接口
对于被驱动者适配器,内部依赖外部,举例:领域层与仓储层的接口,由领域层定义接口;由仓储适配实现接口
2,使用适配器设计模式
3,关注业务逻辑
关注核心业务,设定外部使用者和引用的外部服务都是可替换的(相对于领域层,仓储服务和app服务是可替换的)
4,外部可替换:得益于依赖抽象和适配器模式的实现方式,使得业务领域逻辑的外部是可替换的
一个端口对应多个适配器,应用通过端口为外部提供服务,内部不关心外部实现;
适配器可以分为2类,“主”、“从”适配器,也可称为“驱动者”和“被驱动者”
5,自动测试:考虑实现与抽象时,也就需要考虑自动化测试;由于各个层之间相互独立,
六边形架构自动化测试可以针对于各个独立层次设计,
保证应用逻辑不会泄露到用户界面,在技术上保证了层次的分界
另外,六边形架构做了项目分层;他将项目分层端口适配器,应用层与领域层;其中中端口包括输出端口,输入端口
三层架构
分成表示层,业务逻辑层,数据访问层,降低耦合,提高复用,分而治之
应用逻辑在不同层泄露,导致替换某一层困难,难以对核心逻辑完整测试
自上而下的依赖,可能多维依赖
自下而上的开发顺序;从数据库,数据访问层向上设计
三层强调的是职责垂直方向的划分
六边形架构
分成内部,外部,内部包括业务逻辑,外部包括应用驱动逻辑、基础设施或其他应用
外部可替换,关注内部领域业务,内部不关注外部
关注点在领域内部
以内部领域的设计开始向外部设计,设计最初从领域开始时不考虑存储,外部如何调用
强调以业务为核心做垂直方向的模块划分
内部,外部各个层次可以独立做单元测试
端口之间的对称性特征
六边形架构实现外部可切换的场景
随着业务的增长,数据量,用户量,功能的增长;系统需要对原先简化的设计分而治之;前端技术,数据库,缓存,大数据,服务器,通信,协议,消息队列,编程语言,全文等多种技术切换,扩展,多样化
原本包含付款退款的模块被拆分成独立的退款,付款服务;日志服务被拆分成日志存储,日志分析服务等场景
原本只需支持Mysql,演变成转向不同的场景下支持Mysql,SqlServer,PostgreSQL,阿里云,azure
原本只需支持Mysql,演变成用户服务使用阿里云Mysql,配置服务使用MongoDB,日志服务使用ES
在倡导以微服务来实现服务的灵活设计,扩展,部署,松耦,简单开发,延迟决策的趋势下,
这些场景是微服务应用于大型分布式系统架构时比较常见的面临的问题
在面对这些问题的时候,这些围绕我们业务领域的驱动或者被驱动的外部要求我们做到可替换
六边形架构可以使用的开发顺序
1,用FIT(验收测试框架)测试装置驱动应用程序,并用mock(内存)数据库来代替实际数据库;
2,为应用加上GUI,仍使用mock数据库;
3,在集成测阶段,用自动化测试脚本(例如通过 Cruise Control )驱动应用,并使用包含测试数据的真实数据库。
4,在实际使用中,由人来操作应用,并使用生产数据库。