首页 > 编程笔记 > Java笔记 阅读:23

微服务到底是什么?(非常详细)

微服务架构最早由 Martin Fowler 和 James Lewis 于 2014 年提出,是一种将单个应用程序构建为一系列小型服务的架构风格。

每个微服务在独立的进程中运行,并通过轻量级的通信机制(例如 HTTP API)与其他服务进行协作和通信。每个微服务都围绕特定的业务功能构建,具有高度自治性,能够独立开发、部署、扩展和维护。

微服务架构允许将大型复杂的应用程序分解为多个专注于单一任务或业务功能的小型服务。根据业务需求和负载情况,这些服务可以独立伸缩和升级。这种架构模式提高了开发团队的敏捷性,加快了应用的开发和迭代速度,同时增强了系统的灵活性、可扩展性和容错性。

微服务的特性

微服务是一种架构风格,它通过使用一组功能独立的服务来开发和构建应用的。该架构将应用程序拆分成一组小型、独立的服务。

微服务架构具有以下特性:
综上所述,微服务架构具有自治性、松耦合、可替换性、可伸缩性、弹性设计、去中心化管理和技术异构性等特性,这些特性使得微服务架构成为构建大型、复杂应用程序的理想选择。

微服务的优势

微服务具有以下显著优势:

微服务的劣势

微服务架构虽然具备众多吸引人的特质,但是也存在着一些问题。当使用微服务架构时,我们可能会面临如下挑战:

为什么需要微服务

前面介绍了微服务的本质,相信读者对微服务已经有了一个大致的了解。读者可能会问:为什么需要微服务?它解决了什么问题?下面来回答这些问题。

1) 传统软件架构面临的挑战

随着技术的持续进步,软件系统架构设计正面临着前所未有的挑战。这些挑战包括应用场景的不确定性、大规模数据处理、云计算和虚拟化等新技术的融入。

具体而言,传统软件架构所面临的挑战主要表现在以下几个方面:
综上所述,当前软件系统面临的挑战涵盖了大规模处理、系统复杂性、安全性保障、可维护性、敏捷性、数据管理以及云化等多个方面。为应对这些挑战,必须采用合适的技术和架构策略。

2) 传统架构的问题

早期的软件架构通常以典型的 MVC 框架为基础构建而成,涵盖前端(包括 Web 端和手机端)、中间业务逻辑层以及数据库层。

此架构在业务逻辑和数据规模相对较小时,运行状况良好。然而,伴随系统规模的持续拓展,逐渐显露出如下问题:
在项目初期,传统软件架构由于开发、测试和部署过程相对简单,能够顺利运行。但是,随着需求的持续增长和开发团队规模的增加,代码库迅速膨胀。这导致架构逐渐变得臃肿,其可维护性和灵活性逐步下降,同时维护成本也在持续上升。

3) 微服务能否解决这些问题

微服务架构在一定程度上可以解决当前软件架构设计所面临的挑战。通过将大型软件系统拆分为多个小型、自治的服务,微服务能够有效应对系统规模和复杂性的问题。这使得每个服务都可以独立开发、测试、部署和扩展,从而提高系统的可维护性、可扩展性和灵活性。

此外,微服务架构通过松耦合设计提升了系统的可替换性和可伸缩性,增强了系统的弹性和可靠性。同时,它支持去中心化的管理和技术异构性,更好地适应不同的业务需求和技术栈。

然而,微服务架构也面临一些挑战,例如安全性、数据管理、敏捷性和云化等方面的问题,需要采用适当的技术和架构来应对这些挑战。

微服务与单体、SOA的区别

众所周知,在当前流行的软件架构领域中,存在着微服务、单体应用以及 SOA(面向服务的架构)这三种截然不同的架构模式。

那么,微服务与单体应用和 SOA 之间究竟存在着何种区别与联系呢?

1) 微服务与单体架构的区别

在单体架构中,所有模块都包含在同一工程内,并且共用一个数据库,这导致存储方式较为单一。相比之下,在微服务架构中,每个服务都可以选择不同的存储解决方案(例如,某些服务可能采用 Redis,而其他服务可能使用 MySQL),并且每个服务都有其专用的数据库。

与传统的单体架构相比,单体架构中的所有模块紧密耦合,代码量庞大且难以维护。微服务架构允许每个服务独立运作,类似于独立项目,这显著减少了代码量,并简化了问题解决的过程。

此外,在微服务架构下,每个服务可以采用不同的技术栈,从而提供了更大的开发灵活性和多样性,如图 1 所示。


图 1 单体架构与微服务架构图

2) 微服务与SOA的区别

SOA(面向服务的架构)是一种软件架构风格,它将应用程序的功能分解为独立的服务单元,并通过企业服务总线(ESB)进行通信和集成。SOA 强调服务的可重用性和松耦合性,适用于构建大型企业级应用。

微服务架构将应用程序构建为一组小型、独立的服务,每个服务在自己的进程中运行,并通过轻量级的通信机制进行交互。这些服务专注于单一业务功能,具有高度的自治性和独立性,这有助于开发团队进行敏捷开发和快速迭代,同时提高了系统的容错性和可靠性。

