Golang项目代码组织架构实践

比特流光鹤
• 阅读 176
Golang在项目结构上没有强制性规范,虽然这给了开发者很大的自由度,但也需要自己沉淀一套可行的架构。本文介绍了一种项目布局,可以以此为参考设计适合自己的 Golang 项目组织模式。原文: Golang Project Layout

Go 有很多强制的或是约定俗成的规范,但在项目架构方面,就只能靠自己了!对我来说,这很令人困惑,但我们需要的只是一个有效且可以重复使用的架构。下面将展示我是怎么做的,也许你会采用不同的方法,都没有关系。Go 项目的架构有很多,但我最喜欢这个架构,并且已经用它构建了很多东西:)

布局

这是正在进行的一个个人项目的根(root)布局:

Golang项目代码组织架构实践

/.github/workflows

Golang项目代码组织架构实践

如果有人感兴趣,我很乐意分享这些工作流代码。这三个文件可以确保我的 PR 自动运行测试,并确保合并到 main 分支的版本会被容器化并推送到容器仓库。目前我都是手动部署修改,所以这些就是所需的全部工作。

/api

Golang项目代码组织架构实践

很抱歉我隐藏了一些内容,但重点应该很明确,此文件用于 api 接口。这是 http API,所有端点都定义在这个文件夹中,并通过其他文件夹中的代码来提供响应。我在这里定义了中间件,支持结构化日志、跟踪和度量。

/cmd/server

Golang项目代码组织架构实践

这是应用程序启动的位置,是服务的 main 方法。所有路由、逻辑和服务器启动代码都放在 server.go 文件中,而且将中间件与路由结合起来。这篇文章不会涉及这些文件的实际内容,这篇文章更关注项目布局,而不是如何实现的具体细节。

/decks

Golang项目代码组织架构实践

decks 目录用于存放打算从 postgres 中存储和检索的模型或数据。该目录包含数据库模型 deck.go、仓库和测试(container_test.go 用于测试)。测试是通过一个名为 testcontainers 的库在 docker 上运行。

/groups

Golang项目代码组织架构实践

该目录与 /decks 目录非常相似。怎么说呢,我喜欢简单易复制的开发模式。这个文件夹涵盖了项目中的群组概念。你会看到两个仓库,虽然这看起来像是混淆了文件夹(folder)和群组(group)的概念,但我向你保证,我对这种设置很满意,而且很有效。这些都是 postgres,而且我是在 docker 容器上进行测试的--测试只需要 3 秒钟,所以虽然比简单的单元测试慢一些,但几乎和典型的"集成测试"一样快。

/mocks

这个文件夹是由 https://github.com/vektra/mockery 生成的,它从项目中获取接口并自动生成一些桩,可以在测试中使用这些桩。我知道有些人看了会想吐,但这让测试变得简单明了。

/pkg/tools

Golang项目代码组织架构实践

这个模块提供了几个助手工具,可以测试一些副作用更大的东西。在我的测试中,控制生成的时间和 uuid 对测试很有帮助,因此这个包创建了一个接口和实现,可以在任何地方使用,并在测试中模拟。有些人觉得不应该有 utilstools 模块,但我不在乎。

/seed

其中包含一些用于本地测试的 sql 脚本:)

/users

Golang项目代码组织架构实践

看起来很熟悉吧?编程其实并不难......好吧,你看到的服务并没有复杂的代码,但我向你保证,这种架构远远超出了简单的项目。这是另一个用于存储和检索用户的存储库。

结语

你会发现这个项目中缺少服务逻辑,目前我还没有发现有必要分离业务逻辑,所以没有专门的文件。我曾在生产服务和个人项目中使用这种架构,它用途广泛且简单,基本上任何项目都可以重复使用,而且可以避免大多数常见的陷阱(如循环依赖关系),你试一下就知道了。


你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

本文由mdnice多平台发布

