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

多年来,我处理过多个单体应用,并将其中一些迁移到了微服务架构。我打算写下我所学到的东西以及我从经验中用到的策略,以实现成功的迁移。在这篇文章中,我将以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.mzph.cn/news/209019.shtml

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

相关文章

云原生系列1

1、虚拟机集群环境准备 VirtualBox类似vmware的虚拟化软件,去官网https://www.virtualbox.org/下载最新版本免费的,VirtualBox中鼠标右ctrl加home跳出鼠标到wins中。 VirtualBox安装步骤 https://blog.csdn.net/rfc2544/article/details/131338906 cent…

微信小程序:button微信开放能力打开客服会话分享到聊天框

文档 https://developers.weixin.qq.com/miniprogram/dev/component/button.html 打开客服会话 按钮关键属性 open-type"contact"功能按钮 <button class"mo-open-type"open-type"contact"> </button>分享 <button class&q…

Hive HWI 配置

前言 1、下载安装好hive后&#xff0c;发现hive有hwi界面功能&#xff0c;研究下是否可以运行&#xff0c;于是使用hive –service hwi命令启动hwi界面报错。 启动hwi功能 2、访问192.168.126.110:9999/hwi&#xff0c;发现访问错误 一、HWI介绍 HWI&#xff08;Hive Web Int…

【前端】CSS基础(学习笔记)

一、简介 1、HTML局限性 HTML只关注内容的语义&#xff0c;但是丑&#xff01; 2、CSS概要 CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称&#xff0c;有时我们也会称之为 CSS 样式表或级联样式表。 CSS 是也是一种标记语言 CSS 主要用于设置 HTML 页面中的文本内…

blender 粒子系统 roughness 属性

粒子系统中的Roughness是一种用来控制粒子的随机性和不规则性的属性&#xff0c;它可以影响粒子的发射方向、速度、大小、旋转等。Roughness有以下几个子属性&#xff1a; - **Uniform**&#xff1a;这个属性用来控制粒子的发射方向的随机性&#xff0c;即粒子在法线方向上的偏…

托盘四向穿梭车自动化密集库供应|单机智能向系统智能跨越的HEGERLS托盘四向车系统

随着物流产业的迅猛发展&#xff0c;托盘四向穿梭式自动化密集仓储系统可认为是在穿梭车货架系统基础上提出的一种新仓储概念。托盘四向穿梭式立体库因其在流通仓储体系中所具有的高效密集存储功能优势、运作成本优势与系统化智能化管理优势&#xff0c;已发展为仓储物流的主流…

喜讯:加速度商城系统全系列产品品牌全新升级为Shopfa

2月1日讯&#xff1a;经过1年多的品牌文化塑造&#xff0c;深圳市加速度软件开发有限公司经过研究决定&#xff0c;将旗下的多商户商城系列、小程序商城系列、B2B商城系列、供应商集采系列、电子元器件商城系列、跨境独立站商城系列、MRO工业品商城系列、外卖商城系列、智慧零售…

重写 AppiumService 类,添加默认启动参数,并实时显示启动日志

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类&#xff0c;可以很方便的通过该类来管理Appium服务器的启动和停止。经过测试&#xff0c;使用该类的实例执行关闭server时&#xff0c;并没有释放端口号&#xff0c;会导致第二次启动时失败。另外&#xff0c;使用该…

6.2 U-boot 顶层 Makefile

一、U-boot工程目录分析 如果要分析uboot源码&#xff0c;首先要将uboot源码进行编译&#xff0c;编译需要在Ubuntu进行&#xff0c;把uboot文件放在一个目录下。 编译完成后的文件是这样&#xff1a; 我们需要看的文件夹如下。 1. arch 文件夹 从上图可以看出有很多架构&…

geolife笔记:整理处理单条轨迹

