您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

如何从单体架构迁移到微服务架构:挑战和最佳实践

时间:2023-10-24 15:38:30  来源:51CTO  作者:

译者 | 刘汪洋

审校 | 重楼

当单体架构成为项目增长的瓶颈时,迁移到微服务架构就成了必然的选择。

如何从单体架构迁移到微服务架构:挑战和最佳实践

微服务虽然具有明显的优点,但由于其内在复杂性和缺乏一种通用的迁移方案,实施过程中可能会遇到不少挑战。本文旨在分享解决方案架构师在单体架构向微服务迁移过程中的专业经验,并阐述如何在确保项目安全性和可靠性的前提下,成功完成迁移。

单体架构到微服务:迁移路线图

下面,我们将从涉及的五个主要步骤入手,深入探讨如何让单体架构向微服务的迁移过程更为顺利。

第一步:技术与商业需求分析

成功地从单体架构迁移到微服务的第一步是从商业角度证实这一转型的必要性。每个项目都有其特定的技术优势和局限性,因此,这一转型将对整个产品架构产生深远影响。这个新架构需要能够适应未来的业务增长。因此,建议与商业分析师和技术专家联手,准确地评估当前系统的需求,并制定一个高效的开发路线图。

尽管微服务多年来一直是业界热点,但并不是所有项目都适合采用微服务。事实上,完全符合微服务理念的项目是相当罕见的。尽管微服务已经成为一种行业趋势,但至今还没有一个完美的微服务实施案例。但这不应成为企业进行转型的障碍。关键在于合理地设定期望,并仔细评估预期的技术方案是否能够实现既定目标。

应用现代化策略中,将现有应用迁移到微服务是一种常见的做法。然而,从零开始就使用微服务构建应用并不总是最佳选择。相反,应首先考虑采用单体架构,或者至少在其中实现核心业务逻辑。这样,后续的服务拆分会更为简单。过度追求微服务之间的隔离可能会导致不必要的复杂性。

对于大型团队参与的项目,微服务无疑是一个合适的选择。它们不仅在系统架构层面提供了可扩展性,还能在团队协作方面带来便利。这种架构的一个显著优势是能够整合多种不同的技术栈。

在正式迁移到微服务之前,进行全面的技术审计是非常关键的。这一审计应明确当前项目所依赖的技术栈,并评估这些技术是否可能成为未来发展的制约因素。如果有这种可能,应考虑是否需要采用其他更适合微服务的技术选项。与具有特定技术专长的专家进行咨询,可以获取有价值的建议,从而确保架构转型过程的平稳和高效。

第二步:识别适合迁移到微服务的系统组件

接下来,我们需要确定哪些系统组件适合迁移到微服务,以及这些微服务将如何进行模块间的交互。简而言之,这一步骤涉及到对产品总体架构的设计,以及确定哪些服务应当优先进行拆分。

微服务在处理某些特定功能时表现尤为出色,如实时通信、数据处理流程、后端任务处理,或与外部服务的接口。这些功能虽然可能需要访问单体架构中的数据,但在技术实现上是相对独立的。

第三步:单体架构到微服务的拆分策略

拆分单体架构到微服务有两种主要方法。

第一种方法是从单体架构中逐步剥离特定功能,同时逐渐减少其与其他组件的依赖性。一旦完全解耦并设计了新的 API,这些功能便可以作为独立的微服务发布。这种方法通常需要对原有的单体架构进行较大幅度的修改。

第二种方法则是复制所需的功能,并在保留单体架构中原有功能的同时,将其开发为一个新的微服务。一旦新的微服务经过全面测试并确认功能完备,便可以从单体架构中移除原有功能。

第四步:数据管理策略

微服务架构的一个核心原则是,每个微服务应拥有其专属的数据库。然而,由于数据库对象间可能存在交集和依赖关系,拆分单体数据库通常是一项具有挑战性的任务。