点赞
收藏
评论区
推荐文章
CuterCorley CuterCorley
4年前
uni-app入门教程(1)uni-app简介、部署和目录结构
@toc前言本文主要介绍了uniapp的基本情况,并引导快速创建和运行第一个uniapp项目,同时对项目的目录结构和代码规范进行详细说明,适合uniapp零基础初学者。一、uniapp介绍uniapp是DCloud官方推出的重要产品,是一个使用Vue.js开发跨平台应用的前端框架,官网是。开发者通过编写一套Vue.js代码,即可
科工人 科工人
4年前
聊聊golang的DDD项目结构
序本文主要研究一下golang的DDD项目结构interfacesfoodappserver/interfacesinterfacesgit:(master)tree.|____fileupload||____fileformat.go||____fileupload.go|____food_handler.go|__
一种面向后端的微服务低代码平台架构设计
近期参加公司组织的极客中餐厅训练营,我们所在的小组接到的课题是微服务的低代码平台架构设计。目标是:结合京东业务研发实际情况,针对后端研发人员,设计一个微服务低代码平台,助力更高效低交付业务需求。现已结业,将我在本次项目中沉淀设计出的设计文档整理成文,期待与大家有进一步的碰撞沟通
微前端项目部署方案
本文旨在通过部署微前端项目的实践过程中沉淀出一套部署方案,针对项目分别部署在不同的服务器上的场景,就一些重点步骤、碰到的问题做了一些总结。
kenx kenx
2年前
SpringBoot定义优雅全局统一Restful API 响应框架
假如现在有一个Java项目,老板让你做项目组长,定义项目基础框架,系统技术架构选型,你应该如何设计一个规范的统一的RestfulAPI响应框架呢思考目前项目开发,都是基于前后端分离模式开发的,基于后端模板引擎那一套,可能已经不适用一些项目开发流程,和当下开
艾木酱 艾木酱
3年前
Golang使用gopg访问MemFireDB数据库
本篇介绍如何使用Golang访问MemFireDB数据库。如果大家有个人项目或者公司内部测试项目,推荐大家尝试MemFireCloud,不用自己搭建数据库,在家或者公司随时可以访问。gopg是Golang中最常用的访问数据库的ORM库,MemFireDB兼容Postgres接口,所以可以直接把MemFireDB当Postgres使用。在memfiredb
Stella981 Stella981
3年前
Golang的项目目录结构
1.简单型的项目目录结构如果我们只是开发一个小应用或者做一些简单的测试,那么完全没有必要根据官方的建议建立各种目录,只需要要一个文件夹中放置我们的源码文件,然后直接运行gobuild就可以,例如:gobuildhello.go然后编译器就会在当前目录下面生成一个hello.exe文件。我们
Wesley13 Wesley13
3年前
#分布式系统架构之# 事件驱动模式以及与之匹配的长时间处理过程讨论
     在分布式系统下,可以很多种架构从事设计,或者分布式系统对技术架构本身没有做严格的限制。但是结合自己的实践以及基于《领域驱动设计》的推荐,采用【事件驱动模式】是比较好的一种分布式系统架构方式。该模式充分实现了不同系统之间的代码解耦,所有的业务流转是通过事件广播进行驱动的。所有业务都是在针对名为【事件总线】的组件在编程,也无需知道事件的生产者
项目开展CICD的实践探路 | 京东物流技术团队
本文介绍了作者对CICD的理解以及在项目中开展CICD的几种场景,总结了每种场景实践的关键节点、带来的收益,以及结合具体项目开展的实际应用。读者可以借鉴本文中描述的场景,或借鉴文中提到的实践方式,在项目中开展CICD,为项目在持续集成部署上做具体的支撑。
芝士年糕 芝士年糕
2年前
windows安装minio
一、概述最近在学习使用minio,在这里对自己的学习过程做一个记录和总结,方便自己查阅。Minio是GlusterFS创始人之一AnandBabuPeriasamy发布新的开源项目。Minio兼容Amason的S3分布式对象存储项目,采用Golang实现,客户端支持Java、Python、Javacript、Golang语言。Minio可以做为云存储的
【实践篇】DDD脚手架及编码规范 | 京东云技术团队
我们团队一直在持续推进业务系统的体系化治理工作,在这个过程中我们沉淀了自己的DDD脚手架项目。本文主要是梳理和总结了DDD脚手架使用中的编码规范以及遇到的问题。