服务预热配置化在泛型化方法上的实践

news2024/12/26 9:31:09

背景

由于开发过程中,个别dubbo接口的调用会在服务发布过程中,出现P99耗时报警问题。因此我们计划通过预热服务接口,通过预热来触发JIT,构建DB资源长链接。实现服务接口上线后,耗时过长,资源等待等问题!

预热实现原理

对于预热的方案,这里做简单阐述,我们定义了一个预热协议,该协议可动态加减预热接口,协议简述如下:

// contract model
{
	"warmupList": [
		{
			"bean": "exampleAServeice",
			"method": "methodA",
			"case": [
				"{\"name\":\"mongo\"}",
				"{\"name\":\"h-mongo\"}"
			], // 预热case列表,object参数这里填写转义的json,注意这个后面会提及到
			"type": "object", //
			"invokes": 3 // 执行次数
		},
		{
			"bean": "exampleBServeice",
			"method": "methodB",
			"case": [
				"[12345]",
				"[12345,678910]"
			], // 预热case列表,object参数这里填写转义的json,注意这个后面会提及到
			"type": "object", //
			"invokes": 3 // 执行次数
		}
	],
	"timeout": 200 // 所有预热执行完成的超时时间
}

解析预热模型中的bean节点,然后通过SpringApplicationContext#getBean(beanName)方法来获取bean实例,反射找到对应的method来执行case!实现的原理也很简单粗暴(如果有更优秀的预热方案,欢迎评论区指教)!
对于类型的method参数类型通过如下的代码来确定:

// 这里仅考虑单参数
Type type = method.getGenericParameterTypes()[0]

发现问题

使用该协议对几个业务系统的接口预热都没有出现问题(大概是运气好),直到遇见了系统X,居然报出来了问题!!!这次我们选择预热的接口形式如下:

@Data
public class Request<T> implements Serializable{
	private int channel;
	private T param;
}

@Data
public class AChannelParam implements Serializable{
	private Stinrg p1;
	private Stinrg p2;
}

interface ExampleService {
	String	methodX(Request<AChannelParam > request);
}

public class ExampleServiceImpl implements ExampleService {

	@Override
	public String methodX(Request<AChannelParam> request) {
		// 业务逻辑处理
		return "success";
	}
}

这个接口方法的入参是一个泛型化的参数,case采用json形式的具体值,通过jackson的ObjecMapper的TypeReference来进行包装解析即可,如下示例:

Type type = execMethod.getGenericParameterTypes()[0]
TypeReference trf = new TypeReference<T>() {
            @Override
            public Type getType() {
                return type;
            }
        };
Request<AChannelParam> req = objectMapper.readValue("{\"channel\":1,\"param\":{\"p1\":\"v1\",\"p2\":\"v2\"}}", trf);

然而结果却大相径庭,解析失败了,req实例的param属性为null,json反序列化的过程中,数据丢失了!!!

定位问题

当下对该case进行了debug,通过debug的数据信息发现我们通过SpringApplicationContext拿到的bean是一个CGLIB代理类,其实了解动态代理的应该都知道代理类会生成一个与被代理类目标一样的method,但是spring的这个代理机制丢失了原始method的signature信息,因此我们也没办法通过反射method获取到参数类型的原始类型数据。普通的bean不会出现这个问题,派生类和接口实现类则回出现代理的问题,当然这里没有考虑AOP的影响!

由于debug的信息并未截图保存,这里没法展示。其实也很容易证实,构建一个简单spring-demo,定义一个服务接口,以及一个接口实现类,一个controller并注入这个服务接口。在debug模式下,调用bean.getClass().getCanonicalName()即可发现类名带有“$CGLIB”字符串,这里的bean代指注入controller中的那个!

解决问题

既然当前获取的是代理类中的同名方法,那么我们只要能拿到被代理类的方法自然就能获取原方法参数的类型定义!既然是代理类,那么自然可以获取到被代理的类定义即Class对象,代理对象的方法部分列表如图所示:
在这里插入图片描述
这里注意圈出来的那个方法,通过方法名即可看出来,这个就是获取被代理类的Class对象方法,因此我们只需要通过反射调用这个方法即可完成获取到原method实例,通过这个method来获取参数类型,通过修复代码测试验证后,泛型方法的预热问题也就迎刃而解了!!!


