微服务合并

有的团队为了节约机器成本、有的团队为了提升研发效率、有的团队为了降低人均服务数

微服务合并,可以从多个角度入手

  1. 代码重构融合:人工拷贝代码、解决冲突,然后分阶段实施迁移重构。
  2. 代码合并打包:将多个代码仓库,拉取后合并打包,构建成一个包部署。对于编译型语言,也称为合并编译
  3. 服务合并部署:将多个服务,解决环境隔离、版本冲突问题后,合并部署到一个进程。
代码重构融合

原始而纯粹,只要落地阶段细致、严谨,遵循服务迁移的基本套路,做好流量diff,不大会出现严重问题。

以合并两个Java应用为例(将A服务合并到B)

步骤事项(重点完成以下事项)
前置梳理1. 代码迁移范围:①无流量、可下线接口/模块;②必迁移模块梳理。
2. 配置迁移范围:①动态配置:KV、Token、密钥等;②静态配置:application/xxx.properties等。
3. 依赖冲突:迁移前将原服务的依赖升级到与目标服务一致;补充原服务单独使用的特殊依赖到目标服务,防止冲突。
代码迁移1. 新增module/package,实现模块隔离。
2. 命名空间冲突:同名配置类、同名bean、同名的动态配置key、同名的task、线程池名。
3. 资源层客户端隔离:合并后的服务,可能需要连接多个mysql/redis/ES集群,对应的datasource或客户端需要分别初始化;例如不同的mapper接口包使用不同的datasource。
流量diff流量入口异步双写,异步执行结果与原服务执行结果预期一致。
流量切换异步执行结果与原服务执行结果稳定一致后,将流量入口调用,迁移到目标服务的新方法上。

**服务合并,不只是代码合并。**影响代码运行结果的还有:动态配置、组件依赖关系(初始化顺序、bean间依赖)、运行环境有效性(事务、代理、异步生效与否)、消息队列延迟消费配置等。

代码迁移,除了解决命名冲突,还要考虑资源层在使用上的隔离。
对于只将多个小服务 代码合并,但DB等资源层不合并的情况:合并后的服务,不同模块独立使用不同的datasource数据源,需要隔离Databource和DatabourceTransactionllanager,并将迁移代码中的@Transactional指定对应新增的事务管理器;

  • 将A服务合并到B的场景举例,B原本使用的Databource和DatabourceTransactionllanager都是作为default的,对应业务模块的@Transactional无需指定。服务A的代码迁入B后,使用@Transactional时指定对应新增的事务管理器。
  • 合并后的服务,如需连接多个redis/ES集群,也是显示初始化多个客户端,在不同的业务模块中使用不同的客户端进行资源操作;跟在一个服务里使用多个redis/ES集群方式差不多。

线下验证,可以充分利用原服务已有的测试能力,包括单测、自动化测试等。这是理想情况。
服务合并过程中,除了解决冲突需要修改,原服务逻辑在不大改的情况下,可以线下覆盖核心流程;然后线上流量diff,稳定一致后再切流。

上线准备,需要关注各类鉴权、配置迁移。
迁移原服务的接口鉴权、访问资源的客户端鉴权、定时任务配置等。
除此之外,还要迁移服务治理策略的配置:熔断、限流配置、告警策略等。

流量diff在线上环境进行。理论上,需要覆盖所有的读写接口、以及其他形式的流量入口(定时任务or消费组等)。

  • 读接口,进行实时、异步比对,整体成本较低。
  • 写接口,有一定的成本。
优势劣势
新建一套临时表,异步双向
流量入口处,接收写请求后,先同步调用老方法,变更写入正式表;再异步调用(迁移到目标服务后的)新方法,对流量染色、标记是diff流量。
(迁移到目标服务后的)新方法,使用Mybatis Interceptor依据染色改写表名(追加_temp后缀);将数据写入临时表;最后比对两份数据表的一致性。
无侵入、数据隔离1. 需要新起一套数据表;
2. 新方法除了DB变更外,其他缓存、对外通知MQ,也需根据流量染色,在diff阶段忽略不执行(老方法已完整执行、并对外发了MQ,新方法写入临时表用于比对,不用再发)。
同步执行新流程,比对结果快照
接收写请求后,先调用新方法,再调用老方法;
新方法开启事务执行完,查询事务内变更的数据并保存为快照,不提交&回滚事务;
老方法开启事务执行完,查询事务内变更的数据并与新方法的结果快照进行比对,提交事务。
1. 同步串行执行,耗时高;
2. 回滚事务可能产生告警;
3. 只适合在单个服务内重构时使用,跨服务重构时 除非改造写接口,返回结果快照。

