《微服务架构设计模式》第十三章 微服务架构的重构策略

news2024/11/27 0:40:31

微服务架构的重构策略

    • 一、重构到微服务需要考虑的问题
      • 1、为什么重构
      • 2、重构形式
      • 3、重构策略
    • 二、设计服务与单体的协作方式
    • 三、总结



一、重构到微服务需要考虑的问题

1、为什么重构

单体地狱造成的业务问题:

  1. 交付缓慢
  2. 充满故障的软件交付
  3. 可扩展性差

2、重构形式

1、一步到位

你企图从零开始开发一个全新的基于微服务的应用程序(彻底替换遗留的单体应用)。虽然从头开始并抛弃老代码库听起来很有吸引力,但它的风险极高,很可能以失败告终。你将花费数月甚至数年来复制现有功能,然后才能实现业务今天就需要的功能!此外,无论如何,你都需要开发和维护老的应用程序,这会打乱重写的工作,并意味着你有一个不断变化的目标。更重要的是,你可能会浪费时间重新实现不再需要的功能。正如Martin Fowler所说的那样,“推倒重写的唯一保证,就是彻底搞砸一切”。


2、逐步绞杀

逐步构建一个新的、被称为绞杀者应用程序的应用。绞杀者应用程序由与单体应用程序结合使用的微服务组成。随着时间的推移,单体应用程序实现的功能数量会缩小,直到完全消失或者变成另一个微服务。这种策略类似于以70mph(约110km/h)的速度在高速公路上行驶时为汽车更换轮胎。这很有挑战性,但相比“一步到位,推倒重来”的风险要小得多。

Martin Fowler把这项策略称为绞杀者应用模式。这个名字来自在热带雨林中发现的绞杀者藤蔓


特点:

  1. 尽早且频繁的体现出价值
  2. 尽可能少对单体做出修改
  3. 不需要考虑过多的基础设置,但是需要保证拥有自动化测试的部署流水线



3、重构策略

有三种主要策略可以实现对单体的“绞杀”,并逐步用微服务替换之:

1、将新功能实现为服务

  • API Gateway:将对新功能的请求路由到新服务,并将遗留请求路由到单体。
  • 集成胶水代码:将服务与单体结合。它使服务能够访问单体所拥有的数据,并能够调用单体实现的功能。

2、隔离表现层和后端。

将表现层与业务逻辑和数据访问层分开。典型的企业应用程序包含以下各层:

  1. 表现逻辑层:它由处理HTTP请求的模块组成,并生成实现Web UI的HTML页面。在具有复杂用户界面的应用程序中,表现层通常包含大量代码。
  2. 业务逻辑层:由实现业务规则的模块组成,这些模块在企业应用程序中可能很复杂。
  3. 数据访问逻辑层:包含访问基础设施服务(如数据库和消息代理)的模块。

以这种方式拆分单体应用有两个主要好处。它使你能够彼此独立地开发、部署和扩展这两个应用程序。特别是,它允许表现层开发人员快速迭代用户界面并轻松执行A/B测试,而无须部署后端。这种方法的另一个好处是它公开了业务逻辑的一组远程API,可以被稍后开发的微服务调用。

但这种策略只是部分解决方案。很可能至少有一个或两个最终的应用程序仍然是一个难以管理的单体。你需要使用第三种策略将单体替换为服务。


3、通过将功能提取到服务中来分解单体。

你想要提取到服务中的功能是对单体应用自上而下的一个“垂直切片”。该切片包含以下内容:

  1. 领域逻辑。
  2. 出站适配器,例如数据库访问逻辑。
  3. 单体的数据库模式。

提取服务具有挑战性。你需要确定如何将单体的领域模型分成两个独立的领域模型,其中一个模型成为服务的领域模型。你需要打破对象引用等依赖。你甚至可能需要拆分类,以将功能移动到服务中。你还需要重构数据库。

第一种策略阻止了单体的发展。它通常是一种快速展示微服务价值的方法,有助于让迁移和重构的工作获得公司内部各个层面支持。另外两种策略打破了单体。在重构单体时,你有时可能会使用第二种策略,但你肯定会使用第三种策略,因为它能实现将功能从单体迁移到绞杀者应用程序中。




二、设计服务与单体的协作方式

1、设计集成胶水


2、数据一致性

借助Saga


3、处理身份验证和访问授权




