Doha 面向领域的六边形架构

六边形架构介绍


六边形架构

2005 年,Alistair Cockburn 提出的六边形架构,将应用程序巧妙地划分为内部的业务逻辑层和外部的适配器层。内部聚焦于业务逻辑,而外部具有一个或多个入站适配器(而不是表示层),通过调用业务逻辑来处理来自外部的请求。同样,外部具有一个或多个出站适配器(而不是数据持久层),业务逻辑调用这些出站适配器来访问外部应用程序。

为了解耦内部和外部之间的依赖,业务逻辑层抽象出端口来应对业务逻辑与外部的交互,这些端口实质上代表了一种协议,通常以接口 API 的形式呈现。

六边形架构的一个重要好处是业务逻辑不依赖于表示层逻辑或数据访问层逻辑。它将业务逻辑与适配器中包含的表示层和数据访问层的逻辑分离开来。由于这种分离,单独测试业务逻辑就容易得多了。

六边形架构的另一个好处是它是描述微服务架构中每个服务的架构的好方法。可以通过多个适配器调用业务逻辑,每个适配器实现特定的 API 或用户界面。业务逻辑还可以通过端口调用多个适配器,每个适配器调用不同的外部系统。

六边形架构以业务为核心,解耦外部依赖,分离了业务复杂度和技术复杂度等。然而,六边形架构本身并不涉及内部业务逻辑的设计模式,因此在落地过程中,需要我们自己选择业务逻辑的设计模式。通常,对于简单应用可以选择面向事务脚本模式来组织业务逻辑,而对于复杂应用来说,面向领域建模模式是首选。

DOHA 架构介绍

面向领域的六边形架构(Domain-Oriented Hexagonal Architecture)是应用领域建模业务逻辑,落地六边形架构的方法。

DOHA 逻辑架构

逻辑架构

DOHA 将应用分为 Adapter 层、Port 层和 Domain 层。Adapter 层依赖 Port 层,Port 层和 Domain 层作为业务逻辑层互相依赖。

DOHA 实现架构

实现架构

DOHA 将工程分为:

doha-starter:应用启动和部署单元,依赖 doha-business 和 doha-adapter 工程。

doha-Interface:为第三方应用提供接口 API,如 RPC、Event、MQ 等,不依赖其它工程。

doha-adapter:出入站适配器实现都在这里,依赖 doha-business 工程。

doha-business:业务逻辑实现的地方,不依赖其它工程。

DOHA 参考工程

工程地址:Git


DOHA工程结构

├ doha-template # 微服务模板工程

├── doha-template-adapter # Adapter工程

│  ├── pom.xml

│  └── src

│      ├── main

│      │  ├── java

│      │  │  └── io

│      │  │      └── doha

│      │  │          └── template

│      │  │              └── adapter

│      │  │                  ├── cache

│      │  │                  ├── dao

│      │  │                  │  └── OrderDao.java

│      │  │                  ├── mq

│      │  │                  └── rpc

│      │  │                      ├── CalculateSpi.java

│      │  │                      └── OrderRpcSpi.java

│      │  └── resources

│      └── test

│          └── java

├── doha-template-business # Business工程

│  ├── pom.xml

│  └── src

│      ├── main

│      │  ├── java

│      │  │  └── io

│      │  │      └── doha

│      │  │          └── template

│      │  │              ├── domain

│      │  │              │  ├── model

│      │  │              │  │  └── OrderAggregate.java

│      │  │              │  └── service

│      │  │              │      └── OrderRuleService.java

│      │  │              └── port

│      │  │                  ├── event

│      │  │                  ├── remote

│      │  │                  │  └── CalculateRemote.java

│      │  │                  ├── repository

│      │  │                  │  └── OrderRepository.java

│      │  │                  └── service

│      │  │                      ├── OrderCommandService.java

│      │  │                      └── OrderQueryService.java

│      │  └── resources

│      └── test

│          └── java

├── doha-template-interface # Interface工程

│  ├── pom.xml

│  └── src

│      ├── main

│      │  ├── java

│      │  │  └── io

│      │  │      └── doha

│      │  │          └── template

│      │  │              └── api

│      │  │                  ├── mq

│      │  │                  └── rpc

│      │  │                      ├── OrderRequest.java

│      │  │                      ├── OrderResponse.java

│      │  │                      └── OrderRpcApi.java

│      │  └── resources

│      └── test

│          └── java

├── doha-template-starter # Starter工程

│  ├── pom.xml

│  └── src

│      ├── main

│      │  ├── java

│      │  │  └── io

│      │  │      └── doha

│      │  │          └── template

│      │  │              └── DohaTemplateApplication.java

│      │  └── resources

│      │      ├── application.properties

│      │      └── log4j2.xml

│      └── test

│          └── java

├── pom.xml

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容