使用Go构建的六边形架构:后端工程与分布式系统的深度探索
本项目是一个深度实践Go语言和六边形架构(又称清洁架构或端口与适配器架构)的示例,它源于以下文章:
深入探讨PostgreSQL、Redis与Go实现的六边形架构
代码库已超越了原始文章中的示例,提供了一个更复杂且全面的应用。
六边形架构简介
六边形架构旨在将核心业务逻辑从外部组件如用户界面、数据库和外部服务中解耦,实现松散耦合。核心业务逻辑通过一系列定义良好的接口(或称为“端口”)对外交互,适配器则负责实现这些接口并集成到外部世界。
架构组件
核心业务逻辑
核心业务逻辑是应用的核心部分,独立于任何外部依赖,以一组用例形式存在,封装了应用程序的行为。
例如,在银行应用中,核心业务逻辑包括创建账户、转账和查看余额等用例。
适配器
适配器在核心业务逻辑与外界之间起桥梁作用,分为主要适配器(Primary Adapter)和次要适配器(Secondary Adapter)。
主要适配器
主要适配器处理来自外部世界的请求,通常是HTTP服务器,接收客户端的HTTP请求,并将其转化为可被核心业务逻辑理解的形式。
例如,在银行应用中,主要适配器是一个HTTP服务器,监听来自客户(如转账或查询余额)的请求,然后将其转化为使用案例供核心业务逻辑使用。
次要适配器
次要适配器负责与核心业务逻辑所依赖的外部资源进行交互,如数据库、消息队列或第三方API。它们实现了由核心业务逻辑定义的端口。
在银行应用中,次要适配器可能包括数据库适配器,用于存储和检索关于账户、交易和其他相关信息的数据。
接口
软件架构中的接口是两个软件组件之间的合同或协议,定义了一组规则或协议,组件需遵循这些规则才能相互通信。在六边形架构中,接口设定了核心业务逻辑与适配器间的边界,允许核心业务逻辑通过接口轻松地与适配器交互,无需关心具体的实现细节。
依赖
这是应用依赖的外部库或服务。它们由适配器管理,不应直接被核心业务逻辑访问,确保核心业务逻辑保持对基础设施和技术选择的独立性。
应用结构概览
项目的组织结构如下:
├── cmd
│ └── main.go
├── .env
├── images
├── go.mod
├── go.sum
└── internal
├── adapters
│ ├── cache
│ ├── handler
│ ├── repository
│ └── tests
├── config
├── core
│ ├── domain
│ ├── ports
│ └── services
└── web
结构清晰,使每个组件都有明确的角色和职责。
支付服务与Stripe API集成
支付服务可以采用以下步骤与Stripe API集成:
- 创建Stripe账户:首先注册一个Stripe帐户以获取API密钥。
- 设置Webhook:在Stripe后台配置Webhook,将事件发送到你的服务器以实时接收支付状态更新。
- 创建支付端点:在核心业务逻辑中定义支付端口,处理创建支付请求。
- 适配器实现:实现次要适配器(例如
payment_adapter
),使用Stripe的Go库创建PaymentIntents,并返回client_secret。 - 确认支付:当客户端完成支付流程后,使用client_secret调用Stripe API确认支付。
- 处理Webhook事件:当Stripe发送支付成功的Webhook时,解析事件数据,并存储相关支付信息到本地数据库。
- 业务逻辑响应:基于接收到的支付状态更新业务逻辑,如更新订单状态。
通过这种方式,六边形架构使得支付处理与核心业务逻辑保持分离,易于替换或扩展支付服务提供商。
总结起来,这个开源项目提供了一个全面的六边形架构实现,让你能够深入了解如何在Go中构建松散耦合、可测试、可维护的后端系统。其特性包括清晰的代码结构、支持多种外部适配器以及与流行服务(如Stripe)的集成,为你的下一个项目提供了强大的起点。如果你正在寻找一种方式来优化你的后端设计,那么这个项目值得一试。