三、总结

  1. 在迁移到微服务架构之前,确保你的软件交付问题是由于业务需求超出单体架构承载能力而导致的。在架构重构之前,你可以通过改进软件开发过程来加速交付。
  2. 通过逐步开发一个绞杀者应用程序来迁移到微服务非常重要。绞杀者应用程序是一个新的应用程序,由围绕现有单体应用构建的微服务组成。你应该尽早并经常证明自己的价值,以确保业务团队支持迁移工作。
  3. 将微服务引入架构的一个好方法是将新功能作为服务实现。这样做可以使你使用现代技术和开发过程快速轻松地开发功能。这是快速展示迁移到微服务价值的好方法。打破单体结构的一种方法是将表现层与后端隔离,这会产生两个较小的单体结构。虽然这不是一个巨大的改进,但它确实意味着你可以独立部署每个单体。例如,这允许用户界面团队更轻松地在用户界面设计上进行迭代,而不会影响后端。
  4. 打破单体的主要方法是逐步将功能从单体转移到服务中。重点是提取提供最大利益的服务。例如,如果提取实现正在积极开发功能的服务,你将加快开发速度。
  5. 新开发的服务几乎总是必须与单体交互。服务通常需要访问单体的数据并调用其功能。单体有时需要访问服务的数据并调用其功能。要实现此协作,需要开发集成胶水,其中包含单体的入站和出站适配器。
  6. 为了防止单体的领域模型污染服务的领域模型,集成胶水应该使用反腐层,这是一个在领域模型之间进行转换的软件层。
    最小化对提取服务的单体结构的影响的一种方法是将移动到服务的数据复制回单体的数据库。由于单体的数据库模式保持不变,因此无须对单体代码库进行潜在的大范围修改。
  7. 开发服务通常需要你实现涉及单体的Saga。但实现可补偿性事务可能具有挑战性,需要对单体进行大范围的修改。因此,有时你需要仔细设计服务的提取顺序,以避免在单体中实现可补偿事务。
  8. 在重构为微服务架构时,你需要同时支持单体应用的现有安全机制,该机制通常基于内存的会话,以及服务使用的基于令牌的安全机制。幸运的是,一个简单的解决方案是修改单体的登录处理程序以生成包含安全令牌的cookie,然后由API Gateway转发给服务。

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

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

相关文章

itheima苍穹外卖项目学习笔记--Day6: 微信登录 / 商品浏览

Day6 a. HttpClientGET方式请求:POST方式请求: b. 微信登录 a. HttpClient HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新…

chrome插件reading-time开发

本插件开发文档翻译于Google官方文档Chrome Extensions Tutorial: Reading time - Chrome Developers 一、reading-time reading-time项目的功能是 将预期的阅读时间添加到任何Chrome extension 和 Chrome Web Store documentation 页面里面 通过这个项目,我们可以…

拓扑序列及其排序

目录 一、拓扑序列及其排序的相关概念拓扑序列的定义拓扑序列的性质出度、入度、度数拓扑排序 二、拓扑序列及其排序的应用有向图的拓扑序列代码实现 一、拓扑序列及其排序的相关概念 拓扑序列的定义 拓扑序列是对一个 有向无环图(DAG)(也称为拓扑图)而…

SpringBoot整合gRPC -- 简单明了

项目结构 pom引入(parent中引入即可) <properties><net-devh-grpc.version>2.14.0.RELEASE</net-devh-grpc.version><os-maven-plugin.version>1.6.0</os-maven-plugin.version><protobuf-maven-plugin.version>0.5.1</protobuf-mave…

Python绘制一个圆

代码 import matplotlib.pyplot as plt import numpy as npradius 10 # 半径的长度 center np.array([0,0]) # 圆心的坐标 t np.linspace(0, 2 * np.pi, 100) x center[0] radius * np.cos(t) y center[1] radius * np.sin(t)plt.figure(figsize(5,5)) plt.plot(x,y) p…

C# Modbus通信从入门到精通(5)——Modbus RTU(0x03功能码)

1、03(0x03)读保持寄存器 使用该功能码能从远程地址中读取1到125个保持寄存器的值,每个保持寄存器都占两个字节,读取的保持寄存器数量由主站读取时指定。 2、发送报文格式 更详细的格式如下: 从站地址+功能码+起始地址高位+起始地址低位+寄存器数量高位+寄存器数量低位+…

Redis进阶源码 - 主流程源码

redis底层是C语言编写的一个可执行程序&#xff0c;主方法为server.c 中main方法 主要包括&#xff1a;从初始化 到 EventLoop整个流程源码内容介绍 画的分析图太大了&#xff0c;需要的直接下载看吧.....想提醒大家的是&#xff0c;看源码时一定要带着目标去看&#xff0c;比…

《微服务架构设计模式》第十一章 开发面向生产环境的微服务应用

