单体应用
一个归档包(比如 war 包)包含的所有功能的应用程序。在项目中我们通常将需求分为三个主要部分:数据库、服务端处理、前端展现。在业务发展初期,由于所有的业务逻辑在一个应用中,开发、测试、部署都还比较容易且方便。这种通常称为单体应用。这也就是现在称之为单体应用架构的方法论。
尽管该应用已经进行了模块化,但由于 UI 和若干业务模块最终都被打包在同一个 War 包中,改 war 包包含了整个系统所有的业务功能,这样的应用系统成为单体应用。 相信很多项目都是从单体应用开始的。单体应用比较容易部署、测试,在项目初期,单体应用可以很好地稳定运行。然而,一般项目都会随着需求而不断的变化以及增加,越来越多的人加入到项目的开发团队,代码库也在飞速地膨胀。慢慢地,单体应用变得越来越臃肿,可维护性、灵活性逐渐降低,维护成本越来越高。
因此,我们可以从中看出单体应用会面临的一些问题:
-
复杂性高
在大型单体应用中一般会包含的模块非常多、模块的边界也非常模糊、依赖关系不清晰、代码质量参差不齐、混乱地堆砌在一起,这些将导致整个项目非常复杂。每次修改代码都心惊胆战,甚至添加一个简单的功能,或者修改一个 Bug 都会带来隐藏的缺陷。 -
技术债务
随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且越积越多。 -
部署频率低
随着代码的增多,构建和部署的时间成本也会上升。一般修复或者新增功能都可能需要重新部署整个应用。这种全量部署的方式耗时长、影响范围大、风险高,使得单体应用项目上线部署的频率较低。 -
可靠性差
某个应用 Bug 可能会导致整个应用的崩溃。 -
扩展能力受限
单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩。例如,应用中有的模块是计算密集型的,它需要强劲的 CPU;有的模块则是 IO 密集型的,需要更大的内存。由于这些模块部署在一起,不得不在硬件的选择上作出妥协。 -
阻碍技术创新
单体应用往往使用统一的技术平台或方案解决所有的问题,团队中的每个成员都必须使用相同的开发语言和框架,要想引入新框架或新技术平台会非常困难。
微服务
下面着重介绍微服务架构:
微服务架构风格是一种将一个单体应用程序开发为一组小行服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用 HTTP 资源 API)。这些服务围绕业务能力构建摒弃人可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。——引自 Martin Fowler 的博客
微服务加否应具备以下特性:
- 每个微服务可独立运行在自己的进程里,做到了进程隔离。
- 一系列独立运行的微服务共同构建起整个系统。
- 每个服务为独立的业务开发,一个微服务只关注某个特定的功能,例如订单管理、用户管理等。
- 微服务之间通过一些轻量级的通信机制进行通信,例如通过 RESTful API 进行调用。
- 可以使用不同的语言与数据库存储技术。
- 全自动的部署机制。
将整个应用拆分为多个服务,各个微服务独立运行在自己的进程中,并分别有自己的数据库,微服务之间使用 REST 或者其他协议通信。
当然,在软件领域,没有万能的解决方案。同样的,微服务也存在一定的不足:
- 运维要求较高:
更多的服务意味着更多运维的投入。在单体应用架构中,只需要抱枕一个应用的正常运行。而在微服务当中,需要保证几十甚至几百个服务的正常运行与协作,这给运维带来了很大的挑战。
- 分布式系统固然的复杂性:
使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延时、分布式事务等都会带来巨大的挑战。
- 重复劳动:
很多服务可能都会使用相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。
本文由 liyunfei 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jul 21,2022