基于go标准分层架构项目设计实现

基于go标准分层架构项目设计实现

缘起

个人博客网址

最近主要看了两方面知识,一方面是技术相关的,如何设计一个比较好的后端架构项目代码;一方面是非技术相关的,如何写一篇好的技术文章,能够让他人读懂并有收获。因此这篇文章我会借助于chatgpt尝试通过问题发起,然后思考、调研、设计、实战的方式输出一篇文章出来。

一、问题:如何设计一个高性能的web服务框架?

依据笔者这么多年的开发经验,(没吃过猪肉肯定也见过猪走,笑),期望中的高性能web server应该是这样子的:前端通过golang gin实现,将get/post请求到网关,在网关的基本非业务功能处理后,转发到后端的server,server之间通过rpc请求进行转发处理,整个项目遵循golang 标准项目的模块架构,能够使得项目可扩展,便于开发。最好是采用类似DDD的依赖注入和插件化的思想。我把这些设计要点给chat gpt,然后让他帮助我进行设计,我在他的基础上进行综合整理下:

  1. 实现网关的基本功能:网关是一个重要的组件,它可以处理所有进入你的系统的请求,提供路由,负载均衡,认证,限流等功能。

    IDL校验:使用Gin的绑定和验证功能来进行输入数据的校验。Gin支持将请求体绑定到一个结构体,并使用标签来进行数据验证。你也可以使用一些第三方的验证库,如go-playground/validator,来进行更复杂的验证。

    中间件:使用Gin的中间件来来处理一些通用的逻辑,如日志,错误处理,认证,限流等功能。你可以使用Gin提供的一些内置中间件,也可以编写自己的中间件。

  2. 使用Golang和Gin框架:Golang是一种高性能的编程语言,适合构建高性能的web server。Gin是一个高性能的web框架,提供了很多有用的特性,如路由,中间件,参数绑定等,可以帮助你快速开发web server。

  3. 前后端分离:将前端和后端的逻辑分离,使得系统更易于扩展和维护。你可以使用Golang的http包或者更高级的http客户端库,如resty,来发送请求到后端的server。

  4. 使用RPC框架:这取决于你的具体需求。如果你的后端服务是在内网中,且需要高性能的请求,那么使用RPC,如gRPC,是一个很好的选择。如果你的后端服务是在公网中,或者需要更好的跨语言兼容性,那么使用HTTP/REST可能是更好的选择。

  5. 数据库:选择使用MySQL作为数据库。你可以使用Golang的database/sql包来操作数据库,也可以使用一些ORM库,如gorm,来简化数据库操作。你需要考虑数据库连接池的管理,以及如何处理数据库事务。

  6. 测试:你需要为你的代码编写测试,包括单元测试,集成测试,和端到端测试。你可以使用Golang的testing包来编写测试,也可以使用一些第三方的测试库,如testify,来提供更多的测试功能。

  7. 部署:你需要考虑如何部署你的应用。你可以使用Docker来容器化你的应用,然后使用Kubernetes或者Docker Swarm来进行部署。你也需要考虑如何进行日志收集,性能监控,和错误报告。

  8. 项目布局:遵循golang-standards/project-layout的设计是一个很好的实践。这个布局将项目分为多个模块,如cmd,pkg,api,web,scripts等,每个模块都有其特定的职责,这样可以使得项目结构清晰,易于理解和维护。

  9. 采用类似DDD的依赖注入:这是一个很好的设计,可以使得你的代码更易于测试和重构。你可以使用一些依赖注入库,如google/wire,来帮助你实现这个设计。

很好,能够描述清楚我想要的后端框架的样子,之后我让chatgpt给我找一些采用上述类似设计思想的框架供我参考学习,它给我如下的一些学习资源。(当然我又问了其他的一些问题,将得到的书籍、博客社区也补充进来)

Q: 那有没有类似设计思想的文章或者github工程呢,我需要通过这个项目学习整个的组织架构,同时提高自己的架构能力。

