从单体式架构迁移到微服务架构

2023-05-16

迁移到微服务综述

迁移单体式应用到微服务架构意味着一系列现代化过程,有点像这几代开发者一直在做的事情,实时上,当迁移时,我们可以重用一些想法。

一个策略是:不要大规模(big bang)重写代码(只有当你承担重建一套全新基于微服务的应用时候可以采用重写这种方法)。重写代码听起来很不错,但实际上充满了风险最终可能会失败,就如 Martin Fowler 所说:“the only thing a Big Bang rewrite guarantees is a Big Bang!”

相反,应该采取逐步迁移单体式应用的策略,通过逐步生成微服务新应用,与旧的单体式应用集成,随着时间推移,单体式应用在整个架构中比例逐渐下降直到消失或者成为微服务架构一部分。这个策略有点像在高速路上限速到 70 迈对车做维护,尽管有挑战,但是比起重写的风险小很多。

Martin Fowler 将这种现代化策略成为绞杀(Strangler)应用,名字来源于雨林中的绞杀藤(strangler vine),也叫绞杀榕 (strangler fig)。绞杀藤为了爬到森林顶端都要缠绕着大叔生长,一段时间后,树死了,留下树形藤。这种应用也使用同一种模式,围绕着传统应用开发了新型微服务应用,传统应用会渐渐退出舞台。

我们来看看其他可行策略。

策略 1——停止挖掘

Law of Holes 是说当自己进洞就应该停止挖掘。对于单体式应用不可管理时这是最佳建议。换句话说,应该停止让单体式应用继续变大,也就是说当开发新功能时不应该为旧单体应用添加新代码,最佳方法应该是将新功能开发成独立微服务。如下图所示:

除了新服务和传统应用,还有两个模块,其一是请求路由器,负责处理入口(http)请求,有点像之前提到的 API 网关。路由器将新功能请求发送给新开发的服务,而将传统请求还发给单体式应用。

另外一个是胶水代码(glue code),将微服务和单体应用集成起来,微服务很少能独立存在,经常会访问单体应用的数据。胶水代码,可能在单体应用或者为服务或者二者兼而有之,负责数据整合。微服务通过胶水代码从单体应用中读写数据。​

微服务有三种方式访问单体应用数据:

  • 换气单体应用提供的远程 API
  • 直接访问单体应用数据库
  • 自己维护一份从单体应用中同步的数据

胶水代码也被称为容灾层(anti-corruption layer),这是因为胶水代码保护微服务全新域模型免受传统单体应用域模型污染。胶水代码在这两种模型间提供翻译功能。术语 anti-corruption layer 第一次出现在 Eric Evans 撰写的必读书 Domain Driven Design,随后就被提炼为一篇白皮书。开发容灾层可能有点不是很重要,但却是避免单体式泥潭的必要部分。

将新功能以轻量级微服务方式实现由很多优点,例如可以阻止单体应用变的更加无法管理。微服务本身可以开发、部署和独立扩展。采用微服务架构会给开发者带来不同的切身感受。

然而,这方法并不解决任何单体式本身问题,为了解决单体式本身问题必须深入单体应用​做出改变。我们来看看这么做的策略。

策略 2——将前端和后端分离

减小单体式应用复杂度的策略是讲表现层和业务逻辑、数据访问层分开。典型的企业应用至少有三个不同元素构成:

  1. 表现层——处理 HTTP 请求,要么响应一个 RESTAPI 请求,要么是提供一个基于 HTML 的图形接口。对于一个复杂用户接口应用,表现层经常是代码重要的部分。

  2. 业务逻辑层——完成业务逻辑的应用核心。

  3. 数据访问层——访问基础元素,例如数据库和消息代理。

在表现层与业务数据访问层之间有清晰的隔离。业务层有由若干方面组成的粗粒度(coarse-grained)的 API,内部包含了业务逻辑元素。API 是可以将单体业务分割成两个更小应用的天然边界,其中一个应用是表现层,另外一个是业务和数据访问逻辑。分割后,表现逻辑应用远程调用业务逻辑应用,下图表示迁移前后架构不同:​

单体应用这么分割有两个好处,其一使得应用两部分开发、部署和扩展各自独立,特别地,允许表现层开发者在用户界面上快速选择,进行 A/B 测试;其二,使得一些远程 API 可以被微服务调用。

