e-works数字化企业网  »  文章频道  »  基础信息化  »  大数据

解读六边形架构

2017/2/27    来源:51CTO    作者:佚名      
关键字:六边形架构  微服务  
追溯微服务架构的渊源,一般会涉及到六边形架构。今天我们就来讲讲有关六边形架构的内容。
    六边形架构
  
    六边形架构意图
  
    采用同等的方式,应用可以通过用户,程序,自动化测试或批处理脚本来驱动,而独立于最终的运行环境及数据库进行开发和测试。
  
    当外部事件到达端口的时候,相应的适配器将其转化成合适的过程调用或者消息,然后传递给应用,而应用对输入设备一无所知。输出内容时,应用通过端口把要传递出去的消息传给适配器,适配器再针对信息接收者的具体实现要求将其转化成合适的信号。从语义上来说,应用跟它周围的适配器有着良好的互动,而对适配器外部的一切无感知。
  
    这是一种设计模式,被Cockburn定义为“端口和适配器模式”,设计模式不仅指导了代码的实现,同时支持结构的实现,又是一种解耦合的技巧。
  
    所需解决的问题场景
  
    不能解决问题的架构,都只是架构师手中的玩具。六边形架构面对的一个典型问题是业务逻辑与用户界面的代码交叉,这是开发中一个非常令人头痛的问题,有三个恶果:
  
    系统无法方便地进行自动化测试,因为部分逻辑依赖界面元素的,比如输入框的长度或按钮的位置,而这些细节又是易变的;
  
    同样,无法把一个面向人机交互的系统移植到一个自动化处理的系统
  
    另外,应用程序之间的相互驱动变得很困难,有时甚至不可能的
  
    “万能的那一层”出现了,可以在架构里增加一个新的层,并承诺不会有业务逻辑被放到着一新层里。然而随着时间的推移,会发现新的层里还是掺杂了业务逻辑,于是老问题又出现了。
  
    怎么办呢?假设一下,如果应用提供的每一个功能都有相应的API会是怎样的结果呢?QA可以通过自动化测试脚本来监测新改的代码,检验是否会破坏已有的功能。业务专家在GUI出来之前就可以创建自动化测试用例,作为程序员们检测是否正确完成工作的依据,同时,这也将成为测试部门所运行的测试的一部分。应用以"headless"模式部署,其它程序通过调用API的方式使用所提供的功能。这种方式使得复杂系统的设计变得容易,面向业务的应用之间不需要人工干预就可以互相调用。最后,回归测试检测到出现问题的地方,并加以修复,而保证业务逻辑不会进入表现层。
  
    另一个典型的问题是,如果应用绑定了外部数据库或其它服务,当数据库宕机或者正在迁移的时候,依赖数据库的程序就无法正常工作。这会导致响应延迟,这是一种相当糟糕的体验。
  
    这两个问题之间没有明显的联系,但它们之间看起来是对称的。这又是一种面向接口的设计么? 可以这样理解,因为接口的概念外延太大了,而在具体的编程语言实现中,interface 有往往太小了。这里把它明确为端口和适配器。
  
    方案
  
    不论用户端交互问题还是服务端数据库编程问题,其同源原因就是在设计和实现过程中出现的业务逻辑混淆,以及与外部实体之间的交互关系。我们要关注的非对称性不是应用的"左边"和"右边",而是它的"内部"和"外部",该属于"内部"的代码就不要泄露到"外部"去,其基础理论还是那些基本的设计原则。
  
    六边形架构的核心理念是:应用通过"端口"跟外部进行交互的。"端口"让人联想到操作系统的端口,任何符合协议的设备都可以被插到相应的端口上。端口的协议是为了两个设备之间能够进行通信而设计的,位于OSI 7层协议模型中的传输层。
  
    对应用来说,API就是协议。对于每一个外部设备,都有对应的适配器把API转换成自己所需要的信号,反之亦然。用户图形界面就是一个很好的例子,它是把用户操作映射到端口API的适配器,还有其它的例子如自动测试套件,批处理驱动器,以及任何需要跨应用程序交互的代码。
  
    对于应用的数据处理层面,应用通过与外部实体交互得到数据,这里用到的协议一般指数据库协议。从应用角度来看,把SQL数据库迁移到普通的文件或者其它类型的数据库,API仍然保持不变。适应于同一个端口的适配器还包括SQL适配器,文件适配器,以及更重要的数据库mock,它可以是驻存在内存里的数据库,不一定是真实的数据库。
  
    很多应用都只有两个端口:用户端端口 和 数据库端端口。这种情况看起来是对称的,很自然地就会用单维度多层次的架构来构建它。在开发应用程序时,就是我们经常看到的三层、四层或五层架构。这种架构有两个问题:
  
    很容易跨越层间的边界,把业务逻辑渗透到其它层中去。
  
    有的应用可能不止需要两个端口,所以不能用单维度架构来构建。
  
    这就是六边形架构提出的原因,它着重解决对称性问题,应用通过端口与外部进行交互,而外部的实体也可以用同样的方式来处理。六边形架构强调以下两点:
  
    首先,通过"内外"的不对称性以及端口的特点,摆脱单维度多层次架构的束缚。可以定义不同数量的端口,2个,3个或者4个,这里说的六边形不限于只有六个边, 可以根据需要加入更多的端口和适配器,"六边形架构"只是视觉上的一种叫法。
  
    其次,关注整体架构的结果导向,一个端口对应一个或一组有目的交互行为。但一个端口一般会有多个适配器,可以是无人应答机,语音留言机,按键电话,用户图形界面,测试套件,批处理驱动器,HTTP接口,程序之间的接口,mock的数据库,或者真实的数据库。
  
    从应用层面来看,这一架构的目的是将注意力聚焦在内外非对称性上,让外部的实体从应用视角来看都是一样的。
  

责任编辑:李欢
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