基于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.mfbz.cn/a/164601.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32CubeMX和keil采用RTC时钟周期唤醒和闹钟实现LED与BEEP周期开关

文章目录 前言1. RTC概念1.1 RTC的时钟信号源1.2 预分频器1.3 实时时钟与日历数据1.4 周期性自动唤醒1.5 可编程闹钟 2. RTC相关中断3. STM32CubeMX配置3.1 时钟配置3.2 引脚配置3.3 RTC配置3.3.1 模式选择3.3.2 RTC基本参数配置3.3 中断配置 4. 代码编写总结 前言 RTC的功能有…

2023最新最全【内网渗透工具】零基础安装教程

1.1 简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网…

js显示隐藏密码框

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>.box{wi…

DE算法简介

文章目录 前言一、DE是什么&#xff1f;二、DE流程2.1 初始化种群2.2 变异&#xff08;差分操作&#xff09;2.3 交叉2.4 选择2.5 重复迭代 三、DE运行结果 前言 这两天看了DE算法&#xff0c;简单说下自己的认识 一、DE是什么&#xff1f; 百科定义&#xff1a;差分进化算…

使用ChatGPT进行数据分析案例——贷款数据分析

目录 数据数据 每一行是一个记录,代表着一笔贷款,每一列是一个特征,一共1万多条数据,最后一列非常重要save_loans是否成功收回

在线代码调试运行微信开放平台官方接口调试校验工具大全

具体前往&#xff1a;在线代码调试&API校验工具大全

c++异常

c异常 1. c异常概念2. 异常的简单使用3. 自定义异常体系4. 异常的规范和安全4.1 异常规范4.2 异常安全 5. C标准库的异常体系和异常的优缺点 1. c异常概念 异常是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时就可以抛出异常&#xff0c;让函数的直接或间…

【GCN】GCN学习笔记一

谱域图卷积 卷积 卷积定义离散空间的卷积 图卷积简介 卷积定理谱域图卷积实现思路如何定义图上的傅里叶变换拉普拉斯矩阵 &#xff08;Laplacian Matrix&#xff09;拉普拉斯矩阵的性质拉普拉斯矩阵的谱分解拉普拉斯矩阵与拉普拉斯算子 图傅里叶变换 图上的信号表示经典傅里叶变…

ubuntu20.04在docker下运行ros-noetic进行开发

经常折腾虚拟机各双系统 &#xff0c; 想着不如把docker利用起来&#xff0c;下面算是一个初学者使用docker运行ros的记录&#xff1a; 1. 安装 使用官方安装脚本自动安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh验证是否安装成功 doc…

力扣 hot100 最长连续序列 哈希去重 双指针

128. 最长连续序列 ⭐ AC code class Solution {public int longestConsecutive(int[] nums) {if (nums.length 0)// 特判为空的数组&#xff0c;返回0return 0; // set实现去重HashSet<Integer> set new HashSet<>();for (int x : nums)set.add(x);Object[] a…

时间序列与 statsmodels:预测所需的基本概念(2)

时间序列与 statsmodels&#xff1a;预测所需的基本概念&#xff08;2&#xff09; 维托米尔约万诺维奇 跟随 出版于 走向发展 4 分钟阅读 2022 年 1 月 31 日 8 一、说明 在使时间序列平稳后&#xff0c;在本博客中我们应用 SARIMAX 预测并进行深入解释。 二、关于平稳性 …

算法设计与分析复习--求解最大子段和问题(分支法、动态规划)

文章目录 问题描述分治法动态规划法 问题描述 最大子段和问题&#xff1b; 洛谷P1115.最大子段和 分治法 利用归并排序的方法&#xff0c;但是由于是算最大子段和所以&#xff0c;并不能将它变成有序的&#xff0c;左边和右边的最大子段和通过调用函数&#xff0c;而中间的要…

SpringCloudAlibaba系列之Nacos服务注册与发现

目录 说明 认识注册中心 Nacos架构图 Nacos服务注册与发现实现原理总览 SpringCloud服务注册规范 服务注册 心跳机制与健康检查 服务发现 主流服务注册中心对比 小小收获 说明 本篇文章主要目的是从头到尾比较粗粒度的分析Nacos作为注册中心的一些实现&#xff0c;很…

「Tech初见」对epoll的理解

一、Motivation 通常&#xff0c;操作系统会为每个进程划分一个时间片的&#xff0c;在这个时间片内进程可以合法占有 cpu 进行一些计算任务。并当时间片结束后自动退回至就绪状态待命&#xff0c;等待下一次的调度 但是&#xff0c;有一种情况会使进程提前&#xff08;时间片…

Web实战:基于Django与Bootstrap的在线计算器

文章目录 写在前面实验目标实验内容1. 创建项目2. 导入框架3. 配置项目前端代码后端代码 4. 运行项目 注意事项写在后面 写在前面 本期内容&#xff1a;基于Django与Bootstrap的在线计算器 实验环境&#xff1a; vscodepython(3.11.4)django(4.2.7)bootstrap(3.4.1)jquery(3…

1、cvpr2024

CVPR2024官网&#xff1a; Overleaf模板&#xff1a; 更改作者&#xff08;去掉CVPR标识&#xff09; % \usepackage{cvpr} % To produce the CAMERA-READY version \usepackage[review]{cvpr} % To produce the REVIEW version改成 \usepackage{cvpr} …

性格懦弱怎么办?如何改变懦弱的性格?

性格懦弱是一个比较常见的话题了&#xff0c;懦弱带来的苦恼和困扰&#xff0c;深深影响着我们的生活&#xff0c;人际关系&#xff0c;以及事业的发展。然后如何摆脱懦弱&#xff0c;却并非易事&#xff0c;尤其是对于成年人来说&#xff0c;这种懦弱的性格特征&#xff0c;已…

Prometheus+Grafana监控

Prometheus是一种开源监控系统&#xff0c;可用于收集指标和统计数据&#xff0c;并提供强大的查询语言&#xff0c;以便分析和可视化这些数据。它被广泛用于云原生和容器化环境中&#xff0c;可以嵌入到Kubernetes集群中&#xff0c;并与其他Kubernetes工具进行集成。 Grafan…

大模型的交互能力

摘要&#xff1a; 基础大模型显示出明显的潜力&#xff0c;可以改变AI系统的开发人员和用户体验&#xff1a;基础模型降低了原型设计和构建AI应用程序的难度阈值&#xff0c;因为它们在适应方面的样本效率&#xff0c;并提高了新用户交互的上限&#xff0c;因为它们的多模式和生…

代码随想录算法训练营|五十六天

回文子串 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; dp含义&#xff1a;表示区间内[i,j]是否有回文子串&#xff0c;有true&#xff0c;没有false。 递推公式&#xff1a;当s[i]和s[j]不相等&#xff0c;false&#xff1b;相等时&#xff0c;情况一&#xff0c;…