一次动态接口替换经历

news/2025/1/20 3:47:49/文章来源:https://www.cnblogs.com/istitches/p/18336762

接口改造

背景

现有旧订单接口 orderDetail,该接口会返回全量节点,部分节点不会使用因此造成了冗余,给数据库造成了较大压力,因此改造新接口 basicOrderDetail(xxx) 支持传入需要赋值的节点,方便赋值。

有如下改造方案:

  • 现有多个其他部分接口调用当前 orderDetail 接口获取订单详情,并且再调用订单详情的 getter() 方法,统计所有调用订单接口的方法,以及这些方法内部调用订单详情 getter() 方法;
  • 将旧接口替换为新接口,并传入需要赋值的节点。

难点

难点在于调用 getter() 方法的地方太多,无法手动一个个统计,工作量巨大。

解决方案

新接口如何设计?

// 调用旧接口伪代码
Response resp = orderDetail(request.orderId(), "");
// Response 中返回了全量节点值// 新接口设计
// 1.各服务自定义封装 Request,并设置需要赋值的节点信息
class NewRequest {int orderId;List<ItemFlag> flags;  // ItemFlag 为枚举类,对应 Response 中各字段信息
}
// 2.服务调用时构造 Request,然后发起请求,这样依赖就同意了调用格式,各服务以统一形式调用新接口,同时可以设置需要赋值的节点
NewResponse resp = basicOrderDetail(new NewRequest(1, Arrays.asList(ItemFlag.xxx, ItemFlag.xxx)));

其他服务中获取字段信息 getter() 方法如何识别替换?
这是一类对方法增强的功能,所以很自然联想到动态代理,SpringBoot 中可以通过 注解+AOP切面实现。

方案一:注解+AOP

  • 在不修改原代码逻辑的基础上,新增自定义注解 @ItemRecord;
  • 将注解标注在获取 OrderDetail 结果的方法上;
  • 定义对应切面,以 @Pointcut("@annotation(xxx.xxx.xxx.ItemRecord)") 为切点,并定义切点的 AfterReturning 通知,这样在运行时就能获取到方法返回的结果中哪些字段非空,但是无法确定各接口实际需要的节点值。

方案二:编译时注解+Processor

  • 定义两个编译时注解,一个用于获取 OrderDetail 类型变量,并统计获取代码中 getter() 方法;
  • 再定义一个编译时注解,用于替换 OrderDetail 的获取方法,替换为 BasicOrderDetail 获取方法。

但是这种方式解析语法树过于麻烦,实行起来复杂。

方案三:Cglib 动态代理

初步思路:

  • 对原始接口返回的对象 OrderDetail 创建动态代理对象,每当调用该对象的 getter() 方法时,触发增强后的 getter() 方法,记录下对应的执行线路、当前方法调用所在的外层方法名、该服务方法需要 getter() 的字段信息,记录上述信息存储到内存 HashMap 中;
  • 在第一步操作记录完毕后,针对调用老接口 orderDetail 的服务对象创建动态代理对象,之后再调用 orderDetail 老接口时,方法内部会代替调用增强后的代理对象执行增强后的方法,方法内只针对部分目标属性赋值,避免了全量赋值。

复现 Demo:

https://gitee.com/loserii/proxy_demo

重点步骤:

  • 创建 App 对象的动态代理类,收集 getter() 方法所需的属性,并存储 Map。

img

  • 创建非全量新接口,修改老接口逻辑,老接口执行时判断代理类是否为空,不为空调用代理方法,否则调用旧方法。新接口构造代理方法所需参数,调用代理方法。

  • 代理方法会根据请求参数中枚举的信息,针对指定字段赋值。

img

img

结果

用镜像集群测试,接口返回数据正确,同时调用新接口,性能提升。

实现无需手动统计和替换自动完成接口替换。

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

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

相关文章

智算引领,数耀鹭岛!天翼云与厦门电信共筑智算时代新底座!

