基于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代码,用来回答我们文章开头的问题。

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

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

相关文章

7.22 SpringBoot项目实战【收藏 和 取消收藏】

文章目录 前言一、编写控制器二、编写服务层三、Postman测试最后前言 本系统还支持 收藏图书,就是对心仪的书加一下收藏,大家都懂,这是一个很常见的功能。 那么我们来看看怎么来做,先分析一下:【一个人】对【一本书】只需【收藏一次】,但可以【收藏N本】不同的书,收藏…

使用持久卷部署 WordPress 和 MySQL

🗓️实验环境 OS名称Microsoft Windows 11 家庭中文版系统类型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 🖇️创建 kustomization.yaml 你可以通过 kustomization.yaml 中的生成器创建一个 Secret存储密码或密…

如何隐藏Selenium特征实现自动化网页采集

Selenium是一个流行的自动化网页测试工具,可以通过模拟用户在Chrome浏览器中的操作来完成网站的测试。然而,有些网站会检测浏览器是否由Selenium驱动,如果是,就会返回错误的结果或拒绝访问。为了避免这种情况,我们需要…

基于RK3588的8k多屏异显安卓智能网络机顶盒

采用RK3588芯片方案的8K网络机顶盒,搭载纯净的安卓12操作系统,支持Ubuntu和Debian系统容拓展。主要面向外贸市场。此款机顶盒自带两个HDMI输出接口,一个HDMI输入接口,内置双频WiFi6无线模块,支持千兆以太网和USB接口。…

7个最佳开源免费库存/仓库管理系统(WMS)

库存/仓库管理软件是一种用于帮助企业管理库存、仓储位置和交付过程的软件系统。这种类型的软件对于拥有大量库存和多个仓库的企业非常有用。 库存/仓库管理软件的作用包括以下几个方面: (1)减少库存节约成本 通过跟踪库存水平和存储位置&…

快速修改ppt | 显得不单调

做完ppt,怎样不显得单调 ----> 加个 主题,首页 改下 字体(如 华文行楷,96,字体颜色)

庖丁解牛:NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片

文章目录 Pre概述缓冲区分配和包装 (allocate 、 wrap)缓冲区分片 (slice)缓冲区份片和数据共享只读缓冲区 (asReadOnlyBuffer)直接和间接缓冲区内存映射文件 I/O将文件映射到内存 Pre 庖丁解牛:NIO核心概念与机制详解…

vscode快捷键使用总结

) 1、格式化选中的代码 1、格式化选中的代码 vscode中选中所要格式化的代码: ctrl k,ctrlf 其实可以查到该命令 ctrlshiftp打开命令窗口输入format

lambda表达式c++

介绍 可调用对象 对于一个表达式,如果可以对其使用调用运算符(),则称它为可调用对象。如函数就是一个可调用对象,当我们定义了一个函数f(int)时,我们可以通过f(5)来调用它。 可调用对象有: …

漫谈广告机制设计 | 万剑归宗:聊聊广告机制设计与收入提升的秘密(3)

​书接上文漫谈广告机制设计 | 万剑归宗:聊聊广告机制设计与收入提升的秘密(2),我们聊到囚徒困境是完全信息静态博弈,参与人存在占优策略,最终达到占优均衡,并且是对称占优均衡。接下来我们继续…

95. 最长公共子序列

题目 题解 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:# 定义状态:dp[i][j]表示s1[0:i]和s2[0:j]的最长公共子序列dp [[0 for j in range(len(text2)1)] for i in range(len(text1) 1)]# badcase: dp[i][0] 0, dp[0…

警惕.360勒索病毒,您需要知道的预防和恢复方法。

引言: 网络威胁的演变无常,.360勒索病毒作为一种新兴的勒索软件,以其狡猾性备受关注。本文将深入介绍.360勒索病毒的特点,提供解决方案以恢复被其加密的数据,并分享一系列强化网络安全的预防措施。如果您在面对被勒索…