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/ 


目录
相关文章
|
1天前
|
安全 网络协议 Go
Go语言网络编程
【10月更文挑战第28天】Go语言网络编程
88 65
|
1天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
20 13
|
1天前
|
网络协议 安全 Go
Go语言的网络编程基础
【10月更文挑战第28天】Go语言的网络编程基础
16 8
|
1天前
|
Go
go语言编译时常量表达式
【10月更文挑战第20天】
10 3
|
1天前
|
安全 Go 开发者
代码之美:Go语言并发编程的优雅实现与案例分析
【10月更文挑战第28天】Go语言自2009年发布以来,凭借简洁的语法、高效的性能和原生的并发支持,赢得了众多开发者的青睐。本文通过两个案例,分别展示了如何使用goroutine和channel实现并发下载网页和构建并发Web服务器,深入探讨了Go语言并发编程的优雅实现。
8 2
|
1天前
|
Go
go语言常量的类型
【10月更文挑战第20天】
7 2
|
1天前
|
Go
go语言定义常量
【10月更文挑战第20天】
7 2
|
1天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
1天前
|
设计模式 人工智能 API
后端开发中的微服务架构实践与挑战#### 一、
本文将深入浅出地探讨微服务架构在后端开发中的应用实践,分析其带来的优势与面临的挑战。通过具体案例,展示如何有效地构建、部署和管理微服务,旨在为读者提供一份实用的微服务架构实施指南。 #### 二、
|
24天前
|
缓存 监控 API
探索微服务架构中的API网关模式
【10月更文挑战第5天】随着微服务架构的兴起,企业纷纷采用这一模式构建复杂应用。在这种架构下,应用被拆分成若干小型、独立的服务,每个服务围绕特定业务功能构建并通过HTTP协议协作。随着服务数量增加,统一管理这些服务间的交互变得至关重要。API网关作为微服务架构的关键组件,承担起路由请求、聚合数据、处理认证与授权等功能。本文通过一个在线零售平台的具体案例,探讨API网关的优势及其实现细节,展示其在简化客户端集成、提升安全性和性能方面的关键作用。
69 2