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/ 


目录
相关文章
|
11天前
|
数据采集 运维 数据可视化
AR 运维系统与 MES、EMA、IoT 系统的融合架构与实践
AR运维系统融合IoT、EMA、MES数据,构建“感知-分析-决策-执行”闭环。通过AR终端实现设备数据可视化,实时呈现温度、工单等信息,提升运维效率与生产可靠性。(238字)
|
25天前
|
数据采集 存储 运维
MyEMS:技术架构深度剖析与用户实践支持体系
MyEMS 是一款开源能源管理系统,采用分层架构设计,涵盖数据采集、传输、处理与应用全流程,支持多协议设备接入与多样化能源场景。系统具备高扩展性与易用性,结合完善的文档、社区、培训与定制服务,助力不同技术背景用户高效实现能源数字化管理,降低使用门槛与运维成本,广泛适用于工业、商业及公共机构等场景。
50 0
|
16天前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的"神经网络",强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
1月前
|
前端开发 Java 开发者
MVC 架构模式技术详解与实践
本文档旨在全面解析软件工程中经典且至关重要的 MVC(Model-View-Controller) 架构模式。内容将深入探讨 MVC 的核心思想、三大组件的职责与交互关系、其优势与劣势,并重点分析其在现代 Web 开发中的具体实现,特别是以 Spring MVC 框架为例,详解其请求处理流程、核心组件及基本开发实践。通过本文档,读者将能够深刻理解 MVC 的设计哲学,并掌握基于该模式进行 Web 应用开发的能力。
183 1
|
2月前
|
存储 自然语言处理 前端开发
百亿级知识库解决方案:从零带你构建高并发RAG架构(附实践代码)
本文详解构建高效RAG系统的关键技术,涵盖基础架构、高级查询转换、智能路由、索引优化、噪声控制与端到端评估,助你打造稳定、精准的检索增强生成系统。
283 2
|
边缘计算 Kubernetes 物联网
Kubernetes 赋能边缘计算:架构解析、挑战突破与实践方案
在物联网和工业互联网快速发展的背景下,边缘计算凭借就近处理数据的优势,成为解决云计算延迟高、带宽成本高的关键技术。而 Kubernetes 凭借统一管理、容器化适配和强大生态扩展性,正逐步成为边缘计算的核心编排平台。本文系统解析 Kubernetes 适配边缘环境的架构分层、核心挑战与新兴解决方案,为企业落地边缘项目提供实践参考。
88 0
|
2月前
|
机器学习/深度学习 人工智能 算法
|
8月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
8月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
2月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。