A: 可以帮助你提高你的架构能力。

  1. GitHub项目
    • Go项目布局模板:这个项目提供了一个标准的Go项目布局模板,你可以参考它来组织你的代码。
    • Go Clean Architecture:这个项目是一个实现了Clean Architecture的Go项目,它使用了依赖注入和接口,可以帮助你理解如何设计和组织代码。
    • Go-Boilerplate:这个项目是一个Go的项目模板,它使用了Clean Architecture和DDD的设计思想,可以帮助你理解如何在实际项目中应用这些设计思想。
  2. 文章
    • 使用Go和DDD构建微服务:这是一个系列的文章,作者详细介绍了如何使用Go和DDD来构建微服务,包括如何设计领域模型,如何实现服务,如何进行测试等。
    • Go中的Clean Architecture:这篇文章介绍了如何在Go中实现Clean Architecture,包括如何设计接口,如何使用依赖注入等
  3. 书籍
    • 《架构整洁之道》:这本书由著名的软件工程师Robert C. Martin(又名Uncle Bob)撰写,详细介绍了如何设计和实现整洁的架构。
    • 《领域驱动设计:软件核心复杂性应对之道》:这本书由Eric Evans撰写,是领域驱动设计(DDD)的经典之作。
  4. 博客和社区
    • Go官方博客:这里有很多关于Go的深度文章,包括一些关于架构和设计的文章。
    • Golang Weekly:这是一个每周更新的Go新闻和文章的邮件列表,你可以通过它来跟踪Go的最新动态。
    • Go论坛:这是一个Go的社区论坛,你可以在这里提问和讨论Go相关的问题。

二、常用的框架分层设计及选型

这里笔者按照时间维度搜集整理了几种常见的分层架构设计模型,整理记录下来。

2.1 MVC模型

MVC是由Model(模型)、View(视图)、Controller(控制器)三层组成,是一种将业务逻辑、数据、界面显示分离开来的软件设计模式。其中后端分层架构:Controller(服务调用)、Service(逻辑)、Dao(数据访问):

  • Model:功能的实现,数据库的管理,主要负责数据存取;
  • View:用户能够看到的界面,主要负责数据展示;
  • Controller:对请求进行处理,连接模型层和视图层。

这种是比较经典的设计模型,耦合性、重用性、维护性还是可以的。笔者在php开发和c++开发业务代码时经常看到这种设计:
前端请求-> cgi服务模块 -> controller业务逻辑模块-> dao模块

2.1 DDD微服务模块

DDD (Domain-Driven Design) 是一种软件架构设计方法,它旨在将业务逻辑和数据模型与技术实现分离开来,以便更好地满足复杂业务需求,避免“大泥球”式的代码(一图胜千言,怎奈我的博客还不支持图片,先纯文字描述吧)。

  • 用户接口层:负责处理用户请求、渲染视图和返回响应。
  • 应用层:主要面向用例和流程相关的操作,无具体业务规则,负责将用户请求转换成领域行为,并将领域行为传递给领域层进行处理。应用层还负责协调领域层多个领域对象协作完成业务流程。应用层应该是很薄的一层,避免将业务规则实现到应用层中,否则庞大的应用层会使得领域模型失焦,最终演化成传统的三层架构。
  • 领域层:是DDD架构中最重要的层,负责表示业务逻辑和数据模型,用来表达业务概念、业务状态和业务规则。领域层通常包含各种领域对象、值对象、聚合根和实体等。领域层通常使用面向对象的设计和编程技术来实现。
  • 基础设施层:负责提供技术实现,例如数据库访问、网络通信、日志记录和缓存等。基础设施层并不属于被依赖的最底层,而是采用依赖倒置的方式封装基础资源服务,实现应用层、领域层与基础层的解耦,降低外部资源变化对应用的影响。
    在这里插入图片描述

总体来说,这种设计是比较适应未来的趋势的,笔者将过去和未来两种模式放到这里,方便读者站在时间的窗口,来看后面的发展。不过本文实战部分并不会使用这两种模式,而是参考golang-standards/project-layout的设计,设计一个比较简单的系统处理,方便读者理解其中的思路。

