当前位置: 首页 > news >正文

14 | fastgo 三层架构设计

提示:

  • 所有体系课见专栏:Go 项目开发极速入门实战课;
  • 欢迎加入 云原生 AI 实战 星球,12+ 高质量体系课、20+ 高质量实战项目助你在 AI 时代建立技术竞争力(聚焦于 Go、云原生、AI Infra)。

在实现业务代码之前,还需要先设计一个合理的软件架构。一个好的软件架构不仅可以大大提高项目的迭代速度,还可以降低项目的阅读和维护难度。目前,行业中有多种流行的软件架构,例如:MVC 架构、六边形架构、洋葱架构、简洁架构等。在 Go 项目开发中,用的最多的是简洁架构。

本节课会详细介绍简洁架构,以及 fastgo 项目的简洁架构设计和实现方法。

为什么需要软件架构?

这里引用 Robert C.Martin 在其《Clean Architecture》书中的一句话,来说明为什么需要软件架构:软件架构的目标是最大限度地减少构建和维护系统所需的人力资源。

具体而言,采用一个合理的软件架构将带来以下好处:

  • 可测试性: 良好的软件架构能够提高代码的可测性,从而增强软件的稳定性;
  • 可维护性: 良好的软件架构使系统的各个部分相互独立,易于理解和修改。它提供了结构化的方式来组织代码,使系统的修改和维护变得更加简单;
  • 扩展性: 软件架构应能够很好的支持系统的扩展和演变。通过合理的分层和模块化,软件架构可以使系统的功能很容易的得到扩展,而无需对整个系统进行重构;
  • 可重用性: 好的软件架构能够提高代码的复用度。将通用的功能封装为可复用的包/库,可以使这些功能在不同的项目和模块中重复使用,从而提高开发效率和代码质量。

简洁架构介绍

简洁架构(Clean Architecture)是一种软件架构模式(又称整洁架构、干净架构),旨在实现可维护、可测试和可扩展的应用程序。最初由 Robert C.Martin 在其文节课 The Clean Architecture 提出。之后,因为简洁架构的诸多优点,在 Go 项目开发中被大量采用。

软件架构有多种形式,例如六边形架构、洋葱架构、尖叫架构、DCI 架构和 BCE 架构等。这些架构在细节上各有不同,但整体而言非常相似。它们的共同目标是实现关注点的分离,并通过软件的分层设计来达到这一目的,从而践行高内聚、低耦合的架构理念。

采用这些软件架构开发的应用都具有以下五点特性:

  • 独立于框架: 该架构不会依赖于某些功能强大的软件库存在。这可以让开发者使用这样的框架作为工具,而不是让开发者的系统陷入到框架的约束中;
  • 可测试性: 业务规则可以在没有 UI、数据库、Web 服务或其他外部元素的情况下进行测试,在实际的开发中,可以通过 Mock 来解耦这些依赖;
  • 独立于 UI: 在无需改变系统其他部分的情况下,UI 可以轻松地改变。例如,在没有改变业务规则的情况下,Web UI 可以替换为控制台 UI;
  • 独立于数据库: 开发者可以用 Mongo、Oracle、Etcd 或者其他数据库来替换 MariaDB,开发者的业务规则不要绑定到数据库;
  • 独立于外部媒介: 实际上,开发者的业务规则可以简单到根本不去了解外部世界。

上述五点特性,也可以看作是简洁架构的五点约束,理论上任何遵循了以上五点约束的软件架构,都可以看作是简洁架构的一种实现方式。通常所说的简洁架构指的是洋葱架构。

fastgo 简洁架构设计

fastgo 项目的简洁架构设计如下图所示:

整个软件架构一共分为以下三层:

  • Handler 层: 负责 API 接口请求的参数解析、参数校验、业务逻辑处理分发、参数返回逻辑。在 Handler 层中,还有 Default 和 Validation 模块,分别用来给请求参数设置默认值,并校验请求参数的合法性;
  • Biz 层: 包括了具体的业务逻辑实现。Biz 层根据 REST 资源类型分为不同的模块,内部可模块间交叉调用。在 Biz 层还有 Conversion 模块,用来进行结构体类型转换;
  • Store 层: 数据访问层(包括访问数据库或第三方微服务),用来跟数据库/微服务交互执行数据的 CURD 操作。

上图所示的简洁架构,还具有以下特点:

  • 简洁架构提供了清晰的分层结构,各层功能明确,职责分明;
  • 通过接口解耦每一层,从而实现代码的可测性、独立性和扩展性;
  • 代码依赖由上向下(图中的有向箭头表示依赖规则),单向单层依赖,提供了清晰的依赖关系,使代码易于理解和维护。

上述三个特点也使得整个软件代码具有很高的易读性和可维护性。上图所示的简洁架构有三层,但这不意味着简洁架构只有三层。如果有需要你可以对层进行增减。虽然层数可变,但是依赖关系是固定的,即:单向依赖。

上图所示的简洁架构中,API 请求的数据流转路径如下图所示。

请求到来后,先经过 Default 模块,用来给请求参数设置默认值。之后,经过 Validation 模块,用来对请求参数进行校验。

校验通过后,会经过 Handler 方法,Handler 方法会处理请求,并将请求转发到 Biz 层的 Biz 方法中。

在 Biz 方法中需要进行数据转换,在 fastgo 项目中,会将 Biz 层的数据结构转换为 Store 层的数据结构,并调用 Store 层的方法,对数据进行 CURD 操作

在 Store 层中,通过调用 GORM 包提供的各种方法,来执行数据的 CURD 操作。

相关文章:

  • C++初阶—stack和queue类
  • 网络爬虫-1:发送请求+维持会话+代理设置/超时设置
  • Prompt engineering设计原则(一)
  • 《python》—— threading库(线程和多线程)
  • 30天学习Java第四天——面向对象
  • ubuntu-drivers-common 包功能详解
  • LWIP网络模型及接口简介(DAY 01)
  • 16 | 实现简洁架构的 Store 层
  • 深度学习视觉2D检测算法综述
  • 外包招聘舞弊利益分配,如何规避这种情况?
  • 加一(js实现,LeetCode:66)
  • rtsp在网页上显示(webrtc-stream)
  • 【C++ STL】 容器详解:priority_queue 学习
  • 大语言模型学习--向量数据库Milvus实践
  • 【大模型学习】第十六章 模型微调技术综述
  • 【eNSP实战】MSTP与VRRP配合使用
  • 图论part2|200. 岛屿数量、695. 岛屿的最大面积
  • 如何制作Windows系统盘、启动盘?(MediaCreationTool_22H2)
  • 韦伯望远镜的拉格朗日点计算推导过程,包含MATLAB和python运动轨迹仿真代码
  • Redis 数据持久化之AOF
  • 4月人文社科联合书单|天文学家的椅子
  • 大学2025丨专访北邮校长徐坤:工科教育要真正回归工程本质
  • 机票搜索热度飙升,透过数据看五一假期旅游热度
  • 魏晓栋已任上海崇明区委常委、组织部部长
  • 现场观察·国防部记者会|美将举行大演习“应对中国”,备战太平洋引发关注
  • 广东东莞调整普通住宅价格标准:一类镇街上浮300余元/平方米