以 数据集笔记 geolife &#xff08;操作篇&#xff09;_geolife数据集-CSDN博客 轨迹为例 1 读取数据 import pandas as pd data pd.read_csv(Geolife Trajectories 1.3/Data//000/Trajectory/20081023025304.plt,headerNone, skiprows6,names[Latitude, Longitude, Not_Im…

【GEE笔记】在线分类流程,标注样本点、分类和精度评价

GEE在线分类流程 介绍 GEE&#xff08;Google Earth Engine&#xff09;是一个强大的地理信息处理平台&#xff0c;可以实现在线的遥感影像分析和处理。本文将介绍如何使用GEE进行在线的分类流程&#xff0c;包括标注样本点、分类和精度评价。本文以2020年5月至8月的哨兵2影像…

什么是散列函数

散列函数是一种公开的数学函数。散列函数运算的输入信息也可叫作报文。散列函数运算后所得到的结果叫作散列码或者叫作消息摘要。散列函数具有如下一些特点&#xff1a; &#xff08;1&#xff09;不同内容的报文具有不同的散列码&#xff0c;而一旦原始报文有任何改变&#xf…

__attribute__ 详解

GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。 特征: __attribute__书写特征是: __attribute__前后都有两个下划线,并切后面会紧…

文件管理和操作工具Path Finder mac功能介绍

Path Finder mac是一款Mac平台上的文件管理和操作工具&#xff0c;提供了比Finder更丰富的功能和更直观的用户界面。它可以帮助用户更高效地浏览、复制、移动、删除和管理文件&#xff0c;以及进行各种高级操作。 Path Finder mac软件功能 - 文件浏览&#xff1a;可以快速浏览文…

【数据结构 — 排序 — 插入排序】

数据结构 — 排序 — 插入排序 一.排序1.1.排序的概念及其运用1.1.1排序的概念1.1.2排序运用1.1.3 常见的排序算法 二.插入排序2.1.直接插入排序2.1.1.算法讲解2.1.2.代码实现2.1.2.1.函数定义2.1.2.2.算法接口实现2.1.2.3.测试代码实现2.1.2.4.测试展示 2.2.希尔排序2.2.1.算法…

ASO优化:帮助实现企业和用户的共赢

大数据时代APP拉获新客&#xff0c;ASO优化应该这么玩&#xff01; 市场那么大&#xff0c;用户那么广。企业设计的APP如何在茫茫人群中精准地把自己送到用户面前&#xff0c;并与ta产生沟通呢。随着时代的发展&#xff0c;数据成为企业竞争的核心。APP的营销发展离不开数据推…

gcc tips - GCC使用技巧与高级特性

目录 1. 获取 GCC 编译器预定义的宏 2. 列出依赖的头文件 3. 保存预处理结果到文件&#xff08;展开define, 展开include header&#xff09; 4. 写回调跟踪记录函数运行 -finstrument-functions 5. -fdump-rtl-expand 画函数调用关系图 GCC&#xff0c;全称GNU Compiler …

第一课【习题】三方库

三方组件是开发者在系统能力的基础上进行了一层具体功能的封装&#xff0c;对其能力进行拓展的工具 。 可以通过ohpm uninstall 指令下载指定的三方库 lottie使用loadAnimation方法加载动画。 通过ohpm安装lottie后&#xff0c;在哪个文件中会生成相关的配置信息&#xf…

C++ - 哈希

在顺序结构以及平衡树中&#xff0c;由于元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较&#xff1b;比如顺序表中需要从表头开始依次往后比对寻找&#xff0c;查找时间复杂度为 O(N)&#xff0c;平衡树中需…

快速登录界面关于如何登录以及多账号列表解析以及config配置文件如何读取以及JsLogin模块与SdoLogin模块如何通信(4)

1、### Jslogin模块与前端以及JsLogin模块与Sdologin的交互 配置文件的读取: <CompanyIdForQq value"301"/> <CompanyIdForWx value"300"/><CompanyIdForWb value"302"/><qq value"https://graph.qq.com/oauth2.0/au…