其他形式的流量入口(定时任务or消费组等),需要区分任务类型,对于异步写的场景,也可以采用以上方案diff两套数据源或diff结果快照。

流量diff,理论上需要覆盖所有的读写接口。实际读接口实时、异步比对的成本更低。某些基础元数据的业务场景,仅diff读也行:读不一致说明写有问题,读一致,写肯定一致的情况;无需再diff写。

代码合并打包

以微服务的方式开发,以单体服务的方式运行。

对于编译型语言,也称为合并编译,需要在编译阶段 解决命名冲突、依赖冲突,确定唯一的入口函数等,编译成一个二进制的可执行文件。

而像Java这类半编译半解释型语言,需要借助maven-shade-plugin/maven-assembly-plugin插件,构建的jar文件包含所有依赖,同时支持重命名某些依赖的包。

  • 要避免property文件互相覆盖,可以使用AppendingTransformer来对文件内容追加合并。
  • 支持指定唯一的入口类。

对于已落地服务治理的团队,该方式更复杂的是:A和B合并后,服务注册 要注册为合并后的整体;A和B之前的调用方在服务发现时,获取服务列表也是“合并后整体”的。
两个代码仓库合并打包,原服务的动态配置、限流/告警策略等,是否使用原服务的app标识进行获取、服务注册发现 是否使用目标服务的app标识等问题,核心需要本地化基建的支持。

服务合并部署

对于编译型语言,例如Go plugin支持将Go包编译为共享库(.so)的形式单独发布,主程序可以在运行时动态加载这些编译为动态共享库文件的go plugin。但要求依赖版本、Go编译版本都一致。

而Java,使用类加载隔离、实现多个服务的依赖隔离,可以在同一个JVM实例中部署多个服务。

但由于合并代码后,两个服务会共享一个进程,服务占用的资源、CPU消耗、磁盘占用等均会叠加,所以资源利用率低、磁盘、CPU、内存占用小的服务合并更有优势。

如果多个服务使用同一端口,会发生端口竞争,暴露端口时最好使用随机端口。

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

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

相关文章

VSCode轻松调试运行.Net 8.0 Web API项目

1.背景 我一直都是用VS来开发.NetCore项目的,用的比较顺手,也习惯了。看其他技术文章有介绍VS Code更轻量,更方便。所以我专门花时间来使用VS Code,看看它是如何调试代码、如何运行.Net 8.0 WebAPI项目。这篇文章是一个记录的过程…

【fnOS飞牛云NAS本地部署DeepSeek-R1结合内网穿透远程访问告别服务器繁忙】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python学习第十七天之PyTorch保姆级安装

PyTorch安装与部署 一、准备工作二、pytorch介绍三、CPU版本pytorch安装1. 创建虚拟环境2. 删除虚拟环境1. 通过环境名称删除2. 通过环境路径删除 3. 配置镜像源4. 安装pytorch1. 首先激活环境变量2. 进入pytorch官网,找到安装指令 5. 验证pytorch是否安装成功 四、…

内存管理+模板基础知识

在前面的博客中,我们已经基本学习完了类和对象有关知识,在这篇博客中,我们将要学习C/C内存管理与模板的一些基础知识。 目录 一、C/C内存管理 1.1 C/C内存分布 1.2 C内存管理方式 1.2.1 new/delete操作内置类型 1.2.2 new和delete操作自…

新建菜单项的创建之CmpGetValueListFromCache函数分析

第一部分: PCELL_DATA CmpGetValueListFromCache( IN PHHIVE Hive, IN PCACHED_CHILD_LIST ChildList, OUT BOOLEAN *IndexCached, OUT PHCELL_INDEX ValueListToRelease ) 0: kd> dv KeyControlBlock 0xe1…

《无畏契约》运行时提示“d3dcompiler_43.dll丢失”是什么原因?“找不到d3dcompiler_43.dll文件”如何解决?

--- 使用DLL修复工具(懒人专用) https://file-xfqdx-cdn.fanqiesoft.cn/package/XFQDXTool_21121_tg.exe 逐步说明: 步骤1:重新安装《无畏契约》 - 操作指南: - 打开“控制面板” → “程序和功能”。 - 在列表…

蓝牙接近开关模块感应开锁手机靠近解锁支持HID低功耗

ANS-BT101M是安朔科技推出的蓝牙接近开关模块,低功耗ble5.1,采用UART通信接口,实现手机自动无感连接,无需APP,人靠近车门自动开锁,支持苹果、安卓、鸿蒙系统,也可以通过手机手动开锁或上锁&…

