一种对使用Spring技术栈构建的应用系统进行调试的方法转让专利

申请号 : CN202211620705.4

文献号 : CN115629992B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 干鹏宇何旭

申请人 : 云筑信息科技(成都)有限公司

摘要 :

本发明公开了一种对使用Spring技术栈构建的应用系统进行调试的方法,属于大数据技术领域,所述方法包括判断Java虚拟机加载的每一个类是否带有特殊注解;采用字节码增强工具,对带有特殊注解的类的每一个方法进行字节码增强,并定时生成对应的采集数据;创建分析系统,将所述采集数据发送至分析系统进行处理,形成调用记录文件并保存;下载所述调用记录文件,并根据调用记录文件中每个方法的采集数据在本地进行调试,定位应用系统的代码故障点。本发明将用户请求在生产环境中涉及到的每个方法的调用都进行快照记录,将快照记录按照方法调用的先后顺序串联起来形成调用记录文件,在本地代码进行调试,避免了对生产环境造成影响。

权利要求 :

1.一种对使用Spring技术栈构建的应用系统进行调试的方法,其特征在于,包括以下步骤:

步骤1、判断Java虚拟机加载的每一个类是否带有特殊注解;

步骤2、采用字节码增强工具,对带有特殊注解的类的每一个方法进行字节码增强,生成对应的采集数据;

步骤3、创建分析系统,将所述采集数据发送至分析系统进行处理,形成调用记录文件并保存;

步骤4、下载所述调用记录文件,并根据调用记录文件中每个方法的采集数据在本地进行调试,定位应用系统的代码故障点;

所述特殊注解包括@Controller、@RestController、@Service、@Repository、@Component的任意一个或多个;

所述步骤2包括:步骤21、将所述带有特殊注解的类的每一个方法记为原方法并重命名,创建一个对应的新方法;步骤22、从线程局部变量中获取原方法已有的调用序号或生成一个随机的调用序号;步骤23、记录原方法的入参和调用开始时间;步骤24、在新方法中调用原方法;步骤25、记录原方法的返回值、原方法的执行总耗时和调用结束标记;步骤26、将调用序号、原方法的执行总耗时、原方法的入参、原方法的返回值、调用结束标记、当前时间、原方法所在的类的名称以及原方法的名称记录为采集数据并保存到本地缓存;

所述步骤3包括:当采集数据中没有调用结束标记,则直接将采集数据存入分析系统中;当采集数据中有调用结束标记,提取采集数据中的调用序号,再获取具有相同调用序号的其他采集数据,并按照每个采集数据中携带的调用开始时间从小到大进行排序,形成调用记录文件并保存。

2.根据权利要求1所述的一种对使用Spring技术栈构建的应用系统进行调试的方法,其特征在于,步骤22包括:判断带有特殊注解的类是否带有@Controller或@RestControlle注解,若不带有,则从线程局部变量中获取原方法已有的调用序号;若带有,进一步判断原方法的入参是否含有表示本次请求需要被追踪采集的标志符参数,若含有,则生成一个随机的调用序号并保存于线程局部变量中。

3.根据权利要求1所述的一种对使用Spring技术栈构建的应用系统进行调试的方法,其特征在于,在所述步骤26中,仅当带有@Controller或@RestControlle注解时,才存在调用结束标记并记录。

4.根据权利要求1所述的一种对使用Spring技术栈构建的应用系统进行调试的方法,其特征在于,所述原方法的重命名名称为原方法的名称加上一个随机数。

5.根据权利要求1所述的一种对使用Spring技术栈构建的应用系统进行调试的方法,其特征在于,所述新方法的名称为原方法的名称。

6.根据权利要求1所述的一种对使用Spring技术栈构建的应用系统进行调试的方法,其特征在于,所述字节码增强工具为ByteBuddy。

说明书 :

一种对使用Spring技术栈构建的应用系统进行调试的方法

技术领域

[0001] 本发明属于大数据技术领域,具体涉及一种对使用Spring技术栈构建的应用系统进行调试的方法。

背景技术

