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

news2024/11/27 8:36:22

多年来,我处理过多个单体应用,并将其中一些迁移到了微服务架构。我打算写下我所学到的东西以及我从经验中用到的策略,以实现成功的迁移。在这篇文章中,我将以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,多数据库管理平台(私有云)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1296169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

医院信息系统源码,采用JAVA编程,支持跨平台部署应用,满足一级综合医院(专科二级及以下医院500床)的日常业务应用

医院HIS系统源码,HIS系统全套源码,支持电子病历4级,自主版权 his医院信息系统内设门诊/住院医生工作站、门诊/住院护士工作站。各工作站主要功能依据职能要求进行研发。如医生工作站主要功能为编辑电子病历、打印、处理医嘱;护士工…

LAMP安装部署网站

目录 什么是LAMP? 实验(搭建一个论坛) 一,安装apache 1.关闭防火墙,将安装Apache所需软件包传到/opt目录下 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径,并把httpd服务的可执行程序文件…

本科毕业论文查重的依据

大家好,今天来聊聊本科毕业论文查重的依据,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧: 本科毕业论文查重依据:维护学术诚信的基石 摘要: 本科毕业论文是衡量学生学…

“探究HarmonyOS:深入解析鸿蒙操作系统架构”

前言 一、鸿蒙操作系统是什么? 二、为什么要学习鸿蒙操作系统 1.从开发者角度看: 2.从使用者角度看: 总结 前言 随着智能化时代的到来,操作系统的发展也越来越快,人们对于智能化生活的需求也越来越强烈。鸿蒙操作系统作…

idea__SpringBoot微服务05——JSR303校验(新注解)(新的依赖),配置文件优先级,多环境切换

JSR303校验,配置文件优先级,多环境切换 一、JSR303数据校验二、配置文件优先级三、多环境切换一、properties多环境切换二、yaml多环境切换————————创作不易,如觉不错,随手点赞,关注,收藏(*&#x…

华为数通---配置Smart Link主备备份示例

定义 Smart Link,又叫做备份链路。一个Smart Link由两个接口组成,其中一个接口作为另一个的备份。Smart Link常用于双上行组网,提供可靠高效的备份和快速的切换机制。 目的 下游设备连接到上游设备,当使用单上行方式时&…

HarmonyOS应用程序框架——UIAbility实操

UIAbility概述 UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互。UIAbility也是系统调度的单元,为应用提供窗口在其中绘制界面。 每一个UIAbility实例,都对应于一个最近任务列表中的任务。 一个应用可以有一个UIAbility&…

【LuatOS】笔记(二)基础框架

开发环境搭建 合宙官方搭建的是:vscodeLuatOS-SOC推荐拓展包(vscode插件),原文链接:LuatOS开发环境搭建。安装完创建项目文件,创建main.lua文件,就可以开始编写了。 函数与使用 LuatOS-SOC接口文档1,该文档…

OpenCL学习笔记(四)手动编译开发库(ubuntu+gcc+rk3588)

前言 笔者本次使用的是RK3588的开发板,内部烧写的是ubuntu20.04,gcc版本是9 本文档简单记录下编译的过程,有需要的小伙伴可以参考下 一、安装所需软件 1.安装git,教程比较多,不再重复 2.安装cmake,教程…

SSL 协议

SSL 是用于安全传输数据的一种通信协议。它采用公钥加密技术、对称密钥加密技术等保护两个应用之间的信息传输的机密性和完整性。但是,SSL 也有一个不足,就是它本身不能保证传输信息的不可否认性。 SSL 协议包括服务器认证、客户认证、SSL 链路上的数据完…

【qt】Qt+OpenCv读取带有中文路径的图片

【opencv4.5.1版本】下载exe解压即可。。。https://opencv.org/releases/page/2/ 【qt5.15.2】 pro文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to …

CentOS 7.9安装宝塔面板,安装gitlab服务器

docker安装方式比较慢,安装包1.3GB 安装后启动很慢 docker logs q18qgztxdvozdv_gitlab-ce-gitlab-1 docker ps docker exec -it q18qgztxdvozdv_gitlab-ce-gitlab-1 sh cd /etc/gitlab cat initial_root_password 软件商店安装方式,失败了2023.12…

日志门面slf4j和各日志框架

简介 简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Java日志访问提供一套标准、规范的API框架, 其主要意义在于提供接口,具体的实现可以交由其他日志框架,如log4j、logback、log4j2。 对于一般的Java项目而言&#xff…

在线教育小程序正在成为教育行业的新生力量

教育数字化转型是目前教育领域的一个热门话题,那么到底什么是教育数字化转型?如何做好教育数字化转型? 教育数字化转型是利用信息技术和数字工具改变和优化教育的过程。主要特征包括技术整合、在线学习、个性化学习、大数据分析、云计算、虚拟…

Linux下通过find找文件---通过修改时间查找(-mtime)

通过man手册查找和-mtime选项相关的内容 man find | grep -A 3 mtime # 这里简单介绍了 -mtime ,还有一个简单的示例-mtime n Files data was last modified n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretati…

芯片-开发板设计相关收集

在高性能计算、消费类电子、通信与汽车应用领域中, SoC是一种主要的芯片产品形态。SoC与ASIC最大的区别就是形成了一个完整的片上系统,其中包括计算、存储、外设以及层次化总线等子系统,由此在一颗芯片上实现了一个完整的计算机系统结构组成 …

常见的中间件--消息队列中间件测试点

最近刷题,看到了有问中间件的题目,于是整理了一些中间件的知识,大多是在小破站上的笔记,仅供大家参考~ 主要分为七个部分来分享: 一、常见的中间件 二、什么是队列? 三、常见消息队列MQ的比较 四、队列…

【开源】基于JAVA的木马文件检测系统

项目编号: S 041 ,文末获取源码。 \color{red}{项目编号:S041,文末获取源码。} 项目编号:S041,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 木马分类模块2.3 木…

从互联网到云计算再到 AI 原生,百度智能云数据库的演进

1 数据库行业发展概述 如果说今年科技圈什么最火,我估计大家会毫不犹豫选择 ChatGPT。ChatGPT 是 2022 年 11 月 30 日由 OpenAI 发布的聊天应用。它创造了有史以来用户增长最快的纪录:自 11 月 30 日发布起,5 天就拥有了 100 万活跃用户&am…

红队攻防实战之Redis-RCE集锦

心若有所向往,何惧道阻且长 Redis写入SSH公钥实现RCE 之前进行端口扫描时发现该机器开着6379,尝试Redis弱口令或未授权访问 尝试进行连接Redis,连接成功,存在未授权访问 尝试写入SSH公钥 设置redis的备份路径 设置保存文件名 …