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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8 个顶级的 PDF 转 Word 转换器

PDF 是跨不同平台分发信息而不影响内容格式的好方法。但这种安全级别确实有其缺点。没有直接的方法来编辑 PDF 上的文本或内容。编辑 PDF 文档的唯一方法是将其转换为 Word 文档或其他可以编辑的文件类型。将 PDF 转换为 Word 是根据需要编辑 PDF 内容的最快方法。有许多免费的…

WeLive开源在线客服系统源码 /PHP企业级在线客服聊天系统源码/支持移动+PC端+中英文双语自由切换

源码简介: WeLive开源在线客服系统源码 ,它作为企业级在线客服系统源码,可以支持移动PC端,中英文双语自由切换。 WeLive开源PHP在线客服系统源码 WeLive5是一个企业级的在线客服系统, 程序小巧使用简单。 WeLive5是一个企业级的…

C# WPF上位机开发(简易图像处理软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 图像处理是工业生产重要的环节。不管是定位、测量、检测还是识别,图像处理在工业生产中扮演重要的角色。而c#由于自身快速开发的特点&a…

28BYJ-48步进电机的驱动

ULN2003的工作原理 28BYJ48可以用ULN2003来驱动,STM32使用开漏模式外接5V上拉电阻也可以产生5V电压,为什么不直接使用单片机的 GPIO来驱动的原因是虽然电压符合电机的驱动要求,但单片机引脚产生的驱动电流太小,因此驱动步进电机要…

go语言 grpc 拦截器

文章目录 拦截器服务端拦截器一元拦截器流拦截器 客户端拦截器一元拦截器流拦截 多个拦截器 代码仓库 拦截器 gRPC拦截器(interceptor)是一种函数,它可以在gRPC调用之前和之后执行一些逻辑,例如认证、授权、日志记录、监控和统计…

CSS——标准流、浮动、Flex布局

1、标准流 标准流也叫文档流,指的是标签在页面中默认的排布规则,例如:块元素独占一行,行内元素可以一行显示多个。 2、浮动 作用:让块元素水平排列 属性名:float 属性值: left:…

ubuntu22.04 安装nvidia GPU显卡驱动

下载 https://www.nvidia.com/Download/index.aspx 删除原有的NVIDIA驱动程序 sudo apt-get remove –purge nvidia*禁用nouveau 默认情况下,Ubuntu采用开源的nouveau驱动程序作为Nvidia显卡的驱动,需要将其禁用 打开编辑配置文件: sudo …

【MySQL】MySQL的varchar字段最大长度是65535?

在MySQL建表sql里,我们经常会有定义字符串类型的需求。 CREATE TABLE `user` ( `name` varchar(100) NOT NULL DEFAULT COMMENT 名字) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ; 比方说user表里的名字,就是个字符串。MySQL里有两个类型比较适合这个场景。 char和varchar。…

Python GUI教程:轻松构建用户界面

大家好,从网络开发到数据科学,Python被广泛应用于各个领域。本文将探索Python内置的用于创建图形用户界面(GUI)的库:Tkinter。无论是初学者还是经验丰富的开发者,了解如何创建Python GUI都可以增强构建交互…

Python VSCode 配置固定的脚本入口

Python VSCode 配置固定的脚本入口 打开或者新建一个启动配置 选择 .vscode目录下 launch.json文件 将 “program”: “${file}” 替换成 “program”: “mian.py”, //完成你自己的入口.py文件名即可 json启动配置文件 {// Use IntelliSense to learn about possible attrib…

微信小程序引入Vant Weapp修改样式不起作用,使用外部样式类进行覆盖

一、引入Vant Weapp后样式问题 在项目中使用第三方组件修改css样式时,总是出现各种各样问题,修改的css样式不起作用,没有效果,效果不符合预期等。 栗子(引入一个搜索框组件)实现效果: 左侧有一个搜索文字背景为蓝色,接着跟一个搜索框 wxml <view class"container&q…

解决Idea右侧无Maven选项的问题

在创建 Spring / SpringBoot 项目的时候可能会遇到没有 Maven 选项的问题&#xff0c;如下图&#xff1a; 我们通常这样解决&#xff1a;

解决微信小程序中 ‘nbsp;‘ 空格不生效的问题

在微信小程序开发中&#xff0c;我们经常会使用 来表示一个空格。这是因为在 HTML 中&#xff0c;空格会被解析为一个普通字符&#xff0c;而不会产生实际的空白间距。而 是一种特殊的字符实体&#xff0c;它被解析为一个不可见的空格&#xff0c;可以在页面上产生真正的空…

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

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

【微软技术栈】发布自己造的轮子 -- 创建Nuget包(分布操作)

目录 1、您的项目 2、创建 .nuspec 文件 3、一张图片胜过一千个拉取请求 4、包括自述文件 MD 文件 5、构建软件包 6、将包部署到 Nuget.Org 7、手动上传软件包 8、自动化和脚本化部署 9、我们如何构建和部署 ErrLog.IO Nuget 包 10、Nuget统计数据 11、最后的思考 创建 Nuget 包…

Vue3使用Tailwind CSS

安装 Tailwind 以及其它依赖项 npm install -D tailwindcsslatest postcsslatest autoprefixerlatest生成配置文件&#xff1a; npx tailwindcss init -p.修改配置文件 tailwind.config.js 2.6版本 &#xff1a; module.exports {purge: [./index.html, ./src/**/*.{vue,j…

结合ColorUI组件开发微信小程序

1.自定义组件生命周期函数&#xff1a; Component({data: {},attached() {console.log("自定义组件生命周期函数 attached--先执行");this.getPos();},ready() {console.log("ready生命周期函数---在attached之后执行")},methods: {getPos() {var that th…

macOS Big Sur/Mac电脑安装vscode显示您没有权限来打开应用程序‘Visual Studio Code‘ 请联系您的电脑或网络管理员问题修复

错误方法 首先我以为我的权限不足。&#xff0c;需要去用户群组里设置。结果根本不是这个的问题。 1.在系统偏好设置->用户与群组检查了一下我的用户是不是管理员 结果发现是管理员 2.根据苹果提示&#xff0c;右键我的文件夹->显示简介->最下面的共享与权限 解锁&…

【Linux】进程间通信之管道--命名管道匿名管道通信进程池设计

文章目录 一、进程间通信介绍1.什么是通信2.为什么要有通信以及如何进行通信 二、管道1.什么是管道2.匿名管道2.1什么是匿名管道2.2接口认识--pipe2.3进程间通信之匿名管道实现2.4读写特征2.5管道的特征2.6 进程池设计 3.命名管道3.1创建一个命名管道3.2用命名管道实现server&a…

大数据技术3:数据仓库的ETL和分层模型

前言&#xff1a;我们先了解一下数据仓库架构的演变过程。 1 、数据仓库定义 数据仓库是一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的&#xff08;Integrate&#xff09;、相对稳定的&#xff08;Non-Volatile&#xff09;、反映历史变化&#xff08;Time…