在数字化浪潮的推动下,算力已成为推动社会进步的重要力量。近日,由厦门市数据管理局指导,天翼云科技有限公司、中国电信有限公司厦门分公司(以下简称“厦门电信”)主办的“智算引领 数耀鹭岛”——厦门智算中心(电信中心)发布会暨算力补贴政策宣贯会在福建厦门成功举办。…

行业标准引领者!天翼云助推智算领域规范化发展!

7月24日,2024可信云大会召开期间,智算云服务论坛上,天翼云荣获中国信通院颁发的“智算工程平台能力要求标准参编证书”,代表了业界对天翼云在推动行业标准制定中所作贡献及成果的重要肯定,以及对天翼云技术创新水平的高度认可。会上,天翼云科技有限公司智算产品线资深技术…

07HTML+CSS

标准流 标准流也叫文档流,指的是标签在页面中默认的排布规则,例如:块元素独占一行,行内元素可以一行显示多个。 浮动(了解) 作用:让块元素水平排列。 属性名:float 属性值 • left:左对齐 • right:右对齐 特点: • 浮动后的盒子顶对齐 • 浮动后的盒子具备行内块特…

推荐一款好用的刷题工具

为了帮助正在准备求职季的开发者提升备战效率,阿里云特别推出“通义灵码陪你备战求职季”活动,精心挑选百道历史校招技术面试/笔试题,借助通义灵码智能问答、代码智能生成、代码优化等核心功能,帮助开发者更加准确地了解程序员职业所需的核心技能,加强对问题解决思维和解题…

win10 in arm

记得流水账了,非技术控跳过即可。 10年前,早在win10刚出的那些天,就浏览到有支持arm架构的信息,只是未见缘来打怪,磨蹭到微软快要取消支持的了,方哦,哦,哦... 老板的华为平板cpu是枭龙850+8g内存,64位家庭版。平板上旧系统中了comup.dll的毒,一阵删杀后把系统给搞崩了…

Getty 携手英伟达升级商业文生图 AI 模型;苹果新专利探索「心跳」解锁 iPhone 丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

《DNK210使用指南 -CanMV版 V1.0》第十六章 machine模块实验

第十六章 machine模块实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/A…

使用Scanner类处理用户输入时,当捕获到异常后,需要适当的清理输入流,以确保程序可以正确继续执行

问题描述 代码示例 public class Example {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (true){System.out.print("正常输入一个数字: ");int anInt = scanner.nextInt();//正常输入try {//错误输入的字符System.out.p…

在处理用户输入时,当捕获到异常后,需要适当的清理输入流,以确保程序可以正确继续执行

问题描述 代码示例 public class Example {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (true){System.out.print("正常输入一个数字: ");int anInt = scanner.nextInt();//正常输入try {//错误输入的字符System.out.p…

Ubuntu20.04.2安装Cockpit通过web管理系统

Cockpit是一个简单易用的Web界面,让用户可以通过浏览器管理Linux服务器,支持系统监控、存储管理、网络配置和日志查看等,适合初学者和希望简化管理流程的系统管理员。目录什么是Cockpit安装启用&设为自动启动Wiki 什么是Cockpit Cockpit是一个简单易用的Web界面,让用户…

Flutter 自定义画笔案例

首先让我们来看下这张图当UI做的设计图中有这么一个元素,我想大多数人第一反应就是叫UI切图,然后直接使用Image加载,我一开始也是这么做的,毕竟省时省力省心。 但是由于后面需要针对不同的状态设置不同的颜色,我不想写过多判断语句来切换图标(我目前的做法是实现一个枚举…

IDL根据Landsat QA波段去云处理【代码】

IDL根据Landsat QA波段去云处理【代码】 ​ landsat QA波段(质量评估波段)是Landsat卫星影像数据中的一个特殊波段,他在Landsat5-9的每个产品中都存在。虽然我们常用的Landsat影像数据有B1-B7波段,但QA波段并不是其中之一。它可以反映出云、云阴影、雪等类别的像素,常…