【架构艺术】Go语言微服务monorepo的代码架构设计

ops/2025/3/14 18:12:22/

近期因为项目架构升级原因,笔者着手调研一些go项目monorepo的代码架构设计,目标是长期把既有微服务项目重要的部分都转移到monorepo上面,让代码更容易维护,协作开发更加方便。虽然经验不多,但既然有了初步的调研,今天就分享一下笔者所面临场景的monorepo设计思路。

从语言特性上讲,Golang是非常适合做monorepo的,但根据不同项目研发需要,monorepo的目录结构可以定制成不同的形式。所以要做monorepo,首先要回答的问题是,做这个事情主要解决什么研发问题,优化了什么东西,否则投入量过多,ROI就会很低。

笔者所处的团队偏向于中台角色,每个同学都负责一个专项,不同专项之间可能共享很多三方能力的实现,并且团队距离业务比较近,研发更注重短平快,所以既往的代码实现质量方面,并不是非常完美。从这个角度来看,如果用monorepo做代码架构升级,主要能解决的问题,一是更精简的代码和模块化抽象,二是减少三方能力的冗余实现,三是通过一套研发实践规范代码管理,这样就能够在保证代码易扩展和模块易兼容的基础上,各个成员能够尽可能自由发挥,代码质量也不会轻易下降,这样长期就能让整个团队的技术迭代更加效率,服务实现的稳定性会更高。

然后就是整个代码架构长什么样子。笔者的项目,大概是这样设计:

- app:所有服务各自的代码- ${service_group}:按架构划分的服务组(模块)- ${service_name}:单个服务的代码(http/rpc等)- biz:业务逻辑- handler- middleware- service- conf:静态配置- main.go- build.sh:每个服务的编译
- lib:所有服务公有的代码- client:三方能力的client实现- common:枚举定义- model:数据结构(from idl)- dal:数据访问(gorm自动生成)- util:工具函数
- idl:协议
- script:脚本(编译/本地开发)
- Makefile
- go.mod
- go.sum
- README.md

由于很多服务需要共享数据结构,所以在设计上,idl、model做了单独提出,被所有服务可以引用。开发约定上,通过在script、Makefile做一些脚本,就可以自动指定某服务创建/更新项目代码,也可以随时自动生成/更新协议结构和gorm定义。

通过这样一个架构,首先代码精简和三方能力抽象都可以解决。然后,由于各类脚本的存在,每个业务专项的研发同学就不需要把过多精力关注在代码底层架构上,可以快速适应整个项目开发。就算长期有需要单独提出的能力,代码也可以很容易迁移到lib模块。这样整体上看,整个团队的代码质量在未来都能够有质的提升。

当然,从现状来看,这个项目结构未来可能会遇到的问题是,如果存量大服务的研发过程要迁移到这个monorepo,可能会踩什么坑,比如go-mod要处理兼容性问题,服务编译部署配置需要重新调整,研发脚本需要做额外的兼容,很多模块需要未来打散挪到lib等等。

上述这些基本上是小问题,大的问题是怎么在迁移项目的过程中,不影响既有的业务迭代。排除需要周末加班的的情况,笔者认为一个合理的解决方法是,在迁移前抽一些时间间隙,先找一些小的存量项目去做试点迁移,踩坑,整理最佳实践,然后再尝试迁移大项目,这样就不至于一下迁移遇到问题就阻塞很多。迁移的话,也是先把所有代码挪到app,保证编译部署是通的,然后在这个基础上再做代码重构和打散,把重要的公有能力给提取出来,去让代码逐渐演变成理想的形态。


http://www.ppmy.cn/ops/165729.html

相关文章

CSS3 用户界面设计指南

CSS3 用户界面设计指南 引言 随着互联网的快速发展,用户界面设计已经成为网站和应用程序吸引和留住用户的关键因素之一。CSS3,作为Web开发中的核心技术之一,提供了丰富的工具和特性来改善用户界面。本文将深入探讨CSS3在用户界面设计中的应用,包括基本概念、常用技巧以及…

得物 Android Crash 治理实践

一、前言 通过修复历史遗留的Crash漏报问题(包括端侧SDK采集的兼容性优化及Crash平台的数据消费机制完善),得物Android端的Crash监控体系得到显著增强,使得历史Crash数据的完整捕获能力得到系统性改善,相应Crash指标也…

引入其他 YML 配置源 —— Spring Boot 中的 `import` 功能

文章目录 引入其他 YML 配置源 —— Spring Boot 中的 import 功能引言1. 为什么需要引入其他 YML 配置文件?2. Spring Boot 如何引入其他 YML 配置文件?2.1 基本语法2.2 支持多文件引入2.3 使用外部配置文件 3. 使用 import 功能的优势3.1 配置文件的模…

Python第二十课:生成对抗网络 | AI创造力觉醒

🎯 本节目标 理解生成器与判别器的博弈论原理掌握DCGAN与StyleGAN的核心架构差异实现AI绘画系统生成二次元角色学习梯度惩罚与谱归一化等稳定技巧探索GAN在艺术创作中的伦理边界一、GAN基础理论(艺术赝品对决) 1. 双角色博弈模型 角色职责生活比喻生成器(G)制造逼真数据天…

走进Java:类和对象的初步理解

一、类和对象的引出 对于Java初学者来说,类和对象是一个有些不太好理解的知识点,在学习类和对象之前,会接触到Java中的八大基本数据类型。 数据类型分类数据类型名称关键字占用字节数取值范围整数类型字节型byte1 字节-128 到 127短整型sho…

若依-导出后端解析

针对若依框架微服务版本学习 若依导入导出功能的具体使用详见:后台手册 | RuoYi 1.导出逻辑: 导出文件的逻辑是先创建一个临时文件,等待前端请求下载结束后马上删除这个临时文件。但是有些下载插件,例如迅雷(他们是二…

奥威BI多数据源融合分析

在当今数字化时代,企业数据如同宝藏,而如何有效挖掘并利用这些宝藏,则成为了每个企业都必须面对的挑战。BI(商业智能)数据可视化分析正是解决这一挑战的关键技术之一。在众多BI数据可视化工具中,奥威BI以其…

Python 数据可视化

Python 提供了多种强大的库用于数据可视化,常用的库包括 Matplotlib、Seaborn、Plotly、Pandas 和 Bokeh 等。以下是这些库的简介和一些常见的数据可视化示例。 1. Matplotlib Matplotlib 是 Python 中最常用的绘图库,提供了类似 MATLAB 的绘图接口。 …