骚年快答 | 为何微服务项目都使用单体代码仓库?
【答疑解惑】| 作者 / Edison Zhou
这是恰童鞋骚年的第265篇原创内容
之前在学习微软的示例eShopOnContainers时发现它使用的是单体代码仓库库,之后又发现大家在进行微服务项目开发时也都在使用单体代码仓库。问题来了,为啥要微服务项目都要使用单体仓库(所有微服务都在一个代码仓库)呢?
1微服务应用的代码仓库组织
我们都知道,微服务应用相对于单体应用来说,最大的好处就是可以独立开发、测试、部署和扩展。单体应用一般会采用单体代码仓库,但是微服务应用的代码仓库应该如何组织呢?是每个微服务一个仓库吗?
其实不一定,针对微服务应用的代码仓库组织,业界有两种主要的实践:
(1)多体仓库(Multi-Repo):即每个微服务对应各自代码仓库
(2)单体仓库(Mono-Repo):即所有微服务对应一个代码仓库
下图展示了这两种实践的示意(引用自波波老师《Spring Boot与K8s云原生应用开发》课程):
单体应用仓库 vs 微服务多体仓库 vs 微服务单体仓库
2多体仓库与单体仓库的比较
多体仓库的优点显而易见,职责单一,代码量和复杂性受控,支持多个团队独立开发,边界清晰。单个微服务也易于独立开发测试和扩展,不需要集中式管理。差不多,这些就是微服务带来的好处。
但是,多体仓库有其自己的缺点:
一来项目代码不容易形成统一规范,每个团队各自为政,随意引入依赖,Code Review无法集中开展,代码风格也会各不相同。
二来项目整体集成和部署会比较麻烦,虽然单个项目集成容易,但是整体进行集成就会收到仓库分散带来的困难。
三来也是我个人认为对于中小技术团队来说最为重要的,开发人员会缺乏对于整体项目的认知,只关心自己负责的那一小块,从而缺失对整体架构和业务目标整体性的理解。
最后,项目间可能会存在较多的冗余代码,每个微服务一个仓库会造成每个团队不断地重复造轮子,而不是去优先重用其他团队开发的已有的项目代码。
对于多体仓库的缺点,单体仓库解决了一些,这也就形成了单体仓库的好处:
一来易于规范化项目代码,所有微服务都在一个仓库中,可以规范代码风格,便于集中组织Code Review。
二来易于整体集成和部署,所有微服务都在一个仓库中,配合DevOps工具可以方便地实现一键构建和部署,实现持续集成。
三来易于理解项目整体,开发人员可以将整个项目clone到本地IDE中进行Code Review也可以直接本地部署和调试从而易于掌握整体技术架构和应用目标。
最后易于重用已有轮子,开发人员在开发时容易发现和重用已有的代码而不是去重复造轮子,当然也利于对现有的代码进行重构。
当然,万物都是有利有弊,单体仓库也不例外。随着业务的快速发展,单体仓库中的项目代码会变得越来越庞大,复杂性也会随之上升。因此,对于企业来说,需要有专门的集成团队和自动化的集成工具来支持,才能保证单体仓库的持久应用。
3业界都有哪些企业谁在用单体仓库?
在业界使用单体仓库组织微服务项目的企业不少,例如Google、Facebook、Twitter和Salesforce以及Microsoft等互联网巨头,虽然他们内部的项目庞大,开发人员众多,但是他们还是选择了使用单体仓库。
谁在用MonoRepo
eShopOnContainers项目代码结构
刚刚我们也说道,这些巨头企业都是有专门的集成团队和成熟的自动化集成工具来为开发团队进行支持,使得开发团队可以一键构建和部署。
画外音:对小企业来说,可能上微服务架构都得慎重?一百个读者,有一百个哈姆雷特,各有各的看法。
4小结
对于中小企业/初创企业/进行数字化转型的传统行业企业来说,如果要上微服务架构,一般早期微服务的数量不会特别多,采用单体仓库会比较合适。
从本文也可以了解到,微服务架构并不是倡导所有的东西都要独立自治,像代码仓库就可以集中管理,而且这也是业界的最佳实践之一。
最后,如果你在使用.NET Core开发微服务或者计划使用.NET Core开发微服务,都可以先阅读一下这本《.NET微服务:容器化应用架构指南》,目前已更新到ASP.NET Core 3.1版本(LTS版本)。
画外音:欲练此功,必看此书。点击“阅读原文”,即可学习此书。
往期精彩推文
技术中台与业务中台有啥联系?
微服务架构中的BFF到底是个啥?
点个“在看” 就是对我最大的支持
????点击进入架构指南
骚年快答 | 为何微服务项目都使用单体代码仓库?相关推荐
- 骚年快答 | 微服务架构中的BFF到底是啥?
[答疑解惑]| 作者 / Edison Zhou 这是恰童鞋骚年的第263篇原创内容 昨天的骚年快答<技术中台与业务中台都是啥玩意>一文中留下一个问题:BFF是啥?为啥在API网关和业务中 ...
- 骚年快答 | 技术中台与业务中台都是啥?
[答疑解惑]| 作者 / Edison Zhou 这是恰童鞋骚年的第262篇原创内容 最近有童鞋在我之前发布的<聊聊中台>一文中提问:技术中台是什么?和业务中台又有什么区别?考虑到在工作中 ...
- SpringCloud入门总结 + 使用SpringCloud搭建微服务项目
SpringCloud 1.认识微服务 2.认识spring Cloud 3.Spring Cloud Eureka 服务发现框架 3.1认识Eureka 3.2 实战--开发并部署Eureka Se ...
- 微服务项目后台技术栈
微服务项目后台相关技术整理 主要技术 ORM框架-Mybatis Plus Mybatis Plus核心功能 MyBatis Plus与SpringBoot集成 MyBatis Plus集成Sprin ...
- 微服务项目构建标准文档
一 搭建自己的微服务项目 1.1.1 搭建一个基于Spring Boot框架 的Maven子项目 我们在微服务架构上选择的是maven的父子项目,父项目的名称是cloud. 点击cloud ...
- 【深入浅出 Node + React 的微服务项目】1.微服务的基本知识
[深入浅出 Node + React 的微服务项目] 微服务的基本知识 目录 [该目录用于 Github 的 md,故 CSDN 上不能目录跳转和 back to top,sry] 第一步: 微服务的 ...
- IDEA集成Docker插件实现一键自动打包部署微服务项目
一. 前言 大家在自己玩微服务项目的时候,动辄十几个服务,每次修改逐一部署繁琐不说也会浪费越来越多时间,所以本篇整理通过一次性配置实现一键部署微服务,实现真正所谓的一劳永逸. 二. 配置服务器 1. ...
- 微服务项目的整合与测试
实验目的 掌握微服务项目的整合使用 掌握Swagger-UI的简单使用 练习内容 1.微服务项目整合 1.1.项目预览 1.1.1.在 https://github.com/shi469391tou/ ...
- springcloud feign 服务调用其他服务_springCloud微服务项目 构建公共的feign调用
在微服务项目中加入有一个微服务的接口,很多其他的微服务都需要调用它,那么我们可以写在公共的项目中,而不需要每个微服务都建立一个相应 的feign 1.先在common 公共项目中建一个公共feign调 ...
最新文章
- mysql查询前10条记录
- 使用opencv中的merge()函数为BGR图像添加alpha通道
- centos6 mysql密码_CentOS6.5下修改MySQL密码
- 【转载】恼人的函数指针(一)
- OCA第7部分的Java难题
- MySQL的未来在哪?
- java contains 通配符_java 泛型通配符 extends, super
- Echarts经纬度坐标实现地图定位
- 视频翻译字幕的软件哪个好?看完你就知道了
- handler机制及使用场景
- 【毕业设计项目】基于单片机的万能红外遥控器 - 嵌入式 物联网 stm32
- mac flutter开发环境 flutter环境变量的配置
- 微信小程序 有赞UI关于Tab 标签页的坑
- Log4J按照不同包名输出日志
- 华硕笔记本电脑重装系统后不能读取usb,不能上网
- 树莓派-linux内核编译
- OpenHarmony如何控制屏幕亮度
- 高通平台Linux kernel死机解题心得-trace32的使用
- 瞒不住了,Prefetch 就是一个大谎言
- canvas - 绘制图片,图片变模糊问题解决)
热门文章
- mongo学习笔记(二):聚合,游标
- SharePoint2013开发环境搭建(完整版:图文并茂)
- Effective C# 原则35:选择重写函数而不是使用事件句柄(译)
- Kinect开发笔记之四检测并调试Kinect设备
- 在PowerPoint 2010中将鼠标用作激光笔
- RIL接听电话没有声音的问题 [ RIL_Answer | RIL_SetAudioDevices ]
- 使用js代码将HTML Table导出为Excel
- NGINX轻松管理10万长连接
- 一个检查SPN的小工具
- Xamarin效果第四篇之CollectionView子项右侧布局