三、基于golang-standards/project-layout设计进行实战

首先去github上找下类似设计思想的工程代码,然后研究学习下,再回头找下这个项目:
Go Clean Architecture:这个项目是一个实现了Clean Architecture的Go项目,它使用了依赖注入和接口,可以帮助你理解如何设计和组织代码。

代码链接:https://github.com/bxcodec/go-clean-arch/blob/master/app/main.go

在看了整个项目代码后,主要实现并不是很优雅,我们也没必要照搬全抄,而是借鉴里面亮点的部分,这里我提取出这个项目工程中一些设计亮点:

  • 参数可配置化,使用viper进行参数读取解析
  • 中间件,实现对请求的中间件处理
  • 使用Repo实现对数据库访问的依赖注入
  • 使用了DDD的一些思想,存储层、领域层啥的。

我们在这个亮点的基础上从这个项目提取核心,通过围绕MysqlArticle表包含这些思想写一个完整的demo代码,用来回答我们文章开头的问题。
在这里插入图片描述

写了个框架代码,感兴趣的同学可以在这个基础上继续补充:https://github.com/wsqyouth/go_study_code/tree/master/small_demo/articleservice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/201595.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux之进程地址空间

文章目录 1.进程地址空间回顾1.1进程地址空间划分1.2验证进程地址空间划分1.简单划分2.完整划分 2.初探进程地址空间2.1初看现象2.2Makefile的简便写法 3.进程地址空间详解3.1地址空间是什么?3.2地址空间的设计/由来3.3空间区域划分3.4如何理解地址空间?3.5解释3.2的&#x1…

java_函数式接口

文章目录 一、什么是函数式接口二、四大核心函数式接口三、使用举例 一、什么是函数式接口 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口函数式接口的实例可以通过 lambda 表达式、方法引用或者构造方法引用来创建如果我们在某个接口上声明了 Funct…

贪心算法及相关例题

目录 什么是贪心算法? leetcode455题.分发饼干 leetcode376题.摆动序列 leetcode55题.跳跃游戏I leetcode45题.跳跃游戏II leetcode621题.任务调度器 leetcode435题.无重叠空间 leetcode135题.分发糖果 什么是贪心算法? 贪心算法更多的是一种思…

SpringCloud01

SpringCloud01 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…

MySQL 8.2 Command Line Client打开时一闪而过闪退问题

MySQL8.2安装成功后,发现打开MySQL 8.0 Command Line Client时出现一闪而过,打不开的情况。 解决方案: 1、打开MySQL 8.2 Command Line Client文件位置 2、右键选择属性 3、复制它的目标 4、我复制下来的目标路径是这样的,"…

「校园 Pie」 系列活动正式启航,首站走进南方科技大学!

PieCloudDB 社区校园行系列活动「校园 Pie」已正式启动。「校园 Pie」旨在促进数据库领域的学术交流,提供一个平台让学生们了解最新的数据库发展趋势和相关技术应用。 在「校园 Pie」系列活动中,PieCloudDB 社区将携拓数派技术专家,社区大咖…

ComText让机器人有了情节记忆

为了让人类与机器人更好地交流,MIT 计算机科学与人工智能实验室的研究员开发了一个名为 ComText 的程序。这款程序给机器人增加了情节记忆,让它们能够接受更加复杂的命令。目前,他们已经在机器人 Baxter 上测试了程序。 机器人没有情景化的记…

关于软raid的实现及常见问题