今日格言:对源码及原理深入,将会使我们对突发问题的态度由慌张而专向冷静!

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

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

相关文章

基于RWEQ模型的土壤风蚀模数估算及其变化归因分析

查看原文>>>基于RWEQ模型的土壤风蚀模数估算及其变化归因分析 土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一&#xff0c;土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。中国风蚀荒漠化面积达160.74104km2&#xff…

python re模块匹配字符串

python 正则模块re 要使用python3中的RE则必须引入 re模块 import re re模块的match函数 result re.match(^[A-Z]{1}[a-z], s) match 尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match()就返回none。 匹配到了&#xff0c;则…

AI for Science系列(二):国内首个基于AI框架的CFD工具组件!赛桨v1.0 Beta API介绍以及典型案例分享!

AI for Science被广泛认为是下一代科研范式&#xff0c;可以有效处理多维度、多模态、多场景下的模拟和真实数据&#xff0c;解决复杂推演计算问题&#xff0c;加速新科学问题发现[1] 。百度飞桨科学计算工具组件赛桨PaddleScience是国内首个公开且可应用于CFD&#xff08;Comp…

通过工厂模式实现SpringBoot+MQTT-订阅与消费

引言 Spring Boot 是一款用于构建基于 Spring 框架的快速应用程序的开源框架。它的目标是简化 Spring 应用程序的开发和部署过程&#xff0c;Spring Boot 通过提供一些默认配置和自动配置&#xff0c;可以让开发者更快的创建一个独立的、产品级别的 Spring 应用程序。 MQTT 是…

pathon Django的关系映射

一对一 【创建】 一对一是表示现实事物间存在的一对一的对应关系。特殊字段选项 【必须】 on_delete - 级联删除 更多参考模型字段参考 | Django 文档 | Django使用oto示例&#xff1a; 1、先创建oto应用&#xff0c;然后到setting.py文件注册应用2、创建oto模型类3、创建…

【人工智能 AI】机器学习快速入门教程(Google)

目录 机器学习术语 标签 特性 示例 模型 回归与分类 深入了解机器学习&#xff1a;线性回归 深入了解机器学习&#xff1a;训练和损失 平方损失函数&#xff1a;一种常用的损失函数 机器学习术语 预计用时&#xff1a;8 分钟 什么是&#xff08;监督式&#xff…

蚁群算法再优化:combine aco algorithm with Sarsa in RL

蚁群算法再优化&#xff1a;combine aco algorithm with Sarsa in RL蚁群算法、Sarsa介绍和TSP问题介绍TSP和Sarsaaco algorithm具体的改进和代码改进说明部分代码数值实验结论分析参考文献蚁群算法、Sarsa介绍和TSP问题介绍 在进行蚁群算法优化介绍之前&#xff0c;笔者先将涉…

Apache Pulsar 云原生消息中间件之王

一、简介 pulsar&#xff0c;消息中间件&#xff0c;是一个用于服务器到服务器的消息系统&#xff0c;具有多租户、高性能等优势。 pulsar采用发布-订阅的设计模式&#xff0c;producer发布消息到topic&#xff0c;consumer订阅这些topic处理流入的消息&#xff0c;并当处理完…

OIDC OAuth2.0 认证协议最佳实践系列 02 - 授权码模式(Authorization Code)接入 Authing

在上一篇文章OIDC & OAuth2.0 认证协议最佳实践系列 02 - 授权码模式&#xff08;Authorization Code&#xff09;接入 Authing中&#xff0c;我们整体介绍 OIDC / OAuth2.0 协议&#xff0c;本次我们将重点围绕授权码模式&#xff08;Authorization Code&#xff09;以及接…

RabbitMQ第一讲

目录 一、RabbitMQ-01 1.1 MQ概述 1.2 MQ的优势和劣势 1.2.1 优势 1.2.2 劣势 1.2.3 MQ应用场景 1.2.4 常用的MQ产品 1.3 RabbitMQ的基本介绍 1.3.1 AMQP介绍 1.3.2 RabbitMQ基础架构 1.3.3 RabbitMQ的6种工作模式 ​编辑 1.4 AMQP和JMS 1.4.1 AMQP 1.4.2 JMS …