不同的微服务可以采用不同的数据库、编程语言和数据存储方案。某些数据库可能比其他数据库更为复杂,这使得将所有数据集中到一个统一数据库中变得不现实。因此,针对特定类型的数据,通常会使用专用的存储系统。

在微服务的数据管理方面,可以根据涉及的数据模式进行相应的操作分类。

独享数据库模式(Database-per-Service)

在微服务架构中,每个服务独立数据库模式强调了模块自主性和数据封装的重要性。该模式通过为每个微服务配置专属数据库,确保了数据一致性和隔离性,从而降低了服务间的数据竞争风险。

然而,这种做法也使得数据集成和跨服务查询变得更为复杂,因此需要高效的通信协议和明确的接口定义。同时,数据库模式的变更需要谨慎处理,以防意外导致服务中断。但凭借合适的策略,该模式能显著提升微服务生态系统的可扩展性和容错能力。

SAGA 模式

SAGA 模式是解决微服务事务中跨分布式系统数据一致性问题的关键策略。与依赖传统数据库事务不同,SAGA 模式将事务操作拆分为一系列可独立执行且可回滚的步骤。如果某个步骤执行失败,将触发相应的补偿事务以保证整体数据一致性。

这种分布式处理方式虽然增强了系统的弹性和可扩展性,但也要求精细的任务编排和错误处理机制,以有效地应对可能出现的失败情况。

API 组合模式(API Composition)

API 组合模式是微服务架构中用于解决多服务数据检索问题的基础策略。在一个由多个微服务组成、每个服务管理各自数据片段的环境中,直接在客户端进行数据查询往往会变得复杂和低效。

为解决这一问题,API 组合模式引入了一个中介层,通常称为 API 组合器或聚合器。该中介负责将来自不同微服务的数据整合为一个统一的响应结果,从而为客户端提供了一个集中的数据访问入口,简化了查询过程并优化了数据传输效率。然而,开发人员需要确保这个组合器高效运行,避免成为系统的性能瓶颈或单点故障。

命令查询职责分离模式(CQRS)

在微服务架构中,数据管理通常是分散的,特别是当一个服务需要同时负责数据的更新和查询时,这会增加系统复杂性。

CQRS 通过分离命令操作(即数据写入)和查询操作(即数据读取)来解决这个问题。按照这种设计,微服务可以根据其主要职责进行优化:某些服务主要负责数据读取,而其他服务则专注于数据写入。这样,每个服务都能根据自己的工作负载进行独立扩展。

虽然 CQRS 在微服务架构中有多个优势,但它也增加了额外的复杂性,尤其是在保证服务间数据一致性的方面。因此,在决定是否采用 CQRS 时,需要仔细评估系统的具体需求。

事件源模式(Event Sourcing)

事件源模式强调将应用状态的所有变化以事件的形式进行捕获和存储。与仅保存数据的当前状态不同,该模式保存一系列状态转换的事件,从而允许系统通过回放这些事件来重构状态。

在微服务环境下,这种方法让每个服务都能维护自己的历史状态,从而增强了服务之间的自主性和解耦。由于这些事件成为了数据的唯一真实来源,它们可以用于多种用途,从数据分析到审计追踪。

虽然这种模式很强大,但还需要考虑事件版本控制和数据存储的可扩展性。

共享数据库反模式(Shared Database Anti-pattern)

当多个微服务或系统组件直接与一个公共数据库交互,而不是通过 API 或消息传递机制,就会出现所谓的“共享数据库反模式”。这种直接的数据库访问方式不仅削弱了各个服务的自主性,还可能导致数据完整性问题。

采用这种设计的系统可能会面临安全风险,因为有可能无意中暴露敏感数据。此外,这样的设计也会增加系统演进的复杂性,因为即使是微小的数据库更改也可能需要多个服务进行协调和调整。

下一步

