微服务的优缺点和适用场景

上篇分享我们介绍了微服务的整体架构和组件,可以看到微服务架构要比单体应用的架构复杂很多,所以这篇分享学院君将在正式介绍微服务架构的具体组件和落地实践之前,给大家分析下微服务的利弊和适用场景,否则,没有权衡清楚贸然进行微服务重构的话,可能会引入很多意料之外的问题。

微服务的优缺点

关于微服务架构的优缺点我们在网络协议:RPC 部分已经简单介绍过,这里我们通过表格的形式更加直观的来对比:

S/N 对比点 微服务架构 单体架构 结论
1 上手难度 API 接口调用 数据库共享或本地程序调用 单体架构胜
2 开发效率 早期设计和沟通的工作量加大,随着项目规模和时间的推移,效率变化不大 早期工作量小,随着项目规模和时间的推移,效率大幅度下降 对于简单项目单体架构胜,对于复杂项目微服务架构胜
3 系统设计(高内聚低耦合) 每个业务单独包装成一个微服务,数据和代码都从物理上隔离开来,实现高内聚低耦合相对容易 以包的形式对代码进行模块划分,控制得当即可实现高内聚。但最终都是在数据层面将整个系统耦合在一起 微服务架构胜
4 系统设计(扩展性) 独立开发新模块,通过 API 与现有模块交互 在现有系统上修改,与现存业务逻辑高度耦合 微服务架构胜
5 需求变更响应速度 各个微服务组件独立变更,容易实施敏捷开发方法 需要了解整个系统才可以正确修改,容易导致不相关模块的意外失败 微服务架构胜
6 系统升级效率 各个微服务组件独立升级,上手和开发效率高,影响面小 需要了解整个系统才可以正确修改,容易导致不相关模块的意外失败 微服务架构胜
7 运维效率 大系统被拆分为多个小系统,部署和运维难度加大,但可以利用 DevOps 等方式将运维工作自动化 简单直接 单体架构胜
8 代码复用性 微服务组件可以在新项目中直接复用,包括前端页面 一般以共享库的形式复用后台代码 微服务架构胜
9 硬件需求 按需为不同业务模块伸缩资源节点,一个系统需部署多个微服务,需要启动多个运行容器 整个系统只需要一个运行容器,为整个系统分配资源 对于简单项目单体架构胜,对于复杂项目微服务架构胜
10 项目成本 项目早期和后期,成本变化曲线平缓 项目早期成本低,后期成本大 对于简单系统单体架构胜,对于复杂系统微服务架构胜
11 非功能需求 为单独的微服务按需调优,甚至更换实现方式和程序语言 为整个系统调优,牵一发而动全身 微服务架构胜
12 职责、成就感 拥有明确的职责划分,主人翁意识和成就感加强,容易形成自组织型团队 职责不明确,容易产生扯皮行为 微服务架构胜
13 风险 大系统被拆分为小系统,风险可被控制在小系统内,但也引入了各小系统之间的交互风险 系统是一个整体,一荣俱荣,一损俱损 微服务架构胜

对于简单项目来说,单体架构 5 胜 8 败,优势主要体现在开发效率、上手难度、运维效率、硬件需求、项目成本;对于复杂项目来说,微服务架构 11 胜 2败,优势主要体现在硬件需求、项目成本、开发效率、系统设计时的高内聚低耦合和可扩展性、需求变更响应速度、系统升级效率、代码复用性、非功能需求、职责/成就感、风险的可控性。

所以对于小型简单系统来说,使用单体架构更合适,对于大型复杂系统来说,使用微服务架构更合适,但是尽管如此,微服务也不是银弹,它也为系统引入了新的问题比如提高了系统的复杂度,这也导致了开发人员上手难度增加,需要在理解分布式系统设计的基础上才能更好的开发和维护微服务,再就是分布式服务的调用问题,服务的注册和发现、服务之间的分布式事务问题,数据库拆分之后数据报表的处理,数据库查询的复杂度增加,服务之间分布式一致性的问题,此外也为系统运维和管理增加了复杂度,这都是我们在进行微服务架构时要做好的心里准备和技术储备。

微服务的适用场景

所以微服务也不是一招鲜吃遍天,不是能够解决所有问题的万金油,它有其特定的适用场景,用之不慎很有可能带来负面作用,陷入上述提到的微服务泥淖之中无法自拔,一定要在系统进行微服务重构时认识到这一点。那么哪些场景适合使用微服务架构呢?满足以下三个条件即可考虑:

  • 团队规模较大,超过10人;
  • 业务复杂度高,超过5个以上的子模块(业务功能较复杂);
  • 项目需要长期迭代开发和维护(半年以上)。

以下是一个单体应用与微服务开发效率的曲线,随着业务复杂度的增加,单体应用的效率逐渐降低,甚至在某个临界点出现断崖式下跌,之后,微服务的优势就很明显了,所以很多公司在单体应用的效率低到无法接收时都会开始服务化/微服务重构:

单体应用与微服务效率对比

如果一开始面临的就是一个复杂的满足上述三个条件的系统开发,我们也可以在一开始就引入微服务架构,以避免后续重构引入的额外风险和时间成本。

经过这一篇介绍,相比你应该对什么时候使用微服务架构有了一个很量化的认识,下一篇开始,我们就来介绍构成微服务架构的各个组件是如何协同工作以实现分布式服务调用的。

上一篇: 微服务架构总体设计和基础组件

下一篇: 服务拆分与技术保障