00后跨专业学软件测试,斩获8.5K高薪逆袭职场

我想说的第一句&#xff1a;既然有梦想&#xff0c;就应该去拼搏还记得&#xff0c;我大学毕业前&#xff0c;就已经暗下决心到xxx培训机构接受培训。那个时候&#xff0c;没有任何海同公司的人主动找我或者联系过我&#xff0c;我是自己在网上发现了xxxx培训机构的&#xff01…

PLC实验—西门子S7 1200 PID控制步进电机转速

PLC实验—西门子S7 1200 PID控制步进电机转速 严格讲并不是PID控制&#xff0c;因为并不是并不研究这个方向&#xff0c;研二又比较忙&#xff0c;时间限制只加了比例系数 这里只是抛砖引玉&#xff0c;希望大家可以进一步完善补充 思路 大体思路如下&#xff0c;根据超声波…

三八节买什么数码好物?三八女神节实用不吃灰的数码好物推荐

三八节快到了&#xff0c;在这个小节日里&#xff0c;有哪些实用性强的数码好物值得入手呢&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款实用性超强的数码好物&#xff0c;一起来看看吧。 一、蓝牙耳机 推荐产品&#xff1a;南卡小音舱 参考价&#xff1a;239 南…

Python中Opencv和PIL.Image读取图片的差异对比

近日&#xff0c;在进行深度学习进行推理的时候&#xff0c;发现不管怎么样都得不出正确的结果&#xff0c;再仔细和正确的代码进行对比了后发现原来是Python中不同的库读取的图片数组是有差异的。 image np.array(Image.open(image_file).convert(RGB)) image cv2.imread(…

【持续学习引导:pansharpening】

A continual learning-guided training framework for pansharpening &#xff08;一种持续学习引导的全色锐化训练框架&#xff09; 基于监督学习的全色锐化方法自出现以来一直受到批评&#xff0c;因为它们依赖于尺度移位假设&#xff0c;即这些方法在降低分辨率时的性能通…

IntelliJ IDEA如何整合Maven图文教程详解

Maven 1.Maven简述 Maven是一个构建工具,服务与构建.使用Maven配置好项目后,输入简单的命令,如:mvn clean install,Maven会帮我们处理那些繁琐的任务. Maven是跨平台的. Maven最大化的消除了构建的重复. Maven可以帮助我们标准化构建过程.所有的项目都是简单一致的,简化了学习…

ChatGPT能完全取代软件开发吗,看看它怎么回答?

最近网上一直疯传&#xff0c;ChatGPT 最可能取代的 10 种工作。具体包括①、技术类工作&#xff1a;程序员、软件工程师、数据分析师②、媒体类工作&#xff1a;广告、内容创作、技术写作、新闻③、法律类工作&#xff1a;法律或律师助理④、市场研究分析师⑤、教师⑥、金融类…

如何提高推广邮件的发送成功率?

随着经济的发展&#xff0c;国际之间的贸易往来越加频繁&#xff0c;很多外贸企业需要发送大量的商业推广邮件&#xff0c;来获得销售订单开拓公司业务市场。 随之而来的问题也是越来越多&#xff0c;给众多的外贸企业带来诸多的困扰。外贸企业在发送推广邮件中究竟会遇到什么问…

2.4G收发一体芯片NRF24L01P跟国产软硬件兼容 SI24R1对比

超低功耗高性能 2.4GHz GFSK 无线收发器芯片Si24R1&#xff0c;软硬件兼容NRF24L01P. Si24R1 是一颗工作在 2.4GHz ISM 频段&#xff0c;专为低功耗无线场合设计&#xff0c;集成嵌入式ARQ 基带协议引擎的无线收发器芯片。工作频率范围为 2400MHz-2525MHz&#xff0c;共有 126个…

Nginx网络服务

目录 1.Nginx基础 1.Nginx和Apache的差异 2.Nginx和Apache的优缺点比较 3.编译安装nginx服务 2.认识Nginx服务的主配置文件 nginx.conf 1.全局配置 2.I/O事件配置 3.HTTP设置 4.访问状态统计配置 5.基于授权密码的访问控制 6.基于客户端的访问控制 7.基于域名的ng…