Skip to main content

Command Palette

Search for a command to run...

再看Monorepo

Published
1 min read

What is Monorepo

由于谷歌在 Monorepo 上的实践,Monorepo 受到了越来越多的关注。Monorepo 意味着把所有项目的所有代码统一维护在一个单一的代码版本库中,和多代码库方案相比,两者各有优劣,需要根据公司文化和产品特性进行取舍

记得两年前还在某W司的时候,当时我设计了一套基于prometheus的监控平台,这套平台是微服务架构,当时作为微服务门徒的我跟同事在服务划分上产生了分歧:是一个repo一个服务,还是将不相关的两个服务放在一个repo里面?当然,我支持前者,那位同事支持后者,彼时我并没有说服对方,还觉着很沮丧,不过服务是由那位同事编写,我也没有过多地坚持自己的意见。记得当天我将这件事当作牢骚发在微博上,有一个朋友就留言道:这没什么啊,谷歌也是这么干的啊……我惊了,谷歌会这样?不相信也不接受,直到最近因为工作原因,开始接触bazel,好像发现了一个新天地……

我们的现状

我现在的工作是做一个公司的内部服务平台,依然使用我“熟悉”的微服务架构,我对“微”这个字保持着洁癖,以至于一年之后的现在,我负责的微服务多达10几个,由于是内部平台,流量小,清一色部署在k8s上,0.5G+0.5C的配置,短小而精悍,这期间我还开发了一个极简的golang服务脚手架,又引入了golib共享库,加入了对dubbo、gRPC的支持(虽然现在看没有必要)等等,还有metric、log、trace,持续给系统加菜,效果上看,对功能的支撑是没问题的,开发速度也还不错,只有我又发现了几个不大不小的问题

  • client sdk: 平台的微服务间使用http协议进行通信,我引入了swagger,新建了一个client repo, 专门存放通过swag自动生成的client sdk,问题在于,协同开发时,A服务依赖B服务, 所以B服务接口定义好后,生成sdk,更新到client repo,A服务才能继续进行开发,就有人A服务repo、B服务repo、client repo三个代码仓库,有时会出现不一致的情况,小团队人少问题也不是特别明显;
  • golib共享库:会放一些常规代码:日志处理、中间件、共用的数据定义等等,这个库主要我在维护,主要目的是减少重复代码
  • 代码风格:这是一个让我非常头疼的问题,由于一些历史原因,团队的代码格式化做的非常糟糕,更不用提静态检查了,因为没有强制措施的缘故,我甚至当了半年多的“格式化”工程师,我自问并没有代码洁癖,格式化已经是最低要求了
  • 负载:这其实是一个额外的问题,在我之前,团队没人关注这一些,服务无脑申请资源,至少1C+2G,平均负载低的可怜,极大地浪费,在我的强烈敦促下,才减少到0.5G+0.5C,就这样,平均负载50%都不到(我一度怀疑是不是咱们团队写的代码太优秀了)

Monorepo解决的问题

其实真有点讽刺,今年以前,我还是微服务的无脑拥护者,不过抛开那些耳熟能详的高谈阔论,单一代码仓库又确实能解决我的问题,而我们的服务又是微服务的,在我们这样子的小团队,优势还是很明显的

  • 代码风格统一
  • 抽象得当的话,代码复用率会非常高
  • 小团队,代码合并问题不大

因为公司的CI选型是droneci ,且没有任何迹像要引入bazel,所以单一代码仓库对提供构建效率是毫无帮助的。

轮回

如果过往奉k8s、微服务、容器化为圭臬,现如今我也没有得出完全相反的结论,合适的场景,选择适合的技术体系,使团队收益最大化,才是紧要的事情,毕竟,唯一不变的,就是变化。

参考

  • https://en.wikipedia.org/wiki/Monorepo
  • https://xie.infoq.cn/article/4f870ba6a7c8e0fd825295c92
  • https://earthly.dev/blog/golang-monorepo/

More from this blog

2025: 祛魅 灰度 念头通达

今天是2025年的最后一天,当大家都在准备下班的时候,好巧不巧的,我刚好发现了一个不大不小的问题,大胆猜想,小心求证,向上反馈,暴露风险,作为2025年工作注解,实在是再有趣不过了。 今年的工作,从结果上看,还算平稳,至于过程,有太多不可言说的部分。厂里打镙丝的牛马,有工资可拿,理应知足了,至于其它的,与己无关,也没那么重要了。 祛魅 近距离观察大厂,才发现一些违背常识/直觉的事实:路人以为的高大

Feb 28, 20261 min read21

大厂祛魅:破碎的专注力

毁掉一个人最直接的方法,就是毁掉ta的专注力。 这句话的出处已然模糊,但放在大厂环境中,却显得格外深刻。 围城 大厂宛如一座围城。城外的人满怀憧憬,目之所及皆是光鲜;城内的人却如困笼之鸟,翅膀日渐退化,每日挣扎求生。 高大上 不可否认,大厂的硬件设施确实令人艳羡:宽敞的独立园区内,来往穿梭的人群中,几乎人人手握智能设备。这看似现代化的景象背后,却藏着一个无奈的事实:在工作时段,每台电脑都被严密监控,连听音乐都成奢望。于是,工作之余玩手机,成了许多人难得的解压方式。 大厂的品牌效应确实强大。外界对...

Jul 29, 20251 min read138

Black Swan

黑天鹅理论 是指极不可能发生,实际上却又发生的事件 来到大厂打工已经满一个月了,从一开始的手足无措,到逐渐度过不适期,也算是适应了吧。 不适应 刚入职时,不适应的地方还是挺多的。 第一次只使用台式机工作,这就限制了我一天中的绝大部分时间,都必须呆在自己的工位上,好在工位足够大。只是人与人的沟通少了很多,有问题只能在工位上通过 IM 呼对方,有种魔幻又现实的感觉 第一次只能用 Windows,也不能 WSL,这给我的工作效率带来了很大影响,不能用熟悉的软件,就连写代码用的 VSCode 的...

Jan 24, 20251 min read74

2024年: 逐渐平静

这个世界是一面镜子,会把你的感受反射给你 2024 开端: 相由心生 那时,还带着一着愤懑,因为拿到了低绩效,虽然内心知道这是公司经营困难,想让我离开的一种策略,但仍然感受到自己那可笑的自尊受到了践踏。自那之后,非必要不加班,只做份内事,尽可能地不去涉及份外之事。 2024 年中: 与人为善 组里的项目眼见不行了,我被迫去支援 AI 项目,久违地写起了 python,项目接近完成时,意外收到通知:我拿到大礼包了。在这之前,架构师因故裸辞。在我离开之后不到两周,我的 TL 也裸辞了,直到同事告诉...

Jan 9, 20251 min read92

企业软件之殇

殇 动词 未成年而死。 名词 战死者。 笔者经历了两家打着云原生旗号的企业软件/解决方案公司,都是中途加入,项目都以解(失)散(败)告终。 云原生解决方案 NB 公司:一个传统的 IDC 小厂,想着借云原生的热度,进军企业软件市场。 在加入这个项目之前,笔者考取了 CKAD 认证,彼时对 K8s 相当着迷。先简要介绍一下这个项目背景: 基于 Rancher (换皮肤)的二次开发项目,名字叫:HCaaS ,在笔者加入这个团队之前,项目已经开发近两年了,除了 TL 之外,其它人之前都...

Jul 1, 20241 min read103

just for fun

57 posts

I'm a Software Engineer