当前位置: 首页 > news >正文

将单体应用程序迁移到微服务

多年来,我处理过多个单体应用,并将其中一些迁移到了微服务架构。我打算写下我所学到的东西以及我从经验中用到的策略,以实现成功的迁移。在这篇文章中,我将以AWS为例,但基本原则保持不变,可用于任何类型的基础设施。

单体架构

单体架构是一个大型代码存储库,所有功能都在一个地方实现。随着应用程序功能和复杂性的增加,这使得它变得复杂且难以维护。代码存储库不仅包含支持相关功能的所有核心逻辑,还包含支持不相关功能的代码。即使是一个小错误修复或功能发布也需要测试才能完成应用程序。我遇到的主要痛点是:

  1. 协作:有“n”个工程师在一个存储库上工作。因此,合并冲突的可能性很大,这会导致解决冲突而不是专注于核心开发带来不必要的负担,从而减慢了功能发布的速度。

  2. Bug:随着时间的推移,关注点分离、代码质量和最佳实践都会逐渐消失。因此,很可能会引入不相关功能的错误。通常,我们对核心功能进行健全性测试,但会错过这些错误,或者发现自己惊讶地发现与遥远无关的更改的错误。

  3. 生产时间:在单体系统中,由于各种因素,创新的步伐受到阻碍。即使有完整的CI/CD系统和所有测试,由于仓库和测试的规模,开发测试、集成测试等需要时间,发布到生产也需要时间。

  4. 技术栈:单体系统在单一技术栈中实现,这限制了适应新兴技术的灵活性。此外,这也引入了学习曲线。

  5. 故障隔离:单体系统将所有组件捆绑在一起,一个模块/组件的故障可能会导致整个系统故障。

  6. 修复时间:有时,识别错误并修复它并不容易。由于不同的组件捆绑在一起,一个模块的更改可能会导致另一个模块出现问题。这会增加调试、修复并将补丁应用到生产的时间。

  7. 可扩展性:在单体系统中,扩展就时间和成本而言并不总是容易的。由于单体包含了所有组件,有很高的几率某些组件/代码块被大量使用,而其他则较少。因此,如果某个组件需要水平扩展,整个系统都需要扩展。

除了上述问题之外,还有其他问题。话虽如此,单体架构并不总是一个糟糕的选择,并且有多种优点:

  1. 快速实施,快速失败:在快节奏的环境中,没有自由遵循所有最佳实践并等待实施适当的软件应用程序来测试其产品市场适应性,总是首选实施 MVP 并进行 UAT了解 PMF。

  2. 开发:由于单体系统的所有组件都在单个代码库中实现,因此没有服务间通信/协作的开销,并且实现速度更快。

  3. 运营开销:只有一个系统需要处理。可以轻松实现警报监控并确保应用程序健康运行。这也减少了维护各种服务的运营开销。

  4. 性能:将所有代码集中在一处,操作可以更快。同样,这也取决于整体的大小和组件。

这些优势是根据具体情况而定的,并且在很大程度上取决于单体应用所实现的功能的大小。

典型的单体流程

图片

这是单体应用程序的典型流程,其中:

  1. 托管应用程序的基础设施由负载均衡器支持

  2. DNS 映射将交互重定向到基础设施,然后调用业务逻辑

  3. 实现单个数据库来保存数据

  4. 为了优化,可以有一个缓存层

  5. 为了完成用户请求,各个下游系统之间可能存在交互,编排在基础设施层内进行管理

这简化了很多事情,例如:

  1. 路由:所有流量路由到在单个或多个基础设施上运行的单个代码

  2. 数据库:无需担心数据隔离、数据共享等问题,数据由单个应用程序访问。

  3. Authn 和 Authz:单点身份验证实现易于实现和管理。

微服务

近年来,微服务模式开始流行并证明了自己。实施、管理、贡献和扩展这些服务变得更加容易。微服务可以小到单个 API 到多个相互相关的功能 API。使用微服务有多种好处,例如:

  1. 易于开发:开发、部署、测试和管理微服务的速度更快。相关功能可以组合在一起并独立开发。

  2. 调试:更容易调试、修复和部署。

  3. 可扩展性:根据需要,可以在不影响其他微服务的情况下扩展不同的微服务。

  4. 技术堆栈:灵活选择不同的堆栈来实现不同的功能