RAID概念 磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。 磁盘阵列是由很多价格较便宜的磁盘,以硬件(RAID卡)或软件(MDADM&…

git常用命令(git github ssh)

目录 1、语法说明2、本地仓库相关操作建立一个git文件(git init)把工作区的文件添加到暂存区(git add)把暂存区的文件添加到本地仓库(git commit)查看暂存区和本地仓库中的文件(git ls-files)查看文件夹下所有文件的状态(git status)查看版本库中的提交记录(git log)恢复的文件…

【精选】OpenCV多视角摄像头融合的目标检测系统:全面部署指南&源代码

1.研究背景与意义 随着计算机视觉和图像处理技术的快速发展,人们对于多摄像头拼接行人检测系统的需求日益增加。这种系统可以利用多个摄像头的视角,实时监测和跟踪行人的活动,为公共安全、交通管理、视频监控等领域提供重要的支持和帮助。 …

Linux程序之可变参数选项那些事!

一、linux应用程序如何接收参数? 1. argc、argv Linux应用程序执行时,我们往往通过命令行带入参数给程序,比如 ls /dev/ -l 其中参数 /dev/ 、-l都是作为参数传递给命令 ls 应用程序又是如何接收这些参数的? 通常应用程序都…

C++之常用的排序算法

C之常用的排序算法 sort #include<iostream> using namespace std; #include<vector> #include<algorithm> #include<functional> void Myptint(int val) {cout << val << " "; }void test() {vector<int> v;v.push_back(…

一文搞懂什么是 GNU/Linux 操作系统

Author&#xff1a;rab 目录 前言一、UNIX二、Linux三、GNU 前言 你是否经常看见或听说过这么一句话&#xff1a;这是一个类 Unix 的 GNU/Linux 操作系统&#xff0c;你是怎么理解这句话的呢&#xff1f;想要搞懂这句话的含义&#xff0c;你需要了解以下三点基本常识。 一、U…

安装向量数据库milvus及其Attu

前置条件安装docker compose 在宿主机上创建文件目录 mkdir -p /home/sunyuhua/milvus/db mkdir -p /home/sunyuhua/milvus/conf mkdir -p /home/sunyuhua/milvus/etcd下载docker-compose.yml wget https://github.com/milvus-io/milvus/releases/download/v2.2.11/milvus-s…

ChatGPT暂时停止开通plus,可能迎来封号高峰期

前言: 前两日,chat gpt的创始人 San Altman在网上发表了,由于注册的使用量超过了他们的承受能力,为了确保每个人的良好使用体验,chat gpt将暂时停止开通gpt plus。 情况: 前段时间好像出现了官网崩溃的情况,就连api key都受到了影响,所以现在就开始了暂时停止plus的注…

源码安装Apache

一、下载Apache,源码安装Apache #下载 [rootlocalhost opt]# wget -c https://mirrors.aliyun.com/apache/httpd/httpd-2.4.58.tar.gz [rootlocalhost opt]# ls httpd-2.4.58.tar.gz [rootlocalhost opt]# tar -xf httpd-2.4.58.tar.gz [rootlocalhost opt]# ls httpd-2.4.58…

MATLAB | 官方举办的动图绘制大赛 | 第二周赛情回顾

今天带来一下MATHWORKS官方举办的迷你黑客大赛第三期(MATLAB Flipbook Mini Hack)的最新进展&#xff01;&#xff01;目前比赛已经进行了两周非常荣幸能够成为第一周的阶段性获奖者&#xff1a; 本来并不打算每周进行一次赛况讲解&#xff0c;但是由于字符限制改成了2000&…

px4+vio实现无人机室内定位

文章主要讲述px4 如何利用vins_fusion里程计数据实现在室内定位功能。 文章基于以下软、硬件展开。 硬件软件机载电脑&#xff1a; Intel NUC系统&#xff1a;Ubuntu 20.04相机&#xff1a; Intel Realsense D435iros&#xff1a;noetic飞控&#xff1a;Pixhawk 2.4.8固件&am…

HarmonyOS ArkTS 基础组件的使用(四)

1 组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1a;…

浅谈Python装饰器原理与用法分析

前言 本文实例讲述了Python装饰器原理与用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 1、装饰器的本质是函数&#xff0c;主要用来装饰其他函数&#xff0c;也就是为其他函数添加附加功能 2、装饰器的原则: (1) 装饰器不能修改被装饰的函数的源代码 (2) 装…