微服务的背景
大约在 2005年左右,随着互联网公司的快速发展,许多企业开始遇到单体应用程序在可扩展性和灵活性方面的瓶颈,为了应对这些挑战,企业开始探索将应用程序拆分成更小的、独立的组件。
基于上述的背景,微服务的发展出现了几个关键时刻:
- 2011年:在这段时间,行业内开始广泛使用“微服务”这一术语。虽然没有一个明确的“首次提出”事件,但在技术会议、博客和相关文献中,微服务的概念逐渐被讨论和推广。
- 2012年:James Lewis和 Martin Fowler在 ThoughtWorks的技术雷达和博客中发表了关于微服务的文章,详细描述了微服务的特征和优点,这篇文章 被认为是推动微服务架构普及的重要里程碑。
要理解微服务,我们首先需要理解软件架构的演变,早期的软件,所有功能都写在一起,数据库也共用一个,这称为单体架构(monolithic software)。
单体软件
单体软件(Monolithic Software)是一种传统的软件架构风格,其中所有的功能组件都被打包成一个独立的、不可分割的应用程序实例。在单体架构中,应用程序的所有部分(如用户界面、业务逻辑、数据访问层等)都是紧密集成在一起的。这种架构的构建方式在软件开发的早期阶段特别普遍,因为在当时的硬件限制和软件工具链条件下,单体应用程序相对容易设计、实现和部署。
单体架构的模型可以抽象成下图:
1.单体软件架构的特点
- 统一代码库:所有功能与模块共享一个代码库,所有开发人员都在同一代码库中进行协作。
- 集成部署:整个应用程序被作为一个单独的单元进行构建和部署。如果需要对应用的任何部分进行更新或修复,通常需要重新构建并重新部署整个应用。
- 规模庞大:随着时间的推移,单体应用程序往往会变得规模庞大,代码复杂度增加,管理和理解难度加大。
- 紧密耦合:各个模块间往往紧密耦合,程序的不同部分共享较多的代码和资源。
22.单体软件的优势
尽管单体软件在现代软件开发中逐渐被微服务架构所取代,它仍然有一些优势:
- 简单开发和测试:由于整个应用整合在一个代码库中,开发人员可以容易理解整个系统的运作。这种集中性简化了测试和调试。
- 快速部署:作为一个整体进行部署,可以简化部署流程,尤其对于小型应用或者新项目来说,能迅速发布上线。
- 简单监控与管理:只需要管理一个平台或者服务,可以有更简便的监控管理和日志处理。
3.单体软件的局限性
随着应用程序功能的扩展和用户数量的增长,单体软件架构的局限性开始显现:
- 规模和复杂性问题:应用程序的代码库可能变得非常庞大,导致理解和管理变得困难。代码变动的风险较高,单一的变更可能造成意外的副作用。
- 限制灵活性:由于所有模块打包在一起,技术栈的变更和更新难度增大。此外,无法针对某些模块单独进行技术升级或替换。
- 部署瓶颈:即便是小的改动,也可能导致重新构建和部署整个应用程序,增加了部署成本和时间。有时可能需要停机来完成部署,影响用户体验。
- 可扩展性受限:单体架构难以满足不同模块的不同扩展需求,当某个模块需要扩展时,无法单独进行扩展,需要扩展整个应用,资源使用效率降低。
- 服务故障隔离差:一个模块的故障可能导致整个系统的非正常运行,从而影响整个服务的可用性和可靠性。
- 面临技术债务:随着技术更新的需求(如引入新的开发框架或库),在单体架构中解决技术债务的成本和风险较高。
由于上述局限性,许多企业选择将单体应用系统逐步转型为微服务架构,微服务架构可以通过将大型应用程序分解为多个小型、独立的服务来避免单体架构的限制,从而实现更高的灵活性、可扩展性和故障隔离。
什么是微服务?
微服务架构的核心理念是将单体应用程序拆分为多个小型服务,每个服务都是一个独立的进程,通常通过轻量级的通信机制(如HTTP/REST、消息队列等)进行交互。每个微服务都拥有自己的数据存储,可以选择最适合其功能的数据库类型。
微服务架构的模型可以抽象成下图:
微服务主要包含以下 5个特点:
- 单一职责原则:微服务的设计理念强调每个服务模块应该聚焦于完成一项特定的任务或功能,遵循单一职责原则。这意味着每个微服务应该解决某一特定业务领域的问题,使得服务更易于开发、维护和理解。
- 独立部署:微服务可以独立部署和更新,而无需影响整个系统。这样一来,可以更快地响应业务需求的变化,部署新的功能也更加便捷。
- 去中心化管理和治理:在微服务架构中,基础设施和服务的开发由不同的团队负责,这样各个团队可以根据自身的技术栈独立决定如何实现服务,并采用适合的技术进行治理。去中心化的治理模型支持团队的敏捷性和创新。
- 自治性:每个微服务都是自治的,拥有自己独立的数据存储和业务逻辑。这种自治性使得服务之间的耦合度降低,从而提高了系统的鲁棒性。
- 轻量级通信:微服务之间的通信通常是轻量级的,常用的协议有HTTP/REST、gRPC、AMQP等。这些协议以其跨平台和灵活性著称,适合复杂分布式环境下的服务交互。
如何拆分?
为了更好地理解微服务架构,这里以电商服务为例,假如某电商的场景有商品功能,订单功能,支付功能,用户功能,运营功能,仓储功能等6个功能,当业务量比较小时,我们可以将这 6个功能点都在一个单体服务中开发和维护,但是,随着业务的快速发展以及技术团队的壮大,单体服务就出现很大的问题,因此,我们需要使用微服务架构,理想情况下的微服务设计如下图:
各个微服务的功能说明如下:
- 商品中心:负责商品分类、商品列表、商品详情页、商品检索、商品评价等业务
- 订单中心:负责订单创建、管理,促销和优惠的计算等
- 支付中心:负责支付相关的业务流程,同时财务结算也划分到该微服务中
- 用户中心:负责用户信息的管理,以及用户名下订单、优惠券、权益等的管理(该部分未在上图呈现出来)
- 运营中心:负责商品的个性化推荐、秒杀预售等活动的支持,以及优惠券的发放
- 仓储中心:负责库存管理和物流管理
但是,从单体服务到微服务受到很多因素的影响很难拆分得一步到位,因此,我们可能会经过下面的拆分过程,所以微服务中的拆分粒度是根据具体的业务场景和技术能力来拆分的。
从上面微服务拆分迭代的过程可以看出,拆分过程中的任何一个阶段都是合理存在并且有可能是微服务的最终拆分结果,拆分的粒度完全全局于业务场景和业务体量。因此,在微服务架构中,过度拆分也是需要重点关注的一个问题。
微服务的优势
- 可扩展性:由于微服务架构将应用拆分成多个小型服务,每个服务可以根据负载进行单独扩展。这使得系统具备高扩展性和高并发处理能力。
- 灵活性和敏捷性:微服务架构允许团队按照自身的需要选择适合的技术栈,并独立进行开发和部署。这种灵活性加快了产品的迭代速度,增强了系统对业务变化的敏捷响应能力。
- 故障隔离:在一个微服务体系下,如果某个服务出现故障,理论上只会影响到该服务的功能,而不会导致整个系统的瘫痪。这样有助于系统的稳定性和可靠运行。
- 技术多样性:微服务架构允许各个服务采用不同的技术栈进行开发,这意味着可以为不同的服务选择最适合的框架、语言和工具,优化各个服务的开发效率和性能。
总结
本文,我们分析了什么是微服务,分析了它和单体服务的对比,以及如何拆分微服务。微服务是现在主流的应用解决方案,它将应用拆分成多个小型服务,每个服务可以根据负载进行单独扩展,这使得系统具备高扩展性和高并发处理能力,同时也提高了系统的故障隔离和敏捷性。但是,微服务的拆分粒度是根据具体的业务场景和技术能力来拆分的,拆分粒度完全全局于业务场景和业务体量。因此,微服务的拆分没有一个统一的标准。