还有其他好处。话虽如此,微服务不仅仅带来好处,但也存在陷阱,例如:

  1. 成本:每个服务都在独立的基础设施上运行,这可能会导致更高的成本

  2. 运营:与越来越多的微服务相关的运营开销将会越来越多

  3. 依赖性:一个微服务可能依赖于许多其他微服务,这可能会导致延迟、authn、authz、隔离挑战

  4. 数据一致性:每个微服务可以有自己的数据存储。数据同步在分布式系统中也有其自身的问题。

典型的微服务流程

图片

迁移策略

将单体系统迁移到微服务并不是一件容易且简单的任务。在继续之前,需要从代码、功能、依赖关系等方面全面了解单体系统。一旦记录:

  1. 确定可以组合在一起的常见功能部分。这将帮助您设计所需的各种微服务。一旦确定,您就可以独立设计单独的服务。

  2. 一旦确定了所需的各种微服务,您可能需要一个编排层。例如,早些时候,单个端点足以让网页与整体交互,但对于微服务,每个端点都将具有单独的端点。我更喜欢BFF(Backend For Frontend)编排层,它将编排从前端到不同微服务的调用。

  3. 身份验证和授权是应用程序的一个非常重要的方面。对于微服务,每个微服务都有责任进行身份验证和授权。确定保护每个微服务的身份验证机制。

  4. 数据存储是另一个需要适当研究的方面。建议隔离每个微服务中的相关数据,但在某些情况下可能无法完全隔离。在这种情况下,识别此类数据并制定适当的实施计划来缓解任何竞争条件、数据泄漏、数据共享等。

  5. 可能存在一些常见的功能,例如从数据库读取、写入数据库、从缓存读取等,这些功能可以抽象为公共库并在这些微服务中使用。

  6. 建立通用的编码实践。对于各种不同的服务,不同的服务中可能存在不同的编码约定或实践。建立一个共同点将使其成为各种微服务的标准。

  7. 发布计划是另一个重要方面。这包括部署策略、识别 UAT 客户、测试计划、回滚计划等。

  8. Canary服务对于您的迁移非常重要。这将提供您的微服务运行状况的清晰画面。

  9. 比较器服务是另一个重要的部分。设计一项服务,将您的流量路由到整体服务和微服务。该服务将比较整体式服务和微服务的结果以确保数据准确性,以避免任何过度暴露信息的安全事件。一旦您有足够的信心,就可以将路由从整体更改为微服务。

  10. 操作健康状况和回滚策略是其他需要考虑的问题。制定明确的事件操作手册和缓解计划。

  11. 为每个微服务实施扩展以避免任何停机。


作者:Pranav Kumar Chaudhary

更多技术干货请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

irds.cn,多数据库管理平台(私有云)。

相关文章:

将单体应用程序迁移到微服务

多年来,我处理过多个单体应用,并将其中一些迁移到了微服务架构。我打算写下我所学到的东西以及我从经验中用到的策略,以实现成功的迁移。在这篇文章中,我将以AWS为例,但基本原则保持不变,可用于任何类型的基…...

Python读取.dat格式数据并转为.png,.jpg,.bmp等可视化格式(附代码)

.dat文件的命名规则没有统一的规定,但通常以.dat为扩展名。 目录 一、 .dat格式数据1.1 .dat数据用途1.2 常见的.dat文件格式1.3 .dat文件示例 二、读取.dat格式数据2.1 单个.dat文件读取并转换2.1.1 代码2.1.2 查看数据2.1.3 输出查看8Bit图片 2.2 批量.dat文件读取…...

matplotlib 默认属性和绘图风格

matplotlib 默认属性 一、绘图风格1. 绘制叠加折线图2. Solarize_Light23. _classic_test_patch4. _mpl-gallery5. _mpl-gallery-nogrid6. bmh7. classic8. fivethirtyeight9. ggplot10. grayscale11. seaborn12. seaborn-bright13. seaborn-colorblind14. seaborn-dark15. sea…...

ip地址怎么转化为十进制

​IP地址是在计算机网络中广泛使用的一种标识符,它用于唯一地标识网络上的设备。在网络通信过程中,IP地址扮演着非常重要的角色。但是,对于一些非专业人士来说,IP地址可能是一个陌生的概念。为了更好地理解IP地址,本文…...

【Spring进阶系列丨第五篇】详解Spring中的依赖注入

文章目录 一、说明二、构造函数注入2.1、方式一【index索引方式】2.1.1、定义Bean2.1.2、主配置文件中配置Bean2.1.3、测试 2.2、方式二【indextype组合方式】2.2.1、定义Bean2.2.2、主配置文件配置Bean2.2.3、测试2.2.4、解决方案 2.3、方式三【name方式】2.3.1、定义Bean2.3.…...