然而,这种策略只是部分的解决方案。很可能应用的两部分之一或者全部都是不可管理的,因此需要使用第三种策略来消除剩余的单体架构。

策略 3——抽出服务

第三种迁移策略就是从单体应用中抽取出某些模块成为独立微服务。每当抽取一个模块变成微服务,单体应用就变简单一些;一旦转换足够多的模块,单体应用本身已经不成为问题了,要么消失了,要么简单到成为一个服务。

排序那个模块应该被转成微服务

一个巨大的复杂单体应用由成十上百个模块构成,每个都是被抽取对象。决定第一个被抽取模块一般都是挑战,一般最好是从最容易抽取的模块开始,这会让开发者积累足够经验,这些经验可以为后续模块化工作带来巨大好处。

转换模块成为微服务一般很耗费时间,一般可以根据获益程度来排序,一般从经常变化模块开始会获益最大。一旦转换一个模块为微服务,就可以将其开发部署成独立模块,从而加速开发进程。

将资源消耗大户先抽取出来也是排序标准之一。例如,将内存数据库抽取出来成为一个微服务会非常有用,可以将其部署在大内存主机上。同样的,将对计算资源很敏感的算法应用抽取出来也是非常有益的,这种服务可以被部署在有很多 CPU 的主机上。通过将资源消耗模块转换成微服务,可以使得应用易于扩展。

查找现有粗粒度边界来决定哪个模块应该被抽取,也是很有益的,这使得移植工作更容易和简单。例如,只与其他应用异步同步消息的模块就是一个明显边界,可以很简单容易地将其转换为微服务。

如何抽取模块

抽取模块第一步就是定义好模块和单体应用之间粗粒度接口,由于单体应用需要微服务的数据,反之亦然,因此更像是一个双向 API。因为必须在负责依赖关系和细粒度接口模式之间做好平衡,因此开发这种 API 很有挑战性,尤其对使用域模型模式的业务逻辑层来说更具有挑战,因此经常需要改变代码来解决依赖性问题,如图所示:

​一旦完成粗粒度接口,也就将此模块转换成独立微服务。为了实现,必须写代码使得单体应用和微服务之间通过使用进程间通信(IPC)机制的 API 来交换信息。如图所示迁移前后对比:

此例中,正在使用 Y 模块的 Z 模块是备选抽取模块,其元素正在被 X 模块使用,迁移第一步就是定义一套粗粒度 APIs,第一个接口应该是被 X 模块使用的内部接口,用于激活 Z 模块;第二个接口是被 Z 模块使用的外部接口,用于激活 Y 模块。

迁移第二步就是将模块转换成独立服务。内部和外部接口都使用基于 IPC 机制的代码,一般都会将 Z 模块整合成一个微服务基础框架,来出来割接过程中的问题,例如服务发现。

