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

基于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

相关文章:

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

基于go标准分层架构项目设计实现 缘起 个人博客网址 最近主要看了两方面知识,一方面是技术相关的,如何设计一个比较好的后端架构项目代码;一方面是非技术相关的,如何写一篇好的技术文章,能够让他人读懂并有收获。因…...

原理Redis-IntSet

IntSet IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。 结构如下: typedef struct intset {uint32_t encoding; /* 编码方式,支持存放16位、32位、64位整数*/uint32_t length; /* 元素…...

逸学java【初级菜鸟篇】9.3 Stream流

hi,我是逸尘,一起学java吧 得益于Lambda所带来的函数式编程,引入了一个全新的Stream流概念(就是都基本使用lambda的形式)。 流处理 我们首先理解什么是流处理,它类似于sql语句,可以执行非常复…...

html页面直接使用elementui Plus时间线 + vue3

直接上效果图 案例源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"../js/vue3.3.8/vue.global.js"></script><link rel"styles…...

信息压缩模型在自然语言处理中的应用和探讨

信息压缩模型在自然语言处理中的应用和探讨 摘要:正文:结论:附录:摘要: 随着人工智能和深度学习的发展,自然语言处理(NLP)在信息处理中的角色变得越来越重要。然而,海量的自然语言数据为信息处理带来了挑战——更多的信息通常意味着更高的处理成本,并可能导致效率降低。为…...

新版mmdetection3d将3D bbox绘制到图像

环境信息 使用 python mmdet3d/utils/collect_env.py收集环境信息 sys.platform: linux Python: 3.7.12 | packaged by conda-forge | (default, Oct 26 2021, 06:08:21) [GCC 9.4.0] CUDA available: True numpy_random_seed: 2147483648 GPU 0,1: NVIDIA GeForce RTX 3090 …...

合伙人注册即得/创业平台扶持!

问心一语持续体验中~ 与公司签订线下&#xff08;线上&#xff09;纸质合伙人代理合同&#xff0c;具备法律效力。 一级直推、非一级直推注册即得奖励。(消耗完毕被邀请用户赠送的AI免费使用条数) 即&#xff1a;邀请1人注册即得并消耗&#xff01;只需注册无需充值&#xff…...

02_使用API_String

StringBuilder StringBuilder 代表可变字符串对象&#xff0c;相对于是一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的好处&#xff1a;StringBuilder 比 String 更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;代码也会更简…...

Spring IOC/DI和MVC及若依对应介绍

文章目录 一、Spring IOC、DI注解1.介绍2.使用 二、Spring MVC注解1.介绍2.使用 一、Spring IOC、DI注解 1.介绍 什么是Spring IOC/DI&#xff1f; IOC(Inversion of Control&#xff1a;控制反转)是面向对象编程中的一种设计原则。其中最常见的方式叫做依赖注入&#xff08;…...

python的多层嵌套循环时,break可以退出多层循环吗?

在Python中&#xff0c;break 语句只能退出当前所在的循环&#xff0c;无法直接退出多层嵌套的循环。但是&#xff0c;你可以通过使用一个标志变量或者通过使用异常来模拟退出多层循环的效果。 使用标志变量&#xff1a; flag False for i in range(5):for j in range(5):if…...

链表OJ--上

文章目录 前言一、反转链表二、移除链表元素三、链表中倒数第K个结点四、相交链表五、链表的中间结点 前言 一、反转链表 力扣206&#xff1a;反转链表- - -点击此处传送 思路图&#xff1a; 方法一&#xff1a;改变指向 方法二&#xff1a; 代码&#xff1a; //方法一 /…...

内衣洗衣机哪些品牌质量好实惠?小型洗衣机全自动

现在洗内衣内裤也是一件较麻烦的事情了&#xff0c;在清洗过程中还要用热水杀菌&#xff0c;还要确保洗衣液是否有冲洗干净&#xff0c;还要防止细菌的滋生等等&#xff0c;所以入手一款小型的烘洗全套的内衣洗衣机是非常有必要的&#xff0c;专门的内衣洗衣机可以最大程度减少…...

推荐一款适合做智慧旅游的前端模板

目录 前言 一、功能介绍 二、前端技术介绍 三、功能及界面设计介绍 1、数据概览 2、车辆监控 3、地图界面 4、其它功能 四、扩展说明 总结 前言 智慧旅游是一种全新的旅游业务模式&#xff0c;它充分利用先进的信息技术&#xff0c;提升旅游体验&#xff0c;优化旅游管…...

VL06O报表添加增强字段

业务描述 用户需要在VL06O事务代码下进行批量交货过账&#xff0c;现有的筛选条件不太适用当前公司的业务&#xff0c;需要在报表中新增三个交货单增强字段&#xff0c;方便其筛选&#xff08;选择屏幕没有加&#xff0c;用户在报表里用标准按钮功能自己筛选&#xff09; 效果…...

SpringBoot Admin

前言 Spring Boot Admin 是一个管理和监控 Spring Boot 应用程序的开源项目&#xff0c;它提供了一个简洁的 Web 界面来监控 Spring Boot 应用程序的状态和各种运行时指标。Spring Boot Admin 可以帮助开发者快速了解应用程序的状态&#xff0c;并快速定位错误或性能问题。下面…...

Java基础-----正则表达式

文章目录 1.简介2.目的3.学习网站4.常用匹配字符5.String类中用到正则表达式的方法 1.简介 又叫做规则表达式。是一种文本模式&#xff0c;包括普通字符和特殊字符&#xff08;元字符&#xff09;。正则使用单个字符来描述、匹配一系列某个句法规则的字符串&#xff0c;通常用…...

基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】

目录 一、前言 二、源码分析 三、负载均衡策略 一、前言 如下图&#xff0c;我们在 orderserver 中通过 restTemplate 向 usersever 发起 http 请求&#xff0c;在服务拉取的时候&#xff0c;主机名 localhost 是用服务名 userserver 代替的&#xff0c;那么该 url 是一个可…...

如何用CHAT解释文章含义?

问CHAT&#xff1a;解释“ 本身乐善好施&#xff0c;令名远近共钦&#xff0c;待等二十左右&#xff0c;定有高亲可攀&#xff1b;而且四德俱备&#xff0c;帮夫之缘亦有。主持家事不紊&#xff0c;上下亦无闲言。但四十交进&#xff0c;家内谨防口舌&#xff0c;须安家堂&…...

创作4周年

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言机…...

《opencv实用探索·一》QT+opencv实现图片拼接和Mat转QImage

本文利用opencv实现了几个好用的功能&#xff0c;包含两个文件&#xff0c;如下&#xff1a; 源码放在文章末尾 imageProcessing类包含三个功能&#xff1a; 1、图像拼接 cv::Mat imageMosaic(cv::Mat mat1, cv::Mat mat2, MosaicMode mosaicMode);mat1和mat2为两个待拼接的…...

别再手动复制了!一个Python脚本自动整理500篇论文,支持Zotero导入

一、引言 作为一名科研工作者,我相信你一定有过这样的经历:为了写一篇综述,需要在知网、万方、arXiv等多个平台搜索上百篇论文,然后手动复制粘贴标题、作者、摘要、关键词,再整理到Excel里。有时候一篇论文就要花好几分钟,几百篇下来,大半天时间就没了。更崩溃的是,手…...

Sunshine游戏串流5步掌握:如何实现跨设备游戏自由?

Sunshine游戏串流5步掌握&#xff1a;如何实现跨设备游戏自由&#xff1f; 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾经梦想过在平板上畅玩PC上的3A大作&#xff1f;…...

别只看单价了!聊聊大模型API定价背后的那些‘小心思’:从OpenAI到国内厂商

解码大模型API定价策略&#xff1a;商业逻辑与技术成本的博弈艺术 当ChatGPT的API调用费用从每千token 0.06美元降至0.03美元时&#xff0c;整个行业都在思考同一个问题&#xff1a;价格战真的要来了吗&#xff1f;但如果你只关注数字本身&#xff0c;可能会错过这场"百模…...

保姆级教程:在Ubuntu22.04上5分钟跑通YOLOv8的5大任务(目标检测/分割/分类/姿态估计/跟踪)

5分钟玩转YOLOv8&#xff1a;Ubuntu22.04下的全任务实战指南 在计算机视觉领域&#xff0c;YOLOv8以其惊人的速度和精度重新定义了实时目标检测的标准。但对于刚接触这个强大工具的新手来说&#xff0c;如何快速验证其多任务能力往往成为第一道门槛。本文将带你用最简洁的命令行…...

5分钟掌握网盘直链下载助手:八大网盘满速下载终极指南

5分钟掌握网盘直链下载助手&#xff1a;八大网盘满速下载终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...

从毫米波到Sub-6G:实测对比不同5G频段下,波束管理策略的实战差异与优化要点

毫米波与Sub-6G频段下的5G波束管理实战指南&#xff1a;从原理到参数调优 当我们在东京银座的十字路口测试毫米波基站时&#xff0c;一个有趣的现象出现了&#xff1a;用户设备在移动过程中频繁触发波束恢复流程&#xff0c;而同一位置的Sub-6G设备却保持稳定连接。这个现象揭示…...

别再死磕源码了!用Live555 MediaServer快速搭建你的第一个RTSP流媒体服务(Windows/Linux保姆级教程)

别再死磕源码了&#xff01;用Live555 MediaServer快速搭建你的第一个RTSP流媒体服务&#xff08;Windows/Linux保姆级教程&#xff09; 流媒体技术正逐渐渗透到视频监控、在线教育、视频会议等各个领域&#xff0c;而RTSP&#xff08;Real Time Streaming Protocol&#xff09…...

115网盘Kodi插件终极指南:轻松实现云端高清视频播放

115网盘Kodi插件终极指南&#xff1a;轻松实现云端高清视频播放 【免费下载链接】115proxy-for-kodi 115原码播放服务Kodi插件 项目地址: https://gitcode.com/gh_mirrors/11/115proxy-for-kodi 还在为本地存储空间不足而烦恼吗&#xff1f;想要在Kodi中直接播放115网盘…...

从“黑盒”到“白盒”:给Keil FLM文件做一次“体检”,排查下载失败难题

从“黑盒”到“白盒”&#xff1a;给Keil FLM文件做一次“体检”&#xff0c;排查下载失败难题 当你熬夜调试嵌入式系统&#xff0c;Keil突然弹出"Flash Download failed"的红色警告&#xff0c;那种感觉就像在马拉松终点线前被绊倒。FLM文件作为Keil与Flash芯片之间…...

Linux 0.11 源码探秘:setup.s 里那些 BIOS 中断调用,到底在给内核准备什么‘见面礼’?

Linux 0.11 启动探案录&#xff1a;BIOS 中断如何为内核铺路 当按下电源键的那一刻&#xff0c;一台 x86 计算机的启动过程就像一场精心策划的接力赛。BIOS 完成自检后&#xff0c;将接力棒交给 bootsect.s&#xff0c;再由 setup.s 接手——这个不到 512 字节的汇编程序&#…...