Ubuntu 22.04 安装Nvidia驱动加速deepseek

一键安装22.04 nvidia 驱动 nvidia 官网下载驱动我的环境是NVIDIA RTX A5000nvidia 文档参考没有安装驱动之前确认自己的型号 lspci | grep -i vga (如数字2231) 参考docker 支持nvidia ,注释了需要的取消注释即可 42行-92行一定要重启服务器…

数据结构——双链表

1. 双向带头循环链表 1. 双链表的功能 1. 初始化 2. 销毁 3. 打印 4. 检查链表是否为空 5. 尾插 6. 尾删 7. 头插 8. 头删 9. 在目标节点之后插入数据 10. 删除目标节点 11. 查找 2. 双链表的定义 结构体需要包含三个成员,一个成员存储数据,一个成员存储…

微服务2025/2/15

微服务是一种软件架构风格,它是以专注于单一职责的很多小型项目为基础,组合出复杂的大型应用。 微服务是一种架构。 微服务是一种架构。 微服务是一种架构。 以前自己做项目最常用的架构是单体架构。单体项目不适合开发大型项目。 学习微服务技术来解…

Locust性能压测工具使用指南

Locust是一款用Python编写的开源性能测试工具,主要用于对网站或其他系统进行负载测试和性能测试,以下是关于它的详细介绍: 特点 高可扩展性:能够轻松模拟大量用户并发访问,通过简单增加节点,可以在短时间…

DaoCloud 亮相 2025 GDC丨开源赋能 AI 更多可能

2025 年 2 月 21 日至 23 日,上海徐汇西岸,2025 全球开发者先锋大会以 “模塑全球,无限可能” 的主题,围绕云计算、机器人、元宇宙等多元领域,探讨前沿技术创新、应用场景拓展和产业生态赋能,各类专业论坛、…

Linux 环境“从零”部署 MongoDB 6.0:mongosh 安装与数据操作全攻略

前提 完成linux平台部署MongoDB【部署教程】且完成mongosh的安装 由于本人使用的是6.0版本的MongoDB,新版本 MongoDB(尤其是 6.0 及以上版本)已经不再默认捆绑传统的 mongo shell,而改用新的 MongoDB Shell(mongosh&am…

SQL注入之二次注入

1、概述 二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。 二次注入是sql注入的一种,但是比普通sql注入利用更加困难,利用门槛更高。普通注入数据直接进入到 SQL 查询中,而…

AORO M6北斗短报文终端:将“太空黑科技”转化为安全保障

在卫星导航领域,北斗系统作为我国自主研发的全球卫星导航系统,正以其独特的短报文通信功能引发全球范围内的广泛关注。这一突破性技术不仅使北斗系统在全球四大导航系统中独树一帜,具备了双向通信能力,更通过遨游通讯推出的AORO M…

xss-lab

xss XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。这是一种将任意 Javascript 代码插入到其他Web用户页面中执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能&#x…

服务器为什么会禁止 Ping?服务器禁止 Ping 的好处

在网络管理和服务器运维中,经常会遇到服务器禁止 Ping 的情况。为了确保网络安全和减少不必要的风险,管理员可能会选择禁止 Ping 命令,即禁止服务器响应 ICMP 请求。尽管 Ping 命令是网络诊断中常用的工具,但禁止 Ping 也有其合理…

课程2. 用PyTorch训练神经网络与梯度下降

课程2. 用PyTorch训练神经网络与梯度下降 Pytorchtorch.TensorPytorch 上的神经网络用于余弦函数逼近的全连接神经网络 训练神经网络 梯度下降最小化一个变量的函数最小化多个变量的函数使用梯度下降训练神经网络在 Pytorch 中训练神经网络从 nn.Module 类继承 将计算传输到显卡…

IP-----动态路由OSPF(2)

这只是IP的其中一块内容,IP还有更多内容可以查看IP专栏,前一章内容为动态路由OSPF ,可通过以下路径查看IP-----动态路由OSPF-CSDN博客,欢迎指正 注意!!!本部分内容较多所以分成了两部分在上一章 5.动态路…

手机打电话时如何识别对方按下的DTMF按键的字符-安卓AI电话机器人

手机打电话时如何识别对方按下的DTMF按键的字符 --安卓AI电话机器人 一、前言 前面的篇章中,使用蓝牙电话拦截手机通话的声音,并对数据加工,这个功能出来也有一段时间了。前段时间有试用的用户咨询说:有没有办法在手机上&#xff…