骚年快答 | 为何微服务项目都使用单体代码仓库?

【答疑解惑作者 / 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到底是个啥?

点个“在看” 就是对我最大的支持

????点击进入架构指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[SpringSecurity]web权限方案_自动登陆_原理分析和具体实现

自动登陆 1.cookie技术 2.安全框架机制实现自动登陆 这里我们使用安全框架机制实现自动登陆技术 实现原理 具体实现 第一步 创建数据库 CREATE TABLE persistent_logins (username varchar(64) NOT NULL,series varchar(64) NOT NULL,token varchar(64) NOT NULL,last_us…

[SpringSecurity]web权限方案_CSRF功能

CSRF CSRF功能默认是已经打开了&#xff01; 具体过程可以阅读CsrfFilter这个过滤器的源码 CSRF 理解 在登录页面添加一个隐藏域 <input type"hidden"th:if"${_csrf}!null"th:value"${_csrf.token}"name"_csrf "/>关闭安全…

[SpringSecurity]web权限方案_用户授权_注解使用

注解使用 Secured 判断用户是否具有角色&#xff0c;可以访问方法&#xff0c;另外需要注意的是这里匹配的字符串需要添加前缀“ROLE_“。 使用注解先要开启注解功能&#xff01; 启动类(配置类)开启注解 EnableGlobalMethodSecurity(securedEnable true) 在controller的…

我和ABP vNext 的故事

Abp VNext是Abp的.NET Core 版本&#xff0c;但它不仅仅只是代码重写了。Abp团队在过去多年社区和商业版本的反馈上做了很多的改进。包括性能、底层的框架设计&#xff0c;它融合了更多优雅的设计实践。不管你是自己需要快速上手项目、或者是公司的研发团队没有足够的能力去完整…

微软为 Visual Studio 推出新的 Razor 编辑器

随着 Visual Studio 最新版本的发布&#xff0c;微软推出了一款新的 Razor 编辑器&#xff0c;用于使用 MVC、Razor Pages 和 Blazor 进行本地开发。该工具目前还处于实验状态。Razor 是一种基于 HTML 和 C# 的模板语言&#xff0c;可以用来为 .NET Web 应用程序创建动态内容。…

禁用了云服务器的网卡怎么办?

点击上方关注“汪宇杰博客” ^_^导语我们平时管理云服务器时&#xff0c;难免误操作把网卡给禁用了&#xff0c;于是再也无法远程连接了。这时候怎么办呢&#xff1f;如果有虚拟机快照&#xff0c;能够恢复到上一个良好的时刻&#xff0c;但通常会损失这个时间段内的数据和应用…

[SpringBoot2]@MatrixVariableUrlPathHelper

场景 页面开发&#xff0c;cookie禁用了&#xff0c;session里面的内容怎么使用&#xff1a; session.set(a,b)—>jessionid—>cookie—>每次发请求携带 此时cookie禁用了&#xff0c;我们要怎么得到session里面的内容呢&#xff1f; url重写&#xff1a;/abc;jse…

WebBenchmark之动态数据测试

对于很多WebApi管理工具来说&#xff0c;针对接口的性能测试都拿固定的数据进行一个循环式的测试&#xff1b;这种测试只能确保当前数据下的有效性&#xff0c;但在性能测试中往往需要压测不同的数据分布&#xff0c;这样能够更准确地反映在不同数据下系统的处理能力。WebBench…

[SpringBoot2]Thymeleaf

引入starter <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>自动配置好了thymeleaf Configuration(proxyBeanMethods false) EnableConfigurationPrope…

【Ids4实战】分模块保护资源API

(毕竟西湖六月中)书接上文&#xff0c;上回书咱们说到了IdentityServer4&#xff08;下文统称Ids4&#xff09;官方已经从v3更新升级到了v4版本&#xff0c;我的Blog.Idp项目也做了同步更新&#xff0c;主要是针对快速启动UI做的对应修改&#xff0c;毕竟Ids4类库nuget包更新就…

[SpringBoot2]拦截器

拦截器 1.编写一个拦截器实现HandlerInterceptor接口2.拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)3.指定拦截规则[如果是拦截所有&#xff0c;静态资源也会被拦截] 1、HandlerInterceptor 接口 /*** 登录检查* 1、配置好拦截器要拦截哪些请求* 2、把这些配…

数据结构与算法专题——第九题 鸡尾酒排序

这篇我们来聊一下鸡尾酒排序&#xff0c;为了知道为啥取名为鸡尾酒&#xff0c;特意看了下百科&#xff0c;见框框的话&#xff0c;也只能勉强这么说了。要是文艺点的话&#xff0c;可以说是搅拌排序&#xff0c;通俗易懂点的话&#xff0c;就叫“双向冒泡排序”&#xff0c;我…

[SpringBoot2]错误处理_默认规则

错误处理 默认规则 ● 默认情况下&#xff0c;Spring Boot提供/error处理所有错误的映射 ● 对于机器客户端&#xff0c;它将生成JSON响应&#xff0c;其中包含错误&#xff0c;HTTP状态和异常消息的详细信息。对于浏览器客户端&#xff0c;响应一个“ whitelabel”错误视图&…

C#高级技师语法,你会吗?

【导读】呀&#xff0c;最近太忙了&#xff0c;没什么时间去看和学习&#xff0c;既然长篇文章一时半会吐不出来&#xff0c;短篇还是可以搞搞&#xff0c;操作系统绝不会断更。本文我们来搞点C#中高逼格语法。>这玩意从C&#xff03;6开始支持方法&#xff0c;运算符和只读…

将终结点图添加到你的ASP.NET Core应用程序中

在本文中&#xff0c;我将展示如何使用DfaGraphWriter服务在ASP.NET Core 3.0应用程序中可视化你的终结点路由。上面文章我向您演示了如何生成一个有向图&#xff08;如我上篇文章[译]使用DOT语言和GraphvizOnline来可视化你的ASP.NETCore3.0终结点01中所示&#xff09;&#x…

再见,RabbitMQ,你好,Kafka!

容器、Kubernetes、DevOps、微服务、云原生&#xff0c;这些技术名词的频繁出现&#xff0c;预兆着新的互联网技术时代的到来&#xff0c;大数据高并发将不再遥远&#xff0c;而是大部分项目都必须具备的能力了&#xff0c;而消息队列是必备的了。成熟的消息队列产品很多&#…

[SpringBoot2]数据访问_数据库场景的自动配置分析和整合测试

数据访问 1、导入jdbc场景 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency>数据库驱动&#xff1f; 为什么导入JDBC场景&#xff0c;官方不导入驱动&…

【视频回放与课件】搭上AI快车-在线公益课堂:基于移动应用的人工智能开发...

今天&#xff0c;受广州图书馆邀请&#xff0c;通过腾讯会议推出搭上AI快车系列在线公益讲座第三讲《基于移动应用的人工智能开发》&#xff0c;本次课程实时参与参与直播互动人数超过300人&#xff0c;虽然课程10点钟才正式开始&#xff0c;但是9点已经有许多小伙伴已经进来直…

dotNET:怎样处理程序中的异常(理论篇)?

平时在软件开发的过程中&#xff0c;首先是要保证功能可以正常运行&#xff0c;满足业务需求&#xff0c;除此之外&#xff0c;还需要考虑代码在异常的时候怎么处理&#xff0c;让程序能够健壮地运行。正确合理地处理异常可以减少程序的 Bug、保证代码质量&#xff0c;当然也不…

[Spring5]IOC容器_底层原理

IOC的概念和原理 什么是IOC 1.控制反转&#xff0c;把对象创建和对象之间的调用过程&#xff0c;交给Spring进行管理 2.使用IOC目的&#xff1a;为了耦合度减低 IOC底层原理 xml解析工厂模式反射 底层原理示例图 目的&#xff1a;将耦合度降低到最低限度 IOC过程 1.xml…