无论你选择哪种数据管理策略,都应避免陷入“分布式单体”这一陷阱。如果各个服务之间没有做到完全的隔离,这通常会引发更多问题。从结构和数据库角度看,这样的设计仍然具有单体的特性。尽管表面上看似已经进行了拆分,但实际上各服务之间仍然存在大量的耦合,从而导致微服务的多数优势被削弱。

接下来,您需要构建 API 接口,这些接口将负责微服务与单体应用以及其他微服务之间的通信。API 将从被调用的服务获取必要的数据。

步骤 4:优化服务间通信

在设计服务间的通信策略时,需要考虑交互模式。通常,服务间的交互可以分为两类:

  • 每个客户端请求由单一服务处理(一对一交互)
  • 多个服务共同参与处理一个请求(一对多交互)

同时,还需要考虑交互的同步或异步特性:

  • 同步交互:在这种模式下,客户端发送请求后会等待服务端的即时响应,期间可能会被阻塞。这是一种直接的、同步的交互方式。
  • 异步交互:与同步交互不同,异步模式下客户端在发送请求后不会被阻塞。服务端的响应可能不会立即到达。这通常通过消息代理来实现:一个独立的软件组件负责维护数据通道。一个服务在该通道上发布消息,而需要这些消息的服务则订阅它。这样,各服务可以在合适的时机异步地处理这些数据。

从业务逻辑的角度来看,如果某个任务可以异步完成,那么最好采用异步方式。这不仅提高了系统的稳定性,还有助于实现负载均衡。

步骤 5:测试与部署

在微服务测试方面,与传统单体应用有明显的不同。在单体应用架构中,整个程序可以作为一个紧密耦合的单元进行全面测试。然而,在微服务架构中,应用由多个服务组成,这些服务可能无法同时进行测试,从而增加了端到端测试的复杂性。这一点要求我们采用不同的测试策略。

针对微服务,我们通常会进行以下几种类型的测试:

  • 单元测试:专门针对单一服务的功能性进行测试。
  • 集成测试:确保不同服务之间能够顺畅地协同工作。
  • 性能测试:评估整个系统的响应速度和稳定性。
  • 组件测试:对单个服务的各个组件进行测试。
  • 契约测试:验证用户与服务间的交互是否符合预定规范。
  • 端到端测试:全面检查应用程序的性能和功能。

这些测试类型旨在确保微服务不仅单独,而且在整体上都能满足业务需求。然而,测试微服务也面临一系列挑战。

例如,一个微服务中出现的错误可能会引发一连串的问题,这大大增加了根因分析的复杂性。由于微服务间通常通过多种方式和协议进行通信,这就需要具备专门的技术知识和能力。加上需要测试多个接口点,并且自动化测试在这里尤为重要,因此熟练掌握脚本编写和自动化测试工具变得尤为关键。

微服务开发:挑战与最佳方案

微服务开发面临一系列特有的挑战,因此需要一套全面的方法论来应对。对这些问题的早期认识和解决,是微服务成功部署的关键。

数据一致性

在微服务架构中,确保各个服务之间事务的准确性和数据的一致性是一大挑战。虽然没有一种“万能”的解决方案,但有一些普遍适用的管理数据的原则。

在需要强一致性的业务场景中,某个服务可以作为特定数据实体的主要数据源。其他服务可以通过 API 接口来访问这个主数据源。某些服务可能会维护部分数据副本或版本,但这些都应与主数据源保持一致。

以电子商务系统为例,可能存在一个专门处理客户订单的服务和一个负责推荐的服务。推荐服务虽然能感知订单服务的活动,但在如客户退款等特殊情况下,订单服务仍然是完整交易记录的权威来源。

因此,经验丰富的开发者需要先了解具体业务场景的需求。然后,他们可以灵活选择最适合的数据一致性保证方法。

团队组织与协作

在微服务的开发过程中,不同的团队可能有各自的管理风格和开发方法论。因此,建立一个明确的团队间沟通和协作机制是至关重要的,尤其是当工作需要在内部团队和外包团队之间协作时。