[0002] Alibaba Arthas是利用Java Agent机制进行在线调试工具,但是需要用户在服务器预装此应用,且在调试时需要登录服务器进行操作。同时该技术携带的 Java Agent会对应用系统的性能造成一定的影响,多次进行在线调试可能导致系统性能持续下降。而各种Java Web服务器自带的远程调试端口已很少使用,因为会对系统安全造成极大隐患,同时也会对生产环境用户的正常请求产生阻塞,让用户感知到请求停顿,极大的影响用户体验。
[0003] 因此,本发明提供了一种对使用Spring技术栈构建的应用系统进行调试的方法,以至少解决上述部分技术问题。

发明内容

[0004] 本发明要解决的技术问题是:提供一种对使用Spring技术栈构建的应用系统进行调试的方法,以至少解决上述部分技术问题。
[0005] 为实现上述目的,本发明采用的技术方案如下:
[0006] 一种对使用Spring技术栈构建的应用系统进行调试的方法,包括以下步骤:
[0007] 步骤1、判断Java虚拟机加载的每一个类是否带有特殊注解;
[0008] 步骤2、采用字节码增强工具,对带有特殊注解的类的每一个方法进行字节码增强,生成对应的采集数据;
[0009] 步骤3、创建分析系统,将所述采集数据发送至分析系统进行处理,形成调用记录文件并保存;
[0010] 步骤4、下载所述调用记录文件,并根据调用记录文件中每个方法的采集数据在本地进行调试,定位应用系统的代码故障点。
[0011] 进一步地,所述特殊注解包括@Controller、@RestController、@Service、@Repository、@Component的任意一个或多个。
[0012] 进一步地,所述步骤2包括:步骤21、将所述带有特殊注解的类的每一个方法记为原方法并重命名,创建一个对应的新方法;步骤22、从线程局部变量中获取原方法已有的调用序号或生成一个随机的调用序号;步骤23、记录原方法的入参和调用开始时间;步骤24、在新方法中调用原方法;步骤25、记录原方法的返回值、原方法的执行总耗时和调用结束标记;步骤26、将调用序号、原方法的执行总耗时、原方法的入参、原方法的返回值、调用结束标记、当前时间、原方法所在的类的名称以及原方法的名称记录为采集数据并保存到本地缓存。
[0013] 进一步地,步骤22包括:判断带有特殊注解的类是否带有@Controller或@RestControlle注解,若不带有,则从线程局部变量中获取原方法已有的调用序号;若带有,进一步判断原方法的入参是否含有表示本次请求需要被追踪采集的标志符参数,若含有,则生成一个随机的调用序号并保存于线程局部变量中。
[0014] 进一步地,在所述步骤26中,仅当带有@Controller或@RestControlle注解时,才存在调用结束标记并记录。
[0015] 进一步地,所述原方法的重命名名称为原方法的名称加上一个随机数。
[0016] 进一步地,所述新方法的名称为原方法的名称。
[0017] 进一步地,所述步骤3包括:当采集数据中没有调用结束标记,则直接将采集数据存入分析系统中;当采集数据中有调用结束标记,提取采集数据中的调用序号,再获取具有相同调用序号的其他采集数据,并按照每个采集数据中携带的调用开始时间从小到大进行排序,形成调用记录文件并保存。
[0018] 进一步地,所述字节码增强工具为ByteBuddy。
[0019] 与现有技术相比,本发明具有以下有益效果:
[0020] 本发明设计科学合理,使用方便,将用户请求在生产环境中涉及到的每个方法的调用都进行快照记录,然后将快照记录按照方法调用的先后顺序串联起来形成调用记录文件。用户使用这份文件可以在本地代码进行调试,从而不必在生产环境进行调试,避免了对生产环境造成影响。

附图说明

[0021] 图1为本发明的方法流程图。

具体实施方式

