一种动态调用目标方法的计算机实现的方法及计算机可读存储介质与流程

摘要: 本发明涉及计算机软件开发与诊断,具体涉及一种动态调用目标方法的计算机实现的方法及计算机可读存储介质。背景技术:1、在现代软件工程实践中,尤其是在微服务和分布式系...
一种动态调用目标方法的计算机实现的方法及计算机可读存储介质与流程

本发明涉及计算机软件开发与诊断,具体涉及一种动态调用目标方法的计算机实现的方法及计算机可读存储介质。

背景技术:

1、在现代软件工程实践中,尤其是在微服务和分布式系统架构下,java服务的开发、调试和线上运维变得日益复杂。开发人员在验证功能或排查问题时,常常需要调用服务内部的特定方法。然而,传统的调试手段存在诸多不便。例如,编写单元测试或集成测试用例需要搭建复杂的测试环境,流程繁琐;而直接在线上环境进行调试,通常需要修改代码、重新部署并重启服务,这对于要求高可用性的生产系统而言是难以接受的,可能导致服务中断和业务风险。

2、为解决动态诊断问题,业界出现了一些高级工具和技术。例如,专利文献cn121705166a公开了一种基于javaagent的定时任务http接口动态触发方法。该方案通过在java虚拟机(jvm)启动时使用premain方式加载代理程序,修改特定类的字节码以实现对定时任务方法的http(超文本传输协议)触发。然而,该方案存在明显缺陷:其一,它依赖于premain静态加载机制,要求在目标进程启动前就配置好代理,对于已经运行的线上服务,必须重启才能使其生效,无法满足实时、零停机的诊断需求。其二,其调用范围被严格限制在带有特定注解(如@scheduled)的方法上,无法调用任意业务方法。

3、另一类相关技术是基于命令行界面的诊断工具,如开源项目arthas。用户可以通过命令行连接到目标进程,执行指令来查询对象实例、手动构造参数并发起反射调用。尽管功能强大,但该方式的操作门槛非常高,要求使用者熟练掌握工具命令和java反射机制。特别是当目标方法的参数是包含多层嵌套的复杂对象时,手动编写和构造参数数据不仅极为繁琐,而且极易出错,导致调用失败率居高不下。此外,这类工具通常也主要关注于由spring等框架管理的对象实例,对于非框架管理的普通java对象,其适用性有限。

4、综上所述,现有技术在对运行中的java服务进行方法动态调用时,普遍存在以下一个或多个问题:无法实现真正的零重启动态附加,难以应用于生产环境;操作流程复杂、效率低下,对使用者的技术水平要求高;对于具有复杂嵌套结构参数的方法,参数构造困难且易错;调用范围受限,无法覆盖所有类型的对象实例和方法。

技术实现思路

1、为了解决上述背景技术中存在的问题,例如无法在不重启服务的情况下对运行中的目标进程进行方法调用、参数构造复杂且调用范围受限等,本发明提供了一种动态调用目标方法的计算机实现的方法及计算机可读存储介质。

2、本发明提供的一种用于动态调用目标方法的计算机实现的方法,包括:动态地将代理程序附加到正在运行的目标进程,而无需重新启动所述目标进程;经由网络通信信道,从远程客户端设备接收包含类信息的调用请求;响应于所述调用请求,通过编程方式分析所述目标方法的签名,以自动生成结构化的参数模板;根据所述调用请求中的所述类信息,搜索所述目标进程的内存堆,以定位与所述类信息对应的至少一个存活实例;确定一个目标实例,其中,若仅定位到一个所述存活实例,则该存活实例即为所述目标实例,若定位到多个所述存活实例,则将各实例的区分信息提供给所述远程客户端设备,并根据从所述远程客户端设备接收的选择信息确定所述目标实例;在所述目标实例上,使用从所述参数模板派生的参数,调用所述目标方法,将所述调用的执行结果或抛出的异常封装到调用响应中,并向所述远程客户端设备发送所述调用响应。