内容总结自《微服务架构设计模式》 开发面向生产环境的微服务应用 一、开发安全的服务1、安全性概述2、单体应用安全性3、微服务应用安全性 二、如何使用外部化配置模式三、如何使用可观测性模式四、使用微服务基底模式开发服务1、使用微服务基地2、从微服务到服务网格 五、总结…

前端开发面试题及答案整理(合集)

前端开发面试题及答案 1、对Web标准以及W3C的理解与认识? 答&#xff1a;标签闭合、标签小写、不乱嵌套、提高搜索机器人搜索几率、使用外链CSS和JS脚本、结构行为表现的分离、文件下载与页面速度更快、内容能被更多的用户所访问、内容能被更广泛的设备所访问、更少的代码和组…

2023年NOC决赛-加码未来编程赛项决赛模拟题-Python模拟题--卷1

第一题: 小码君在和朋友们玩密室逃脱。他们被困在一个封闭的房间中,只有破解密码,才能逃出密室。密码提示如下:“将 1 到 100 以内,能被 7 整除的数的个数以及这些数累加起来的和拼在一起即是打开房门的密码” 。请帮小码君算出密码。(注:只需显示表示结果的纯数字,不…

动手学深度学习——softmax回归的从零开始(代码详解)

目录 1. softmax回归的从零开始实现1.1 初始化模型参数1.2 定义softmax操作1.3 定义模型1.4 定义损失函数1.5 分类精度1.6 训练1.7 预测1.8 小结 1. softmax回归的从零开始实现 引入Fashion-MNIST数据集&#xff0c; 并设置数据迭代器的批量大小为256。 import torch from IP…

快速实现单数据表编辑

目录 1 简介 2 准备电子表格 3 初始化 4 根据电子表格生成数据库表并导入数据 5 使刚创建的表显示在待编辑列表中 6 开始编辑单表 7 一段代码用于实现中文字段名、调整列宽、只读字段、隐藏字段 1 简介 单数据表是最容易实现的表。由于不需要从零开始一个一个地增加字段…

pwm呼吸灯

文章目录 一、呼吸灯二、代码实现三、引脚分配 一、呼吸灯 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化&#xff0c;使用开发板上的四个led灯实现1s间隔的呼吸灯。 二、代码实现 c module pwm_led( input clk ,input rst_n ,output reg [3:0] led ); …

当你输入URL并按下回车后,发生了什么?

大概发生了八步的事情&#xff1a; URL解析->DNS解析->服务器建立连接->发送HTTP请求->服务器处理请求->服务器响应->接收和渲染页面->关闭连接 URL解析 URL&#xff0c;统一资源定位符&#xff0c;是用来表示从互联网上得到的资源位置和访问这些资源的…

ARM DynamIQ简介

DynamIQ是ARM一个新的底层solution&#xff0c;用于连接在一个芯片上的不同core&#xff0c;将多个core连接起来。 有了DynamIQ&#xff0c;我们可以将不同类型的core放到一个cluster中。比如&#xff0c;将性能高的core&#xff0c;和功耗低的core放进一个cluster&#xff0c;…

【uni-app】常用图标、头像汇总

在做小程序的时候&#xff0c;有时候需要各种图标和头像素材&#xff0c;而百度一堆基本都是收费的。所以&#xff0c;整理一些免费好用的图标&#xff0c;头像库&#xff1a; 1、iconfont-阿里巴巴矢量图标库 基本上常用的矢量图标&#xff0c;在这儿都有&#xff0c;而且可…

基于SSM框架的汽车在线销售系统设计与实现

博主介绍&#xff1a;专注于Java技术领域和毕业项目实战。专注于计算机毕设开发、定制、文档编写指导等&#xff0c;对软件开发具有浓厚的兴趣&#xff0c;工作之余喜欢钻研技术&#xff0c;关注IT技术的发展趋势&#xff0c;感谢大家的关注与支持。 技术交流和部署相关看文章…

Eureka的使用手册

一、导入依赖&#xff08;服务端和客户端导入的依赖不一样&#xff09; 服务端&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependenc…

『数据增强』yolov5 数据增强 与 红外数据增强

目录 yolov5 数据增强 Mosaic Copy paste Random affine MixUp Albumentations Augment HSV(Hue, Saturation,Value) Random horizontal flip 红外数据增强 红外图像的缺点 红外成像技术的特点 红外图像增强经…

常用电子元器件检测方法与经验

电子元器件检测是电子工程师和技术人员工作中不可或缺的一部分。在电子元器件制造和使用过程中&#xff0c;需要对元器件进行检测&#xff0c;以确保其质量和性能符合要求。在本文中&#xff0c;我们将介绍常用的电子元器件检测方法和经验&#xff0c;以帮助读者更好地了解和掌…