六边形架构图

六边形架构图 (Hexagonal Architecture Diagram) 是一种用於软件设计的架构模式,另一个名称是 Port & Adapters Diagram,这个模型很常被领域驱动设计 DDD (Domain Driven Development) 一起讨论,他是 DDD 的一种架构,但两者性质不应该混为一谈。

在解释以下这张图之前,先来看看下面这张图 [1]:

https://ithelp.ithome.com.tw/upload/images/20210930/20092753hq2IdESdNw.png

慢慢细看,中间这一层放满了 Adapter, 而六边形外的全是服务、外部系统,六边形的内部是 Domain (也就是完全内部系统),上面还有 Port,显然,这些外部服务会是由 Adapter 串接进入到服务内部,然後在透过 Domain 内部的 Port 进入业务逻辑。

则,可以看到图片加上注解变成:

https://ithelp.ithome.com.tw/upload/images/20210930/20092753TOweVkgGbR.png

转接器层上拥有的转接器,理论意义上就是设计模式中的转接器模式,为了不让内部系统变成外部系统 API 的形状,所以刻意加了一个 Adapter 来分离内外,有点像是在做软硬整合时,你需要写 Firmware 跟 Driver 来让硬体跟软件互通。

而内部系统的 Port 则可以是 Microservice 的服务 Port 或各种类型的软件介面。

基於这个概念,以下就参考 [2] 制造一个可能的情境,主要是要做出转接器模式达到内外部系统分离的架构:

https://ithelp.ithome.com.tw/upload/images/20210930/20092753ZPg0wErjzJ.png

最主要 Adapter 左侧都是给终端 API 呼叫的,例如如果你自己写了一个 Test Agent,或是租用 Runscope, Postman 之类的 API 测试服务,就通通走 Test Adapter 去处理测试与内部分离的工作,比方说 Test Agent 建立用户工厂之类的功能,然後把资料带入 Test Adapter 来测试行为。

其余 Web 进来的模式可能有 REST API, GraphQL API 等形式,反正他们走进来都是 HTTP Protocol。

右侧则都是内部所需的外部服务,依照左右区分的话,可以归类左侧属於 API Interface ,是外部进入 Adapter 的主要入口,而右侧属於 SPI (Service Provider Interface),也可想成 SDK 类的转接层,像是资料库使用 PostgreSQL, MySQL, SQLite 都需要一个 Driver (e.g: JDBC) 来让你的程序可以跟目标服务沟通。

而如果要完全的区分两边用途的话,常见的看法是把左侧的 API 区都是 Input (输入),而右侧的 SPI 区都是 Output (输出),内部则分为转接层、内部系统层 (你的应用程序)。

另外也有一种看法 [7] ,把左侧 API 区看成应用区 (Application),把右侧 SPI 区看成基础建设区 (Infrastructure),中间则是领域模型跟商业逻辑。

References:
[1] https://online.visual-paradigm.com/knowledge/cloud-architecture-diagrams/what-is-hexagonal-architecture-diagram/
[2] https://www.gushiciku.cn/pl/gCCk/zh-hk
[3] https://chowdera.com/2021/08/20210816014828453t.html
[4] https://blog.csdn.net/chachapaofan/article/details/104170285
[5] 使用六边形架构解耦技术代码与业务逻辑
[6] https://www.jianshu.com/p/c2a361c2406c
[7] https://cloud.tencent.com/developer/article/1500287


<<:  Day 28: Kubernetes 原理

>>:  30天零负担轻松学会制作APP介面及设计【DAY 21】

敏捷开发 组别

敏捷开发 https://wolkesau.medium.com/敏捷开发-1afc1cd6edf ...

【D1】前言与规划

上次《Pyhon X 金融分析 X Azure》系列使用Azure去做简单的金融体验,这次就继续拓展...

Leetcode 挑战 Day 06 [66. Plus One]

66. Plus One 今天这一题相对单纯、简单一些,但当中也有一些小技巧和观念,还是蛮值得一看的...

分类模型哪个好?confusion matrix/sensitivity/ specificity

今天来整理一下以前的笔记,聊聊比较分类模型的评判依据:confusion matrix. 下图是常见...