3、可选地,所述动态地附加代理程序是通过java代理的agentmain模式和jvmattachapi实现的。通过采用此种运行时附加机制,可以在目标进程不中断运行的情况下加载代理程序,真正实现了对生产环境的零侵入、零重启诊断,解决了现有技术依赖premain静态加载而必须重启服务的问题。

4、进一步地,所述搜索所述目标进程的内存堆是利用虚拟机诊断工具的实例获取方法或基于jvm工具接口(jvmti)的堆遍历功能实现的。该方式能够直接从内存中获取指定类的所有存活实例,不受限于对象是否由spring等特定框架管理,从而将调用范围扩展至任意存活实例,突破了现有技术仅能覆盖特定框架管理对象的局限。

5、在一种实施方式中,所述通过编程方式分析所述目标方法的签名包括:对所述目标方法的参数列表进行递归解析,直至所有字段为基础数据类型或达到预设的递归深度。这种递归解析机制能够自动处理包含嵌套自定义对象、集合、泛型等复杂结构的参数,并生成结构化的模板,极大地简化了参数构造过程,避免了手动构造时易出现的格式错误和字段遗漏。

6、可选地,所述调用所述目标方法包括:利用java反射获取所述目标方法的method对象,并将所述method对象设置为可访问状态。通过将方法设置为可访问,本发明能够调用包括私有方法和内部方法在内的任意方法,提供了更全面的诊断能力。

7、进一步地,所述方法还包括:在接收所述调用请求之前,扫描所述目标进程中已加载的所有类,并将所述类的列表信息发送到所述远程客户端设备。这使得用户可以在客户端以可视化的方式浏览和选择目标类与方法,而无需预先知晓其完整名称,提升了易用性。

8、优选地,所述结构化的参数模板是json格式的模板;所述调用响应是json格式的响应体。采用通用的json格式进行数据交换,具有良好的可读性和跨平台兼容性,便于客户端进行解析和展示。

9、在一种实施方式中,所述区分信息包括选自以下至少一项:所述实例的依赖注入框架组件名称、所述实例的哈希码。当存在多个实例时,提供这些具体的区分信息能够帮助用户准确地识别并选择期望调用的目标实例,确保了调用的精确性。

10、可选地,所述网络通信信道是基于http协议建立的。基于http协议的客户端/服务端架构,使得用户可以从本地设备远程调用服务器上的目标方法,无需登录服务器进行命令行操作,提升了跨环境操作的便利性。

11、本发明还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现如前述任一项所述的方法。

12、与现有技术相比,本发明具有以下有益效果:

13、1.实现了生产环境的零重启、全范围方法调用。通过采用agentmain运行时附加机制,可在不重启服务的情况下将代理程序动态加载到任意运行中的目标进程,满足了线上问题实时排查的核心需求。同时,通过直接搜索内存堆获取实例,调用范围覆盖了springbean和非spring管理的存活实例,以及公有和私有方法,突破了现有技术的范围限制。

14、2.显著提升了操作效率并降低了使用门槛。本发明将复杂的命令行操作转变为可视化的界面交互,用户仅需选择目标方法并填写由系统自动生成的参数模板即可完成调用。相较于传统命令行方式数分钟的操作时间,本发明可将单次调用耗时缩短至秒级,显著提升了操作效率。

15、3.解决了复杂参数的构造难题。通过对方法签名进行递归分析并自动生成结构化的参数模板,用户无需关心参数的内部嵌套结构,只需填写数值即可,显著降低了因手动构造复杂参数导致的错误率。

16、4.提供了便捷的远程操作和可视化的结果反馈。基于客户端/服务端的网络通信架构,支持用户在本地对远程服务器上的服务进行方法调用,无需直接操作服务器。调用结果和异常信息被结构化地返回并在客户端可视化展示,附带完整的异常堆栈,便于快速定位问题。