DAP数据集成与算法模型如何结合使用

企业信息化建设会越来越完善,越来越体系化,当今数据时代背景下更加强调、重视数据的价值,以数据说话,通过数据为企业提升渠道转化率、改善企业产品、实现精准运营,为企业打造自助模式的数据分析成果,以数据…...

大数据监控

HBase 监控 {name“RegionServer”,sub“Server”,} irate(hadoop_hbase_totalrequestcount[5m]) irate(hadoop_hbase_totalrequestcount{instanceName“hacluster4”}[2m]) https://blog.csdn.net/Samooyou/article/details/129275640 https://www.tencentcloud.com/zh/doc…...

【C语言】数据结构——小堆实例探究

💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 导读: 我们在前面学习了单链表和顺序表,以及栈和队列。 今天我们来学习小堆。 关注博主或是订阅专栏&a…...

Vue中比较两个JSON对象的差异

要在Vue.js中实现JSON数据的对比差异功能,你可以使用一些库来简化任务,比如diff-match-patch。以下是一个简单的例子,演示如何使用deep-diff库在Vue.js中比较两个JSON对象的差异: 首先,确保你的项目中已经安装了diff-m…...

前端知识库Html5和CSS3

1、常见的水平垂直居中实现方案 最简单的方案是flex布局 .container{display: flex;align-items: center;justify-content: center; }绝对定位配合margin:auto(一定要给.son宽高) .father {position: relative;height: 300px; } .son {position: absolute;top: 0;right: 0;b…...

智能优化算法应用:基于鸡群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于鸡群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于鸡群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鸡群算法4.实验参数设定5.算法结果6.参考文献7.MA…...

Apollo配置发布原理解析

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…...

TrustGeo论文问题理解

1、网络空间测绘中,如何理解地标? 在网络空间测绘中,地标可以理解为在互联网空间中具有明显特征和稳定性的实体,它们可以作为网络空间的基准点,用于定位和标识其他网络实体。地标通常是在网络空间中具有较高价值和影响…...

子查询在SQL中的应用和实践

作者:CSDN-川川菜鸟 在SQL中,子查询是一种强大的工具,用于解决复杂的数据查询问题。本文将深入探讨子查询的概念、类型、规则,并通过具体案例展示其在实际应用中的用途。 文章目录 子查询概念子查询的类型子查询的规则实际案例分析…...

C# Socket通信从入门到精通(14)——多个异步UDP客户端C#代码实现

前言: 在之前的文章C# Socket通信从入门到精通(13)——单个异步UDP客户端C#代码实现我介绍了单个异步Udp客户端的c#代码实现,但是有的时候,我们需要连接多个服务器,并且对于每个服务器,我们都有一些比如异步发送、异步接收的操作,那么这时候我们使用之前单个异步Udp客…...

【教3妹学编程-算法题】需要添加的硬币的最小数量

3妹:2哥2哥,你有没有看到新闻, 有人中了2.2亿彩票大奖! 2哥 : 看到了,2.2亿啊, 一生一世也花不完。 3妹:为啥我就中不了呢,不开心呀不开心。 2哥 : 得了吧,你又不买彩票&…...

【异常解决】SpringBoot + Maven 在 idea 下启动报错 Unable to start embedded Tomcat(已解决)

Unable to start embedded Tomcat(已解决) 一、背景介绍二、原因分析2.1 网络上整理2.2 其他原因 三、解决方案 一、背景介绍 spring boot(v2.5.14) maven idea 启动项目 之前项目一直启动的好好的,都能正常运行。重启的时候突然就不能启…...

做题总结 707. 设计链表

做题总结 707. 设计链表 leetcode中单链表节点的默认定义我的尝试正确运行的代码(java) leetcode中单链表节点的默认定义 class ListNode {int val;ListNode next;//无参public ListNode() {}//有参:1public ListNode(int val) {this.val val;}//有参:…...

django实现--视图的使用

在 Django 中,视图是处理 Web 请求并返回 Web 响应的组件。Django 提供了两种主要类型的视图:基于函数的视图和基于类的视图。下面详细解释基于类的视图的实现方法、使用以及与基于函数的视图的异同。 基于类的视图的实现方法 继承 Django 的类视图基类…...

【dirty cred】fileManager [XXX]

前言 这应该不是个题,应该是佬为了测试 dirty cred 利用写的。但是环境有问题,测试最多只能向文件中写入 1024MB 的数据。所以竞争窗口太短了,但是似乎替换 credential obj 又是成功的了。感觉是环境的问题。 漏洞分析与利用 一次任意释放…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...