Go 语言整洁架构实践

简介: Go 语言整洁架构实践

介绍

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

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

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

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

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

整洁架构分层设计

参照 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。

推荐阅读:

参考资料:

https://hackernoon.com/golang-clean-archithecture-efd6d7c43047 

https://hackernoon.com/trying-clean-architecture-on-golang-2-44d615bf8fdf 

https://github.com/bxcodec/go-clean-arch 

https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html 

https://manuel.kiessling.net/2012/09/28/applying-the-clean-architecture-to-go-applications/ 


目录
相关文章
|
4天前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
23 1
|
1天前
|
存储 Go 索引
go语言使用for循环遍历
go语言使用for循环遍历
15 7
|
4天前
|
存储 Go
go语言 遍历映射(map)
go语言 遍历映射(map)
18 2
|
5天前
|
Go 调度 开发者
Go语言中的并发编程:深入理解goroutines和channels####
本文旨在探讨Go语言中并发编程的核心概念——goroutines和channels。通过分析它们的工作原理、使用场景以及最佳实践,帮助开发者更好地理解和运用这两种强大的工具来构建高效、可扩展的应用程序。文章还将涵盖一些常见的陷阱和解决方案,以确保在实际应用中能够避免潜在的问题。 ####
|
5天前
|
测试技术 Go 索引
go语言使用 range 关键字遍历
go语言使用 range 关键字遍历
14 3
|
5天前
|
测试技术 Go 索引
go语言通过 for 循环遍历
go语言通过 for 循环遍历
16 3
|
7天前
|
安全 Go 数据处理
Go语言中的并发编程:掌握goroutine和channel的艺术####
本文深入探讨了Go语言在并发编程领域的核心概念——goroutine与channel。不同于传统的单线程执行模式,Go通过轻量级的goroutine实现了高效的并发处理,而channel作为goroutines之间通信的桥梁,确保了数据传递的安全性与高效性。文章首先简述了goroutine的基本特性及其创建方法,随后详细解析了channel的类型、操作以及它们如何协同工作以构建健壮的并发应用。此外,还介绍了select语句在多路复用中的应用,以及如何利用WaitGroup等待一组goroutine完成。最后,通过一个实际案例展示了如何在Go中设计并实现一个简单的并发程序,旨在帮助读者理解并掌
|
6天前
|
Go 索引
go语言按字符(Rune)遍历
go语言按字符(Rune)遍历
21 3
|
5天前
|
消息中间件 运维 开发者
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在后端开发中的应用,从其核心概念、设计原则到实际部署过程中面临的挑战进行了全面剖析。不同于传统的单体应用,微服务通过将复杂系统拆解为一系列小型、独立的服务,提高了系统的灵活性和可维护性。然而,这种架构的转变也伴随着服务间通信、数据一致性、部署复杂性等新问题。本文旨在为开发者提供一套应对这些挑战的策略,同时分享一些成功案例,以期促进微服务架构的有效实施。 ####
|
7天前
|
缓存 负载均衡 API
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的可扩展性、灵活性及易于维护的特点,成为众多企业后端开发的首选架构模式。本文将深入探讨微服务架构的核心理念,通过具体案例分析其在实际应用中的实践策略与面临的挑战,为读者提供一份详尽的微服务架构实施指南。 ####