抽取完模块,也就可以开发、部署和扩展另外一个服务,此服务独立于单体应用和其它服务。可以从头写代码实现服务;这种情况下,将服务和单体应用整合的 API 代码成为容灾层,在两种域模型之间进行翻译工作。每抽取一个服务,就朝着微服务方向前进一步。随着时间推移,单体应用将会越来越简单,用户就可以增加更多独立的微服务。 将现有应用迁移成微服务架构的现代化应用,不应该通过从头重写代码方式实现,相反,应该通过逐步迁移的方式。有三种策略可以考虑:将新功能以微服务方式实现;将表现层与业务数据访问层分离;将现存模块抽取变成微服务。随着时间推移,微服务数量会增加,开发团队的弹性和效率将会大大增加。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从单体式架构迁移到微服务架构 的相关文章

  • 深入理解Spring的事件通知机制

    Spring作为一个优秀的企业级应用开发框架 xff0c 不仅提供了众多的功能模块和工具 xff0c 还提供了一种灵活高效的事件通知机制 xff0c 用于处理组件之间的松耦合通讯 本文将详细介绍Spring的事件通知机制的原理 使用方法以及
  • 人工智能未来是否会取代人类程序员?

    这个话题在近期来引起了很大讨论 xff0c 尤其是当GPT4发布后 xff0c 其展现出来的能力让很多岗位的从业者战战兢兢 xff0c 比如像程序员 xff0c 甚至有大佬跳出说三年 AI一定会取代程序员 人工智能和机器人是否会大规模取代人
  • 为什么说过早优化是万恶之源?

    Donald Knuth xff08 高德纳 xff09 是一位计算机科学界的著名学者和计算机程序设计的先驱之一 他被誉为计算机科学的 圣经 计算机程序设计艺术 的作者 xff0c 提出了著名的 大O符号 来描述算法的时间复杂度和空间复杂度
  • Linux parallel 命令使用手册

    文章目录 引言安装和配置GNU Parallel安装配置 GNU Parallel的基本用法GNU Parallel的高级用法1 在多个计算机上并行执行作业2 从文件中读取命令行参数3 生成详细的日志和报告 GNU Parallel的优缺点
  • 使用ffmpeg缩小视频体积的几种方式

    随着视频制作的普及 xff0c 视频文件的体积也越来越大 xff0c 给存储和传输带来了很大的困扰 为了解决这个问题 xff0c 我们可以使用FFmpeg这个强大的工具来缩小视频的体积 本文将介绍三种常用的方法 xff1a 调整视频的分辨率
  • 从CPU的视角看 多线程代码为什么那么难写!

    当我们提到多线程 并发的时候 xff0c 我们就会回想起各种诡异的bug xff0c 比如各种线程安全问题甚至是应用崩溃 xff0c 而且这些诡异的bug还很难复现 我们不禁发出了灵魂拷问 为什么代码测试环境运行好好的 xff0c 一上线就
  • ThreadPoolExecutor——高效处理并发任务的必备良器

    ThreadPoolExecutor 如何使用线程池状态线程池执行任务的过程阻塞队列拒绝策略线程池的监控和调优最佳实践总结 ThreadPoolExecutor是Java concurrent中用于管理线程池的类 xff0c 它是Execu
  • 使用ffmpeg拼接两张图片

    最近在工作中遇到了一个需求 xff0c 就是需要将两张图片拼接在一起 xff0c 作为一个封面图 如果只是临时拼接一张 xff0c 我们可以只用photoshop之类的图片编辑工具 xff0c 将两张图片拼接在一起 而我们的需要是需要实现自
  • 【python】解决[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1076)

    搜了两种方法都没解决这个问题 先介绍下两种方法 1 在代码首部增加如下代码 span class token keyword import span requests span class token punctuation span pa
  • 100G/40G/25G/10G网络测试解决方案

    一 100G概述 随着CDN等视频直播业务和P2P业务的快速发展 xff0c 带宽的要求越来越高 当前5G业务势头正盛 xff0c 其基于400G的主干网络通信业务也在积极部署之中 但当前在很多的业务场景中 xff0c 100G系统的部署仍
  • 交换机测试解决方案

    一 交换机测试概述 自 Kalpana 公司在 1990 年推出第一台以太网交换机以来 xff0c 交换机在30多年的时间内快速的发展 xff0c 成为当今应用最为广泛的网络设备 xff0c 成为整个互联网的基石 以太网交换机以其 高性能
  • IP网络性能测试工具——Renix Perf

    一 Renix Perf 基于软件的网络及应用服务性能测试工具 双臂测试 单臂测试 通过测试端点产生网络流量对网络性能进行测量 TCP UDP PING 语音 视频 HTTP FTP MAIL 组播 测试端点软件可以免费安装部署 二 部署方
  • 网络测试技术——802.1X_MD5认证(下篇)

    上篇我们讲到802 1X MD5的简介 认证过程 测试组网以及测试环境准备 xff0c 本期我们将为大家带来测试的详细步骤 xff1a 六 测试仪配置 1 占用端口 端口功能 xff08 1 xff09 端口1用来模拟DOT1X和发送流量
  • 网络测试技术——802.1X TLS认证(上篇)

    一 TLS认证简介 1 TLS认证 xff08 1 xff09 认证过程 最安全认证技术 实施最复杂 xff08 2 xff09 TLS双向证书认证 服务器对客户端进行认证 客户端对服务器进行认证 2 TLS认证过程 3 交换机认证模式 x
  • SRv6测试技术简介

    什么是SRv6 xff1f SRv6技术就是采用现有的IPv6转发技术 xff0c 通过扩展IPv6报文的头域 xff0c 实现类似标签转发的处理 SRv6将一些IPv6地址定义成实例化的SID xff08 Segment ID xff09
  • RENIX 软件RAW流发送——网络测试仪实操

    本文主要介绍了RENIX软件如何进行RAW流发送操作 文章通过预约端口 添加RAW流 修改负载 发送流量 查看流统计 数据包捕获六个步骤详细介绍了操作过程 步骤一 xff1a 预约端口 1 先安装RENIX软件 xff0c 正确安装情况下桌
  • RENIX软件OSPF和BFD、ISIS和BFD联动测试——网络测试仪实操

    本文介绍了RENIX软件BFD测试相关操作 xff0c 全文分为五大部分 第一部分为BFD概述 xff1b 第二部分为搭建OSPF和BFD联动测试环境 xff1b 第三部分为OSPF和BFD联动测试配置 xff1b 第四部分为搭建ISIS和
  • 信而泰 X-Snapper测试系统,助力家庭路由器IPv6支持度测试

    随着互联网的蓬勃发展 xff0c 宝贵而有限的IPv4地址资源一直在被分配使用 2019年11月25日 xff0c 负责英国 欧洲 中东和部分中亚地区互联网资源分配的欧洲网络协调中心 xff08 RIPE NCC xff09 宣布 xff0
  • 如何使用测试仪进行400G交换机性能测试

    一 400G以太网概述 400G以太网或400 Gigabit Ethernet 400GbE 由 IEEE P802 3bs Task Force 于 2017 年开发 xff0c 它使用与100 Gigabit Ethernet 大致相
  • 【python3】简易双因子Radius认证服务器,带UI界面

    需要将dictionary rfc2865放在运行的同级目录下 coding utf 8 from tkinter import from tkinter ttk import from tkinter import scrolledtex