[0022] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图,对本发明进一步详细说明。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0023] 如图1所示,本发明提供一种对使用Spring技术栈构建的应用系统进行调试的方法,包括以下步骤:
[0024] 步骤1、判断Java虚拟机加载的每一个类是否带有特殊注解;
[0025] 步骤2、采用字节码增强工具,对带有特殊注解的类的每一个方法进行字节码增强,生成对应的采集数据;
[0026] 步骤3、创建分析系统,将所述采集数据发送至分析系统进行处理,形成调用记录文件并保存;
[0027] 步骤4、下载所述调用记录文件,并根据调用记录文件中每个方法的采集数据在本地进行调试,定位应用系统的代码故障点。
[0028] 本发明将用户请求在生产环境中涉及到的每个方法的调用都进行记录,然后将记录按照方法调用的先后顺序串联起来形成调用记录文件。用户使用这份文件可以在本地代码进行调试,从而不必在生产环境进行调试,避免了对生产环境造成影响。
[0029] 本发明所述方法是利用Java提供的Java Agent机制在Java虚拟机的类加载阶段进行工作。所述特殊注解包括@Controller、@RestController、@Service、@Repository、@Component的任意一个或多个。其中,@Controller是Spring框架提供的注解,@Controller标识的类代表控制器类(控制层/表现层);@RestController其本身用@Controller和@ResponseBody进行注解,实现了二者注解功能的结合,带有此注释的类型被视为控制器;@Service注解用于类上,标记当前类是一个service类,加上该注解会将当前类自动注入到spring容器中,不需要再在applicationContext.xml文件定义bean了;@Repository与@Controller、@Service的作用都是把对象交给Spring管理,@Repository是标注在Dao层接口上,作用是将接口的一个实现类交给Spring管理;@Component是一个元注解,用于注解其他类注解,如@Controller、 @Service、 @Repository 等。
[0030] 本发明所述步骤2为对每个方法的调用进行快照记录。所述所述字节码增强工具为ByteBuddy。
[0031] 步骤2包括:步骤21、将所述带有特殊注解的类的每一个方法记为原方法并重命名,创建一个对应的新方法,所述原方法的重命名名称为原方法的名称加上一个随机数,所述新方法的名称为原方法的名称。
[0032] 步骤22、从线程局部变量(ThreadLocal)中获取原方法已有的调用序号或生成一个随机的调用序号。步骤22包括:判断带有特殊注解的类是否带有@Controller或@RestControlle注解,若不带有,则从线程局部变量中获取原方法已有的调用序号;若带有,进一步判断原方法的入参是否含有表示本次请求需要被追踪采集的标志符参数,若含有,则生成一个随机的调用序号并保存于线程局部变量中。
[0033] 步骤23、记录原方法的入参和和调用开始时间。
[0034] 步骤24、在新方法中调用原方法。
[0035] 步骤25、记录原方法的返回值、原方法的执行总耗时和调用结束标记。
[0036] 步骤26、将调用序号、原方法的执行总耗时、原方法的入参、原方法的返回值、调用结束标记、当前时间、原方法所在的类的名称以及原方法的名称记录为采集数据并保存到本地缓存。进一步地,仅当带有@Controller或@RestControlle注解时,才存在调用结束标记并记录。
[0037] 本发明所述步骤3为对采集数据的处理,进而生成每个方法的调用记录文件。创建一个分析系统,对调用产生的采集数据进行处理和保存,分析系统存在于云服务器,如此生产大量的调用记录文件则可存储于云服务器,节约了本地PC机的内存。仅当需要对应用系统的代码故障点进行判定时,从云服务器的分析系统下载调用记录文件,并在本地进行调试。所述步骤3包括:当采集数据中没有调用结束标记,则直接将采集数据存入分析系统中;当采集数据中有调用结束标记,提取采集数据中的调用序号,再获取具有相同调用序号的其他采集数据,并按照每个采集数据中携带的调用开始时间从小到大进行排序,形成调用记录文件并保存。
[0038] 本发明不仅能够采集方法调用请求中各个被调用方法的详情,还能统计方法执行的时间,这种细粒度的采集比 SkyWalking、PinPoint等链路采集工具采集到的方法执行耗时更精确。同时通过将请求在生产环境的执行流程采集到线下本地缓存中,然后在线下本地缓存进行回放,从而进行系统调试。所述方法在调试系统时不会对生产环境的系统产生任何的影响,并且数据采集即调用记录只会在系统启动时执行一次,不会对生产环境系统的调用产生负担。
[0039] 最后应说明的是:以上各实施例仅仅为本发明的较优实施例用以说明本发明的技术方案,而非对其限制,当然更不是限制本发明的专利范围;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围;也就是说,但凡在本发明的主体设计思想和精神上作出的毫无实质意义的改动或润色,其所解决的技术问题仍然与本发明一致的,均应当包含在本发明的保护范围之内;另外,将本发明的技术方案直接或间接的运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。