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

14 | fastgo 三层架构设计

提示:

  • 所有体系课见专栏:Go 项目开发极速入门实战课;

在实现业务代码之前,还需要先设计一个合理的软件架构。一个好的软件架构不仅可以大大提高项目的迭代速度,还可以降低项目的阅读和维护难度。目前,行业中有多种流行的软件架构,例如: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 操作。


欢迎加入「云原生AI 实战营」星球,12+ 高质量体系课、20+ 高质量实战项目助你在 AI 时代建立技术竞争力:
Alt文本

相关文章:

14 | fastgo 三层架构设计

提示: 所有体系课见专栏:Go 项目开发极速入门实战课; 在实现业务代码之前,还需要先设计一个合理的软件架构。一个好的软件架构不仅可以大大提高项目的迭代速度,还可以降低项目的阅读和维护难度。目前,行业中…...

【机器学习-基础知识】统计和贝叶斯推断

1. 概率论基本概念回顾 1. 概率分布 定义: 概率分布(Probability Distribution)指的是随机变量所有可能取值及其对应概率的集合。它描述了一个随机变量可能取的所有值以及每个值被取到的概率。 对于离散型随机变量,使用概率质量函数来描述。对于连续型随机变量,使用概率…...

面向对象Demo01

面向对象 什么是面向对象 回顾方法的定义 package oop; ​ import java.io.IOException; ​ public class Demo01 {public static void main(String[] args) {}//public String sayHello() {return "hello, world!";}public void sayHi() {return;}public int max(i…...

C++设计模式-抽象工厂模式:从原理、适用场景、使用方法,常见问题和解决方案深度解析

一、模式基本概念 1.1 定义与核心思想 抽象工厂模式(Abstract Factory Pattern)是创建型设计模式的集大成者,它通过提供统一的接口来创建多个相互关联或依赖的对象族,而无需指定具体类。其核心思想体现在两个维度: …...

solana区块链地址生成

solana官网地址:https://solana.com 先引入相关依赖solana/web3.js;bip39;ethereumjs/wallet 生成助记词 const mnemonic bip39.generateMnemonic(); 生成种子 const seed bip39.mnemonicToSeedSync(mnemonic); 生成密钥对 const root hdkey.EthereumHDKey.from…...

基于python的升级队列加速决策

a-f大等级是3级 a-c建筑每升1级分别需要8天 d-f建筑每升1级分别需要10天 目前以下建筑队列正在从0级升至1级 建筑A升级需要7天05:16:20 建筑b升级需要06:06:54 建筑c升级需要00:37:00 建筑d升级需要…...

Ragflow技术栈分析及二次开发指南

Ragflow是目前团队化部署大模型+RAG的优质方案,不过其仍不适合直接部署使用,本文将从实际使用的角度,对其进行二次开发。 1. Ragflow 存在问题 Ragflow 开源仓库地址:https://github.com/infiniflow/ragflow Ragflow 当前版本: v0.17.0 Ragflow 目前主要存在以下问题: …...

vue上传文件的请求头携带token校验、和携带另外的参数请求

拿element plus UI库举例&#xff0c;&#xff08;不使用element plus的话js方法通用&#xff09;&#xff1a; <template><el-upload class"upload-demo":http-request"myUploadHttp" action"https://run.mocky.io/v3/9d059bf9-4660-45f2-…...

MySQL的 where 1=1会不会影响性能?

在MySQL中&#xff0c;WHERE 11 是一种常见的SQL编写技巧&#xff0c;通常用于动态生成SQL语句时简化条件拼接。虽然它看起来多余&#xff0c;但在实际使用中&#xff0c;WHERE 11 对性能的影响可以忽略不计。以下是详细分析&#xff1a; 1. WHERE 11 的作用 WHERE 11 是一个恒…...

MyBatis 中SQL 映射文件是如何与 Mapper 接口关联起来的? MyBatis 如何知道应该调用哪个 SQL 语句?

1. 命名空间 (Namespace): SQL 映射文件 (XML): 在 SQL 映射文件的 <mapper> 根元素中&#xff0c;有一个 namespace 属性。这个 namespace 属性的值必须是 Mapper 接口的全限定名&#xff08;包名 接口名&#xff09;。 <mapper namespace"com.example.mapper.…...

SICK Ranger3源码分析——断线重连

前言 本文可在https://paw5zx.github.io/SICK-Ranger3-source-code-analysis-01/中阅读&#xff0c;体验更佳 简单分析一下SICK Ranger3源码中断线重连的实现&#xff0c;这一块算是比较容易的&#xff0c;先择出来分析一下。 代码示例仅贴出关键部分以便分析 使用SDK版本为…...

1.7 双指针专题:三数之和(medium)

1.题目链接 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/3sum/submissions/609626561/ 2.题目描述 给你⼀个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满⾜ i ! j、i ! k 且 j ! k &#xff0c;同时…...

【JavaEE】Spring Boot配置文件

目录 一、Spring Boot配置文件简介二、properties 配置⽂件说明2.1 properties 基本语法2.2 value("${}")读取配置⽂件 三、yml 配置文件说明3.1 yml 基本格式3.2 yml 配置数据类型 及 读取3.3 yml配置对象及读取ConfigurationProperties(prefix "")3.4 配…...

行为模式---策略模式

概念 策略模式是一种行为设计摸是&#xff0c;它的核心思想是将一些列的算法封装成独立的对象&#xff0c;并使它们可以相互替换&#xff0c;通过上下文进行调用。 策略模式通过算法抽象为独立的策略类&#xff0c;客户端可以根据自身需求选择不同的策略类来完成任务、这种方…...

Word 小黑第15套

对应大猫16 修改样式集 导航 -查找 第一章标题不显示 再选中文字 点击标题一 修改标题格式 格式 -段落 -换行和分页 勾选与下段同页 添加脚注 &#xff08;脚注默认位于底部 &#xff09;在脚注插入文档属性&#xff1a; -插入 -文档部件 -域 类别选择文档信息&#xff0c;域…...

OSPF:虚链路

一、虚链路概念 在OSPF中&#xff0c;虚链路&#xff08;Virtual Link&#xff09; 是一种逻辑连接&#xff0c;用于解决因网络设计或扩展导致的区域无法直接连接到骨干区域&#xff08;Area 0&#xff09;的问题。它是通过中间区域&#xff08;Transit Area&#xff09;在两个…...

Ubuntu 22.04 安装配置 FTP服务器 教程

今天搞定在 Ubuntu 22.04 系统上安装和配置 VSFTPD &#xff0c;还会涉及防火墙设置、SSL/TLS 设置&#xff0c;以及创建专门登录 FTP 服务器的账户。开始&#xff01; 一、安装 VSFTPD 首先&#xff0c;咱得让系统知道有啥新软件包可以安装。打开终端&#xff0c;输入下面这…...

基于 Selenium 的软件测试方法研究

一、引言 在软件开发的漫长征程中&#xff0c;软件测试宛如一座坚实的堡垒&#xff0c;守护着软件质量的大门。随着互联网技术的飞速发展&#xff0c;Web 应用程序如雨后春笋般涌现&#xff0c;其功能的复杂性和用户交互的多样性不断增加。在这样的背景下&#xff0c;传统的手动…...

网络安全事件响应--应急响应(windows)

应用系统日志 Windows主要有以下三类日志记录系统事件&#xff1a;应用程序日志、系统日志和安全日志。 系统和应用程序日志存储着故障排除信息&#xff0c;对于系统管理员更为有用。安全日志记录着事件审计信息&#xff0c;包括用户验证&#xff08;登录、远程访问等&#x…...

DataEase:一款国产开源数据可视化分析工具

DataEase 是由飞致云开发的一款基于 Web 的数据可视化 BI 工具&#xff0c;支持丰富的数据源连接&#xff0c;能够通过拖拉拽方式快速制作图表&#xff0c;帮助用户快速分析业务数据并洞察其趋势&#xff0c;为企业的业务改进与优化提供支持。 DataEase 的优势在于&#xff1a;…...

RTK与RTD基础原理

(文中的部分图片是摘自其他博主的文章&#xff0c;由于比较久&#xff0c;忘记原本链接了&#xff0c;侵删) GPS定位原理 卫星自身有自己的星历与原子钟&#xff0c;因此卫星知道自身准确的空间坐标与时间。因为每个卫星都有原子钟&#xff0c;因此每颗卫星的时间基本上都是相…...

关于MCP SSE 服务器的工作原理

模型上下文协议&#xff08;Model Context Protocol&#xff0c;简称MCP&#xff09; 是一种全新的开放协议&#xff0c;专门用于标准化地为大语言模型&#xff08;LLMs&#xff09;提供应用场景和数据背景。 你可以把MCP想象成AI领域的“USB-C接口”&#xff0c;它能让不同的A…...

碳中和小程序:助力用户记录低碳行为,推动环保生活

碳中和小程序:助力用户记录低碳行为,推动环保生活 一、碳中和的全民化挑战与数字化机遇 中国承诺2030年前实现碳达峰,2060年前达成碳中和目标。在这一国家战略下,个人碳减排贡献率需从当前不足5%提升至25%。小程序开发技术正成为破解"公众参与度低"“行为量化难…...

Python读取显示Latex的公式文档,Python加载显示markdown文件。

平时用LLM大语言模型去解释文献里面的公式含义直接复制的格式word看不懂&#xff0c;基于这个web可以正常加载显示。 下面是读取的效果展示&#xff1a;下面程序保存为stl_read.py然后运行下面指令。 streamlit run stl_read.pyimport streamlit as st import base64 import …...

mapbox高阶,结合threejs(threebox)添加extrusion挤出几何体,并添加侧面窗户贴图和楼顶贴图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox extrusion挤出几何体二、🍀…...

mock的定义和使用场景

Python自动化中使用mock的示例 在Python自动化测试中&#xff0c;mock 用于模拟对象、函数或方法的行为&#xff0c;以便在隔离的环境中测试代码。以下是一个简单的示例&#xff1a; 假设你有一个 user.py 模块&#xff0c;其中包含一个 get_user_info 函数&#xff0c;用于从…...

Android Retrofit 请求执行模块执行原理深入源码分析(三)

一、引言 Retrofit 是 Square 公司开发的一款优秀的类型安全的 HTTP 客户端&#xff0c;在 Android 和 Java 开发中被广泛使用。它通过简洁的接口定义和强大的注解功能&#xff0c;使得开发者能够轻松地进行网络请求。请求执行模块是 Retrofit 的核心部分之一&#xff0c;负责…...

封装Axios拦截器实现用户无感刷新AccessToken实践指南

一、背景与需求场景 1.1 单点登录体系中的Token管理 在单点登录&#xff08;SSO&#xff09;体系下&#xff0c;用户登录后系统会颁发两种令牌&#xff1a; AccessToken&#xff1a;短期有效&#xff08;2小时&#xff09;&#xff0c;用于接口鉴权 RefreshToken&#xff1a…...

CSDN博客:Markdown编辑语法教程总结教程(下)

❤个人主页&#xff1a;折枝寄北的博客 Markdown编辑语法教程总结 前言1. LaTex数学公式2. 插入不同类别的图2.1 插入甘特图2.2 插入UML图2.3 插入Mermaid流程图2.4 插入Flowchart流程图2.5 插入classDiagram类图 3. CSDN快捷键4. 字体相关设置4.1 字体样式改变4.2 字体大小改变…...

【Python】06、流程控制语句

文章目录 1.条件判断语句1.1 if 语句2. input 函数3.if-else 语句4.if-elif-else 语句 2.循环语句2.1 while语句2.2 while语句练习&#xff1a;2.3 循环嵌套2.4 break和continue 通过流程控制语句&#xff0c;可以改变程序的执行顺序&#xff0c;也可以让指定程序反复执行多次。…...