社区编辑申请
注册/登录
Go 语言整洁架构实践
开发 架构
本文我们介绍整洁架构在 Go 语言中的实践。

01 介绍

Bob 大叔在他的一篇标题为「整洁架构」的博客中提及,现在一些流行的系统架构,都采用软件分层设计,都主张以下 5 个规则:

  1. 独立于框架
  2. 可测试的
  3. 独立于用户界面
  4. 独立于数据库
  5. 独立于任何外部依赖

Bob 大叔的架构设计遵循依赖规则,他画了一张同心圆的图,共分为 4 层,同心圆由内向外依次为 Entities、Use Cases、Interface Adapters 和 Frameworks and Drivers,该规则规定依赖只能是由外向内,内圈不关心外圈,外圈不要影响内圈。

但是,不要认为必须是分为这四层,这里描述的四层只是一个示例,也许你会发现你的业务不仅仅需要这四层,重点是要遵循由外向内的依赖规则。

本文我们介绍整洁架构在 Go 语言中的实践。

02  整洁架构分层设计

参照 Bob 大叔的整洁架构软件分层设计,我们将架构分层分为以下 4 层:

  1. Models
  2. Repository
  3. Usecase
  4. Delivery

其中,Models 与 Entities 相同,将在所有层中使用,我们可以将所有对象的结构体和方法,以及其他需要在所有层中使用的变量、常量和函数放在 Models 层。这也可以避免遇到循环导入的问题。

Repository 层,我们可以将处理数据库的程序和调用微服务的程序放在该层,仅处理数据输入和输出,不要有其它关于业务逻辑的代码。该层依赖操作的数据库或调用的微服务。

Usecase 层,我们可以将业务逻辑代码放在该层,它负责接收表示层的输入数据,将数据处理之后,调用 Repository 层,将处理后的数据存储在数据库或传递给调用的微服务。反之,将数据库中的数据或调用微服务的返回数据,处理之后,返回给 Delivery  层。该层依赖 Repository 层。

Delivery 层,负责将处理后的数据展示出来,可以采用 RESTful、HTML 或 gRPC 等各种形式。同时,它也负责接收用户输入的数据,将数据传递给 Usecase 层。该层依赖 Usecase 层。

实践应用的目录:

.
├── app
└── main.go
├── go.mod
├── go.sum
└── todoList
├── delivery
└── http
└── todoList.go
├── models
└── todoList.go
├── repository
└── mysql
└── todoList.go
└── usecase
└── todoList.go

03 分层之间通信

分层之间是怎么通信的,除了 Models 层之外,其它层之间通过接口通信,例如 Usecase 层与 Repository 层之间通信,Repository 层定义接口,并实现接口中的所有方法。Usecase 层通过接口与 Repository 层通信。

示例代码:

type TodoListRepository interface {
Create(ctx context.Context, t *Todolist) (err error)
}

同理,Delivery 层与 Usecase 层之间通信,Usecase 层定义接口,并实现接口中的所有方法。Delivery 层通过接口与 Usecase 层通信。

示例代码:

type TodoListUsecase interface {
Create(context.Context, *Todolist) (err error)
}

04  总结

本文我们介绍整洁架构的软件分层设计,并且通过一个简单的 TodoList 项目,在 Go 语言中实践「整洁架构」的架构设计。但是,在 Go 语言中实际上并没有标准的架构设计,我们可以尝试构建自己的标准。

完整代码,请查阅 github。

责任编辑:张燕妮 来源: Golang语言开发栈
相关推荐

2022-06-05 21:09:47

Python办公自动化

2022-05-11 15:08:52

驱动开发系统移植

2022-06-15 11:02:40

网络安全运营

2022-06-27 08:07:13

Go语言互斥锁

2022-06-24 10:52:47

人工智能作业帮T前线

2022-06-01 11:14:22

云原生安全架构设计

2022-06-27 15:25:08

架构模型治理

2022-06-30 10:56:18

字节云数据库存储

2022-05-19 14:14:26

go语言限流算法

2022-06-23 11:42:22

MySQL数据库

2022-07-01 11:12:53

联想

2022-06-29 09:19:09

静态代码C语言c代码

2022-06-30 09:07:52

2022-06-16 15:42:16

攻击面管理ASM

2022-06-30 18:17:00

数据集云数据建模计数据仓库

2022-06-07 09:59:21

网络安全安全漏洞

2022-06-24 10:16:59

Python精选库

2022-06-17 18:49:25

pythonexcel

2022-06-03 09:41:03

DockerKubernetes容器

2022-04-23 16:58:24

微服务微服务架构

同话题下的热门内容

手把手教你用装饰器扩展 Python 计时器吐血推荐17个提升开发效率的“轮子”裁员真能拯救中国互联网?哪些编程语言会在Web 3时代脱颖而出?监控Kubernetes的最佳实践、工具和方法IOC-Golang 的 AOP 原理与应用跨区域、Kubernetes集群运行数据库实践指南并发编程的三大核心问题

编辑推荐

2017年9月编程语言排行榜:Java、C与C++三巨头还能统治排行榜多久?2017年最受欢迎的5个前端框架比较2017年11月编程语言排行榜:脚本语言怎么了?2017年3月编程语言排行榜:Swift首次进入前十最近租房有点烦!技术人如何用Python找到称心如意的“小窝”?
我收藏的内容
点赞
收藏

51CTO技术栈公众号