一个高度正规的组织结构可能让各团队能有效地开发自己的服务。然而,如果忽视与其他团队服务的集成,可能会出现数据格式不一致等问题。因此,项目中需要有一个“协调者”角色,负责统筹各个团队的工作。

从更高的层面来看,康威定律告诉我们,软件系统的架构往往会反映其开发团队的组织结构。因此,如果目标是构建一个由多个自治服务组成的系统,那么首先应该组织多个小型、自治的开发团队,并确保他们能够有效地进行沟通和协作。

DevOps 的角色与挑战

在微服务架构中,DevOps 扮演着至关重要的角色,因为这种架构本身具有更高的复杂性。在这样的环境下,需要精细地协调各个微服务的部署,以确保它们能够无缝地互相协作。这尤其重要,因为微服务之间通常是紧密相连的,并且可能会有向后不兼容的变更。因此,提前解决所有依赖关系并采用灵活的工具,如 Kube.NETes 和 Docker,非常关键。DevOps 工程师在这方面起到了至关重要的支持作用。

此外,微服务架构也使得故障排查更加具有挑战性。与单体架构相比,在微服务环境中,准确地定位问题的根源更加困难。这是因为一个服务可能会接收数据并传递给另一个服务,这样就增加了确定问题所在环节的复杂性和耗时。为了解决这一问题,必须集成集中式的日志聚合工具、部署编排系统和分布式追踪系统。这样做能让整个系统更容易管理。

总结与建议

当企业决定向微服务架构迁移时,需要全面考虑多个方面。这包括确定哪些系统组件适合迁移到微服务、如何管理数据、如何构建高效的基础设施,以及如何组织和协调团队的工作。在这一过程中,与经验丰富的工程师和解决方案架构师的紧密合作是实现目标的关键。

译者介绍

刘汪洋,51CTO社区编辑,昵称:明明如月,一个拥有 5 年开发经验的某大厂高级 JAVA 工程师,拥有多个主流技术博客平台博客专家称号。

原文标题:How to Migrate from Monolith to Microservices: Challenges and Best Practices,作者:MobiDev



Tags:架构   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  Search: 架构  点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27  Search: 架构  点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  Search: 架构  点击:(10)  评论:(0)  加入收藏
京东小程序数据中心架构设计与最佳实践
一、京东小程序是什么京东小程序平台能够提供开放、安全的产品,成为品牌开发者链接京东内部核心产品的桥梁,致力于服务每一个信任我们的外部开发者,为不同开发能力的品牌商家提...【详细内容】
2024-03-27  Search: 架构  点击:(9)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  Search: 架构  点击:(23)  评论:(0)  加入收藏
全程回顾黄仁勋GTC演讲:Blackwell架构B200芯片登场
北京时间3月19日4时-6时,英伟达创始人黄仁勋在美国加州圣何塞SAP中心登台,发表GTC 2024的主题演讲《见证AI的变革时刻》。鉴于过去一年多时间里AI带来的生产力变革,以及英伟达...【详细内容】
2024-03-19  Search: 架构  点击:(17)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13  Search: 架构  点击:(6)  评论:(0)  加入收藏
有了LLM,所有程序员都将转变为架构师?
编译 | 言征 出品 | 51CTO技术栈(微信号:blog51cto)生成式人工智能是否会取代人类程序员?可能不会。但使用生成式人工智能的人类可能会,可惜的是,现在还不是时候。目前,我们正在见...【详细内容】
2024-03-07  Search: 架构  点击:(19)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  Search: 架构  点击:(36)  评论:(0)  加入收藏
通用数据湖仓一体架构正当时
这篇博文中提出的建议并不新鲜。事实上许多组织已经投入了数年时间和昂贵的数据工程团队的工作,以慢慢构建这种架构的某个版本。我知道这一点,因为我以前在Uber和LinkedIn做过...【详细内容】
2024-01-15  Search: 架构  点击:(76)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(9)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条