随机推荐

  • 信而泰测试方案,助力客户打造网络安全防护“金钟罩”

    一 网络安全行业面临的挑战 据 Cybercrime Magazine 在最近一份报告中称 xff0c 仅2021年 xff0c 黑客攻击和各种网络犯罪就给全球经济造成了超过6万亿美元的损失 xff0c 预计到2025年 xff0c 此类犯
  • BGP BFD测试案例

    一 BFD原理 1 1 BFD技术简介 一种全网统一 检测迅速 监控网络中链路或者IP路由的双向转发连通状况 xff0c 并未上层应用提供服务的技术 1 2 BFD会话建立方式和监测机制 BFD的标识符 xff1a xff08 1 xff0
  • 数据中心典型测试场景浅析

    数据中心概述 数据中心泛指拥有众多服务器的大型机房 xff0c 通过利用通信运营商已有的互联网通信线路 带宽资源 xff0c 建立标准化的数据中心机房环境 xff0c 具有运行速度快 存储量大 安全性高等特点 数据中心东西向流量的占比更大
  • Vxlan协议原理及基本配置——网络测试仪实操手册

    一 Vxlan协议原理 1 Vxlan协议相关术语 一 缩略语 OSI中的概念 NVE Network Virtualization Edge 网络虚拟边缘节点 VTEP VXLAN Tunnel Endpoints xff0c VXLAN
  • 如何模拟VTEP下大量VM主机ARP消息——网络测试仪实操

    模拟VTEP下大量VM主机ARP消息 xff0c 按照下面的步骤 xff1a 1 打开 Renix 软件 xff0c 连接机框并预约测试端口 xff1b 2 创建一条RAW流量 xff08 Binding流量也可以 xff0c 这里用RAW
  • 信而泰自动化OSPFv2测试小技巧

    OSPFv2协议简介 OSPFv2 xff08 开放式最短路径优先版本2 xff09 是互联网协议 xff08 IP xff09 网络的路由协议 它使用链路状态路由 xff08 LSR xff09 算法 xff0c 并且属于在单个自治系统
  • OpenFlow协议原理及基本配置-网络测试仪实操

    一 OpenFlow协议原理 1 OpenFlow技术背景 转发和控制分离是SDN网络的本质特点之一 在SDN网络架构中 xff0c 控制平面与转发平面分离 xff0c 网络的管理和状态在逻辑上集中到一起 xff0c 底层的网络基础从应用中
  • 如何使用向导创建Openflow 流表-网络测试仪实操

    使用向导创建Openflow中的FlowTable xff0c 按照下面的步骤 xff1a 1 打开Renix软件 xff0c 连接机框并预约测试端口 xff1b 2 配置一个IPv4接口 3 配置一个OpenFlowController绑
  • 信而泰OLT使用介绍-网络测试仪实操

    一 OLT产品介绍 1 概述 PON作为FTTX网络发展的核心技术 xff0c 局端设备OLT尤其重要 本文档中主要介绍OLT的功能特性 业务配置 2 基本功能特性 2 1大容量和高集成度 ZXA10 C300集光接入 数据交换 路由处理于
  • 信而泰耦合测试-网络测试仪实操

    一 耦合测试原理 1 产生背景 常用测试无线设备过程中 xff0c 将无线设备置于屏蔽箱中 xff0c 通过无线网卡连接并运行iperf等类似软件的方式检测所述无线设备的吞吐量 相关技术中将所述无线设备置于所述屏蔽箱中的检测方法 xff0c
  • 【python】程序绑定PC和时间戳做定期授权码

    取磁盘编码或者网卡编码 43 时间戳16位格式 关于时间戳 xff0c 当前简单的实现是年月日转成对应的16位 xff0c 比如 23 03 28 gt 173E xff08 日先直接整除2 xff0c 每月不会超过31天 xff0c 整除
  • 信而泰ALPS 用户管理——网络测试仪实操

    本文介绍了如何在ALPS平台上Step By Step进行用户管理 用户管理介绍 设备在出厂时 xff0c 提供了一个默认管理员账号 xff0c 该账号为admin admin 管理员账号除了可用于测试之外 xff0c 还具有用户管理权限
  • 信而泰RENIX 802.1ag功能介绍-网络测试仪实操

    一 EOAM概述 1 以太网 1 1以太网优点 简单易用 价格低廉 高拓展性 大势所趋 xff0c 一统天下 1 2以太网缺点 可管理性差 定位故障手段少 定位故障速度慢 维护成本高 2 以太网OAM EOAM 为运营商服务 提高以太网可靠
  • 信而泰BGP Flow Spec防攻击测试解决方案

    随着互联网行业的迅猛发展 xff0c 越来越多的业务都从线下走到了线上 互联网在给大家生活带来便利的同时也面临着防护自身安全的各种挑战 DoS DDoS攻击是对网络安全的重大威胁 xff0c 攻击者通过多个控制端控制成千上万的攻击设备对同一
  • 信而泰X1多速率板卡写入SN号和ID——网络测试仪实操

    一 X1多速率板卡SN号和ID说明 速率的License文件需要根据板卡SN号和ID来制作 3 1 6正式版本 xff0c DarYu L2 7高性能 网络测试仪 支持用户通过Renix查看板卡SN号号 但是有的板卡可能存在没有SN号和ID
  • renix如何查看时延和抖动和丢包——网络测试仪实操

    目录 查看时延和抖动 一 预约测试资源 二 新建流 三 查看时延和抖动 查看丢包 一 预约端口 二 创建Raw流 三 如何查看流量的实时丢包个数和丢包比例 查看时延和抖动 一 预约测试资源 打开Renix软件 xff0c 连接机箱 预约端口
  • IP 网络主动监测系统 Renix Active

    一 IT网络运维面临的挑战 1 网络性能可视化 与公有云和SaaS平台连接的可靠性 广域网线路性能 互联网专线性能 2 诊断工具 现场无IT工程师覆盖 诊断的人力费用 网络与应用系统的纠结 3 用户体验 Web应用的访问质量 语音语音视频的
  • FEC原理与操作及BigTao机框装机说明

    一 FEC原理与操作 1 FEC 原理简介 前向纠错 xff08 英语 xff1a forward error correction xff0c 缩写FEC xff09 或信道编码 xff08 英语 xff1a channel coding
  • 信而泰RENIX时延抖动原理和计算公式、流量“重复次数”的使用、通道的作用

    一 信而泰Renix时延抖动原理和计算公式 信而泰RENIX时延抖动原理和计算公式 流量 重复次数 的使用 通道的作用 1 时延抖动原理 时延抖动是网络监视和测量的一个重要指标 在VoIP或视频流中 xff0c 数据包以连续流的形式发送 x
  • 从单体式架构迁移到微服务架构

    迁移到微服务综述 迁移单体式应用到微服务架构意味着一系列现代化过程 xff0c 有点像这几代开发者一直在做的事情 xff0c 实时上 xff0c 当迁移时 xff0c 我们可以重用一些想法 一个策略是 xff1a 不要大规模 xff08 b