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

缘起

个人博客网址

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

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

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

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

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

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

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

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

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

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

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

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

  8. 项目布局:遵循golangstandards/projectlayout设计是一个很好的实践这个布局项目分为多个模块,如cmdpkgapiwebscripts等,每个模块都有其特定的职责,这样可以使得项目结构清晰,易于理解和维护。

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

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

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

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

  1. GitHub项目
  2. 文章
  3. 书籍
  4. 博客社区

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

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

2.1 MVC模型

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

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

2.1 DDD微服务模块

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

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

三、基于golangstandards/projectlayout设计进行实战

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

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

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

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

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

原文地址:https://blog.csdn.net/u013457167/article/details/134492440

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_30786.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注