SOA 与微服务架构如图 2 所示。

图 2 SOA与微服务架构图

微服务架构和 SOA 在表面上可能看起来有些相似,以至于早期有人将微服务视作细粒度的 SOA。然而,它们之间实际上存在显著差异,主要表现在以下方面:
总的来说,微服务、单体应用和SOA是三种不同的软件架构风格,每种风格都有其独特的优势和适用场景。选择恰当的架构风格应基于具体的业务需求和技术环境来做出决策。

什么场景适合微服务

前面已阐述了微服务的定义、采用微服务的缘由,以及微服务与单体、SOA 等架构的差异。那么,什么样的系统适合采用微服务架构呢?

适合微服务架构的系统通常具有以下特点:
需要注意的是,微服务架构并非适用于所有场景。对于一些规模较小、功能单一的项目,采用微服务架构可能会不必要地增加开发和维护的成本。因此,应根据项目的具体情况来做出选择。

此外,微服务的划分应基于业务功能的独立性。对于涉及操作系统内核、存储、网络、数据库等基础层面的系统,它们属于底层架构,各功能之间的依赖关系通常较为紧密。在这种情况下,如果强行将这些系统拆分为多个小服务单元,可能会导致集成过程变得复杂,工作量大幅增加,并且难以实现业务隔离和服务的独立部署运行。因此,这类系统可能不适合采用微服务架构。

微服务架构的形态

既然微服务有着众多优点,又是应用系统架构的大趋势,接下来就来深入了解其具体形态。许多人声称自己的架构是微服务架构,那么微服务架构究竟是怎样的呢?

1) 微服务需要解决的问题

微服务架构,简而言之,是将单体应用进一步分解,拆分为更为细小的服务,每个服务均为能够独立运行的项目。

然而,一旦采用微服务系统架构,必然会面临如下几个问题:
针对上述问题,任何一位微服务设计者均无法回避,故而大部分微服务架构解决方案针对每个问题都提供了相应的解决策略或组件。

2) 微服务架构到底长什么样

从整体结构来看,微服务架构类似于由多个小型、独立的模块构成的系统。

每个微服务都是一个独立的应用单元,具备自己的业务逻辑、数据存储和运行环境。它们专注于实现特定的业务功能。例如,用户管理微服务处理用户的注册、登录和信息管理;订单管理微服务则负责订单的创建、处理和跟踪等业务流程。

这些微服务通过轻量级的通信机制进行交互,通常是基于 HTTP 协议的 API 接口。它们可以部署在不同的物理服务器上,或在同一服务器的不同容器中,以实现灵活的部署和扩展策略,如下图所示。


图 3 微服务架构模型图

通过将服务进行原子化拆分,确保每个微服务都有明确的任务划分和单一的业务职责,这有助于实现服务的扩展性。微服务之间通过 RESTful 等轻量级 HTTP 协议进行相互调用,保持了松耦合的状态。它们能够独立地进行打包、部署和升级,有效避免了因单一模块问题导致的整个服务崩溃的风险。

3) 微服务治理核心概念

我们在学习微服务的时候,通常会遇到各种概念和组件,例如服务治理、服务调用、服务网关和服务容错等。那么,这些组件究竟是什么?它们各自有什么作用呢?

1、服务注册与发现
服务注册与发现是分布式或微服务架构中的核心,它能让各微服务动态地了解彼此的状态,有利于系统动态扩展、灵活部署,提高整体的可靠性与可维护性:
2、服务调用
服务调用是指一个微服务向另一个微服务发起请求,并接收相应的响应的过程。通过定义明确的接口和协议,实现不同服务之间的通信与协作,这有助于促进服务的复用和功能的解耦。

目前,主流的远程服务调用技术包括基于 HTTP 请求的 RESTful 接口和基于 TCP 的 RPC 协议:
下表给出了 RESTful 和 RPC 的区别和联系。

表:RESTful和RPC的区别和联系
比较项 RESTful RPC
通信协议 HTTP 一般是 TCP
性能 略低 较高
灵活度
应用 微服务架构 SOA 架构

3、服务网关
随着微服务数量的增加,不同的微服务可能具有不同的网络地址,而外部客户端可能需要调用多个服务接口以满足特定的业务需求。

如果客户端直接与各个微服务通信,可能会遇到以下问题:
为了解决这些问题,服务网关应运而生。服务网关作为微服务架构的统一入口,接收外部请求并将其路由到后端相应的服务。它还承担身份验证、授权、请求限流、协议转换等职能,如下图所示。


图 4 服务网关结构图

4、服务容错
服务容错旨在处理服务调用过程中可能出现的错误和异常情况。

常见的容错机制包括断路器模式、重试机制、降级处理等。其作用是当某个服务出现故障时,能够避免故障扩散,以保证整个系统的稳定性和可用性,尽量减少对业务的影响,如下图所示。


图 5 服务容错机制

总之,这些组件和概念相互配合,共同构建了一个可靠、高效、灵活的微服务架构体系。

相关文章