CN114237770A - 一种微服务链路调用方法、***、设备及介质 - Google Patents
一种微服务链路调用方法、***、设备及介质 Download PDFInfo
- Publication number
- CN114237770A CN114237770A CN202111563876.3A CN202111563876A CN114237770A CN 114237770 A CN114237770 A CN 114237770A CN 202111563876 A CN202111563876 A CN 202111563876A CN 114237770 A CN114237770 A CN 114237770A
- Authority
- CN
- China
- Prior art keywords
- information
- calling
- service
- plug
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
- G06F9/44526—Plug-ins; Add-ons
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及计算机技术领域,提供一种微服务链路调用方法、***、设备及介质,所述微服务链路调用方法包括获取***信息,根据***信息配置插件;根据插件修改***信息的字节码;将字节码返回***,生成***修改信息;将***修改信息传输至服务端;以及对***修改信息进行前端查询,以实现***信息的链路调用过程。通过本发明提供的一种微服务链路调用方法、***、设备及介质,可以解决***信息快速调取的问题。
Description
技术领域
本发明涉及计算机技术领域,特别是涉及一种微服务链路调用方法、***、设备及介质。
背景技术
在日常的项目开发过程中,难免会有项目、***等对接的需要。另外,因工作岗位的调动也需要负责不熟悉的项目,有时这些项目***甚至是外购项目。对于从零开始熟悉新代码的开发人员来说需要在短时间内熟悉并能上手***。
一般情况下,可以通过接口文档或相关***设计文档等方式熟悉***并开发相关需求。但是上述方法的效率较低,有的文档可能很久没更新甚至文档本身就是错误的,有的代码可读性太差,不仅不会加深我们对***的了解,甚至还可能误导开发人员,从而产生***操作错误。
发明内容
鉴于以上所述现有技术的缺点,本申请的目的在于提供微服务链路调用方法、***、设备及介质,用于解决***信息快速调取的问题。
为实现上述目的及其他相关目的,本申请提供一种微服务链路调用方法,包括以下步骤:
获取***信息,根据所述***信息配置插件;
根据所述插件修改所述***信息的字节码;
将所述字节码返回所述***,生成***修改信息;
将所述***修改信息传输至服务端;以及
对所述***修改信息进行前端查询,以实现所述***信息的链路调用过程。
在本申请的一个实施例中,所述***信息包括***状态信息和***文本信息,根据所述***状态信息配置所述插件的工作环境。
在本申请的一个实施例中,
所述根据所述插件修改所述***信息的字节码包括以下步骤:
获取所述***信息,加载所述***信息的字节码;
接收并识别所述***信息类型,以获取所述***信息的字节码调用类别;以及
根据所述***信息的字节码调用类别,调用与所述***信息类型相适配的目标插件,以完成所述***信息的字节码修改。
在本申请的一个实施例中,
所述将所述***修改信息传输至服务端包括以下步骤:
根据目标插件对***字节码文件进行字节码植入,得到目标字节码文件;
根据所述目标字节码文件生成微服务接口;以及
关联***服务的调用接口,连接所述调用接口和所述微服务接口,以将所述***修改信息传输至服务端。
在本申请的一个实施例中,所述目标插件为Java Agent插件,在程序运行时进行所述字节码的修改和代码注入,得到目标字节码文件,并根据所述目标字节码文件通过所述调用接口完成所述***信息的链路调用。
在本申请的一个实施例中,
所述根据所述目标插件对***字节码文件进行字节码植入,得到目标字节码文件包括,
根据所述目标插件从网络配置中心获取服务配置信息,解析所述服务配置信息并对网络进行协议转换,以获取所述目标字节码文件。
在本申请的一个实施例中,
所述关联***服务的调用接口,连接所述调用接口和所述微服务接口,以将所述***修改信息传输至服务端包括,
验证所述调用接口和所述微服务接口的目标服务标识类别如果服务调用类别为***服务调用类别,则采用目标插件对目标服务标识对应的微服务进行可用性验证;
如果验证通过,则调用与所述调用接口目标服务标识对应的微服务;
如果验证未通过,则直接调用与所述调用接口目标服务标识对应的微服务化之前的***服务。
为实现上述目的及其他相关目的,本申请还提供一种微服务链路调用***,所述微服务链路调用***包括:
发送模块,设置在输入端,用于传输***信息;
配置模块,与所述发送模块连接,用于根据所述***信息配置链路调用插件;
存储模块,设置在服务端,且与所述配置模块连接,用于将所述链路调用插件修改后的数据存入数据库或缓存中;
显示模块,与所述存储模块连接,用于根据经所述链路调用插件修改后的数据进行所述数据的前端查询。
为实现上述目的及其他相关目的,本申请还提供一种电子设备,所述电子设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法的步骤。
为实现上述目的及其他相关目的,本申请还提供一种计算机可读存储介质,所述计算机可读存储介质其上存储于计算机程序,所述计算机程序被处理器执行时实现上述方法的步骤。
如上所述,本申请提出的一种微服务链路调用方法、***、设备及介质,无需修改客户端代码。在Java程序运行时进行字节码修改和代码注入,使用Java静态语言在运行时可以进行各种动态的代码修改,可以进行零侵入的编程。通过字节码修改技术动态修改字节码,对业务逻辑执行效率几乎没有影响。能生成可视化调用链路,实现操作的可视化呈现。使操作者快速实现对陌生***的链路调用,减少开发测试的学习成本,提高团队开发效率。
附图说明
图1为本申请在一实施例中的微服务链路调用方法流程示意图。
图2为本申请在一实施例中的微服务链路调用方法步骤S200流程示意图。
图3为本申请在一实施例中的微服务链路调用方法步骤S400流程示意图。
图4为本申请在一实施例中的一种微服务链路调用***的框图。
图5为本申请在一实施例中的一种计算机可读存储介质的框图。
图6为本申请在一实施例中的一种电子设备的结构原理框图。
具体实施方式
以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。
需要说明的是,本实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
在***信息交接获取的过程中,可以通过接口文档或相关***设计文档等方式熟悉***并开发相关需求。但是上述方法的效率较低,有的文档可能很久没更新甚至文档本身就是错误的,有的代码可读性太差,不仅不会加深我们对***的了解,甚至还可能误导开发人员,从而产生***操作错误。
请参阅图1,在本申请的一个实施例中,本申请提供一种微服务链路调用方法,本申请能够解决***信息快速调取的问题,所述微服务链路调用方法包括以下步骤:
S100、获取***信息,根据所述***信息配置插件;
S200、根据所述插件修改所述***信息的字节码;
S300、将所述字节码返回所述***,生成***修改信息;
S400、将所述***修改信息传输至服务端;
S500、对所述***修改信息进行前端查询,以实现所述***信息的链路调用过程。
请参阅图1,在本申请的一个实施例中,在步骤S100中,获取***信息,根据所述***信息配置插件。在本实施例中,开发***的信息可以为***历史文档信息、技术信息或者代码信息等。当开发***启动开始运行后,根据***的数量和状态进行插件的启动加载与配置,将***信息加载到Java虚拟机。
请参阅图1,Java虚拟机(Java Virtual Machine简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境。由于JVM可以屏蔽与具体操作***平台相关的信息,使得Java程序只需生成在JVM上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM也可以理解为是一个可运行的程序,其可以全部用软件方式来实现,也可以采用硬件或软件结合的方式来实现。当启动一个Java程序时,就会相应运行一个JVM。运行中的JVM可以称为Java虚拟机的一个实例。Java程序运行结束关闭后,运行这个程序的JVM也会关闭。
请参阅图1,在本申请的一些实施例中,当JVM运行一个Java程序时,可以使用类加载器加载Java程序的类文件,并且在计算机内申请一块内存区域,作为运行数据区。运行数据区可以用来存储程序的类文件、创建的静态对象和实例对象、方法、局部变量、中间结果、方法的返回值等。
请参阅图1,在本申请的一些实施例中,可以基于类加载器,将目标服务对应的类加载到JVM。其中,在Java中,类可以理解为是对一类事物的声明。目标服务可以理解为要满足某些需求或实现某些功能的服务。在本申请的一些实施例中,JVM的作用主要是加载编译器编译好的字节码,并解释成机器码。在Java中,将虚拟机可以读懂的代码,称之为字节码。需要说明的是,字节码是指虚拟机可以读懂的代码,也就是Java中的class文件。Java中,类可以包括属性和方法,方法必须在类中。每个Java程序的主类都包括一个main()方法,JVM启动Java程序时,会调用主类的main()方法作为Java程序的入口。
请参阅图1,在本申请的一个实施例中,当***A运行时检测到***A正处于工作状态,根据***A启动加载插件以进行字节码的动态修改。在本申请的一些实施例中,执行主体在硬件上可以例如为服务器或者计算机设备中的中央处理器,在软件上可以例如为服务器或者计算机设备中的相关的后台服务,对此不作限制。
请参阅图1,在本申请的一个实施例中,针对客户端来说,JAVA应用程序是将代码编译为字节码,通过类加载器进行加载,然后在JVM上运行的,而JVM提供接口在类加载之前或者运行时对字节码进行修改,被用来将已有框架代码修改为满足通用功能的框架代码。在插件的配置中,可以使用maven命令mvn install生成agent.jar。将agent.jar放到***应用目录/wls/wls81中,并赋予agent.jar可执行权限。
请参阅图1和图2,在本申请的一个实施例中,在步骤S200中,根据所述插件修改所述***信息的字节码。获取***信息,以通过插件对***信息进行零侵入式的微服务链路调用。接收并识别***信息类型,以获取***信息调用类别。根据***信息调用类别,调用与***信息类型相适配的微服务,以确定插件所要传输的信息。
其中,根据所述根据所述插件修改所述***信息的字节码包括以下步骤:
S210:获取所述***信息,加载所述***信息的字节码;
S220:接收并识别所述***信息类型,以获取所述***信息的字节码调用类别;
S230:根据所述***信息的字节码调用类别,调用与所述***信息类型相适配的目标插件,以完成所述***信息的字节码修改。
请参阅图1和图2,在本申请的一个实施例中,在步骤S210中,获取所述***信息,加载所述***信息的字节码。在本申请的一些实施例中,目标插件为Java Agent插件,也可以为其他任意可能的插件,对此不做限制。本申请中所配置的插件可以为Java Agent插件,上述Java Agent插件可以进行开发***内的链路调用,也可以进行开发***间的链路调用。本申请可以对单一***进行数据的收集和链路调用,也可以同时对多个***进行数据的收集和链路调用。进行信息的收集,所收集的信息包括但不限于类、方法、入参、返参、全局traceId等。在进行***链路调用之前,需要修改***应用启动参数并重启***,新增启动参数如下:
-javaagent:/wls/wls81/agent.jar=namespace=x,serverIp=x,serverPort=x.
请参阅图1和图2,同步启动Java虚拟机(JVM),Java虚拟机初始化后,premain将按照在JVM启动时指定代理的顺序调用每个代理的每个此类方法。完成此初始化步骤后,通过main调用Java应用程序方法。agent必须包含一个类,这个类具有premain方法,将该类打包为JAR文件。上述JAR文件中包含manifest文件,在manifest文件中包括Premain-Class的条目。在启动的时候,必须要设置一个启动项,指向该JAR文件的路径,JVM才能调取这个agent插件:
Java-javaagent:/to/agent.jarcom/example/spring2gx/BankTransactions.
请参阅图1和图2,在本申请的一个实施例中,在步骤S220中,接收并识别所述***信息类型,以获取所述***信息的字节码调用类别。Java Agent插件是提供给传统架构***的软件安装包。***通过安装Java Agent插件,代码零改动即可完成微服务化升级。其实现原理是,基于JavaAgent对业务***进行字节码植入,通过对目标***字节码文件增强,实现对原有网络服务的转换。Java Agent插件的源码可以使用agent+bytebuddy+netty开发完成,并使用maven命令mvn install生成agent.jar。Java Agent可以为一个JAVA类,代理类必须实现一个public static void premain(String agentArgs,Instrumentationinst)成为代理入口点的main方法,这一点与常规Java应用程序的方法类似。JavaAgant可以理解为是一个字节码层面的类的加强器,其可以在不改变类的情况下,增加一些用户需要的功能。JavaAgant可以在字节码层面对类和方法进行修改。
请参阅图1和图2,在本申请的一些实施例中,在将服务调用的执行方法所在类加载到JVM后,可以基于JVM,启动JavaAgant。其中,JavaAgant程序需要随应用程序一起启动。
请参阅图1和图2,在本申请的一些实施例中,JAR文件可以理解为是一种软件包文件格式,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便开发Java平台应用软件或库。JAR文件也可以称为jar包。JavaAgant可以用于指定一个jar包,这个jar包的MANIFEST.MF文件必须指定Premain-Class项,Premain-Class指定的类必须实现premain方法。premain方法可以理解为运行在main函数之前的类。当JVM启动时,在执行main函数之前,JVM会先运行JavaAgant所指定jar包内Premain-Class这个类的premain方法。需要说明的是,可以通过-javaagent来指定编写的Agant的jar路径及要传给Agant的参数,这样在启动时,Agant就可以实现指定功能。例如,以JavaAgant程序放置在/tmp/xxx.jar为例,可以在Java启动命令增加-javaagent:/tmp/xxx.jar。
请参阅图1和图2,ByteBuddy是一个字节码生成与操作库。它无需编译器,能够在Java程序运行时创建与修改class文件。它基于ASM框架实现,具有生成的代码更精简、速度更快的优点,实现了动态生成JAVACLASS和JAVA AGENT代理等功能。通过ByteBuddy库简单、高效等特点,合理使用它的丰富的API,并进行二次开发,可以满足服务端应用监控的需求。
请参阅图1和图2,在本申请的一个实施例中,在步骤S230中,根据所述***信息的字节码调用类别,调用与所述***信息类型相适配的目标插件,以完成所述***信息的字节码修改。
请参阅图1和图2,在本申请的一实施例中,在链路调用过程中调用Java Agent插件可以包括以下步骤:
定义一个MANIFEST.MF文件,MANIFEST.MF文件包含Premain-Class选项,也可以包括Can-Redefine-Classes和Can-Retransform-Classes选项;
创建一个Premain-Class指定的类,类中包含premain方法,方法逻辑根据需要由用户确定;
将premain的类和MANIFEST.MF文件形成jar包;以及
使用参数-javaagent:jar包路径启动所要代理的方法。
请参阅图1和图2,在本申请的一些实施例中,可以采用目标插件对工作***进行零侵入式的微服务链路调用,并基于Java Agent插件对***网络服务对应的字节码文件进行字节码修改,以得到目标字节码文件。根据目标字节码文件生成微服务链路调用的函数接口和实现类,并将***网络服务的调用接口与函数接口相关联。根据关联后的调用接口、函数接口,以及实现类生成微服务,从而完成零侵入式的微服务链路调用。
请参阅图1和图2,本申请在采用上述零侵入式的微服务链路调用方法执行零侵入式的应用***微服务链路调用时,可以先针对单体应用架构中的各个应用***配置对应的Java Agent插件。在本申请的一些实施例中,应用***包括输入端、存储端、服务端以及显示端等,而输入端***可以为单一***,也可以包括多个***,例如包括***A和***B,在对***A和***B执行零侵入式的应用***微服务链路调用,可以针对每个***,配置一个与其对应的Java Agent插件,从而采用Java Agent插件对应用***提供的网络服务进行零侵入式的微服务链路调用,得到与各个应用***对应的微服务。
请参阅图1和图2,本申请的实施例中,可以基于Java虚拟机执行零侵入式的微服务链路调用。其中,当基于Java虚拟机执行方法时,各个应用***处于零侵入式运行状态,能够有效地降低微服务转换的实现成本。可以使操作者快速实现对陌生***的链路调用,减少开发测试的学习成本,提高团队开发效率。
请参阅图1和图3,在本申请的一个实施例中,在步骤S300-S400中,将所述字节码返回所述***,生成***修改信息;将所述***修改信息传输至服务端。例如,通过服务端进行数据处理,并存储数据。服务端接收信息并将信息存入数据库或者缓存中。在本申请中,例如通过数据存储端存储调用信息。服务端所储存的信息可以包括但不限于类、方法、入参、返参、全局traceId等。
请参阅图1和图3,在本申请的一个实施例中,采用目标插件,并基于Java Agent对***字节码文件进行字节码植入,得到目标字节码文件。根据目标字节码文件生成微服务接口,将***服务的调用接口与函数接口相关联,根据关联后的调用接口完成***信息的链路调用。无需修改客户端代码,在Java程序运行时进行字节码修改和代码注入。使用Java静态语言在运行时可以进行各种动态的代码修改,可以进行零侵入的编程。其中,将***修改信息传输至服务端包括以下步骤:
S410:根据目标插件对***字节码文件进行字节码植入,得到目标字节码文件;
S420:根据所述目标字节码文件生成微服务接口;以及
S430:关联***服务的调用接口,连接所述调用接口和所述微服务接口,以将所述***修改信息传输至服务端。
请参阅图1和图3,在本申请的一个实施例中,在步骤S410中,根据目标插件对***字节码文件进行字节码植入,得到目标字节码文件。***通过接口发起请求时,Java Agent将方法、类、出参、入参、全局traceId等信息通过netty传输至服务端。开发人员根据TraceId、微服务信息和调用时间等信息查询日志信息和异常信息,用于开发人员快速分析定位问题,以及优化代码。
请参阅图1和图3,在本申请一些实施例中,采用目标插件,并基于Java Agent对与***服务对应的字节码文件进行字节码植入,得到目标字节码文件,包括:采用目标插件,并基于Java Agent从网络的配置中心获取服务配置信息。解析服务配置信息得到字节码文件,字节码文件包括:网络的实现类、服务类型。对网络的实现类、服务类型进行协议转换,并根据转换后的网络的实现类、服务类型生成目标字节码文件。
请参阅图1和图3,Java agent是java命令的一个参数。参数java agent可以用于指定一个jar包,并且上述jar包应该满足如下两项要求:
1、jar包的MANIFEST.MF文件必须指定Premain-Class项。
2、Premain-Class指定的类必须实现premain()方法。premain方法是运行在main函数之前的的类,当Java虚拟机启动时,在执行main函数之前,JVM会先运行-javaagent所指定jar包内Premain-Class这个类的premain方法。
上述在基于Java Agent从网络的配置中心获取服务配置信息之后,还可以是将配置中心缓存至本地,从而能够便于后续对配置信息的调用和解析,提升单体应用微服务化效率。
为了方便操作Java字节码,需要引入Javassist的maven包,并通过注入代码来修改构造函数:
定义premain方法,将SimpleClassTransformer类的实例添加到检测上下文中;
提供正确的MANIFEST.MF,以便JVM能够选择正确的类。
请参阅图1和图3,在本申请的一个实施例中,在步骤S420中,根据所述目标字节码文件生成微服务接口。
本申请在premain方法中,可以注册一个Transformer,在每个类加载的时候捕获字节,进行所需的修改,然后返回修改后的字节。修改并返回修改后的字节属于类加载器所加载的字节,main方法将会执行原有的功能。当agent类加载后,premain方法会在应用程序的main方法之前被调用,并根据目标字节码文件生成微服务接口。
请参阅图1和图3,在本申请的一个实施例中,在步骤S430中,关联***服务的调用接口,连接所述调用接口和所述微服务接口,以将所述***修改信息传输至服务端。本申请实施例可以采用上述的目标插件,基于Java Agent对业务***提供的网络服务进行字节码植入,通过对目标***提供的网络服务的字节码文件增强,实现对原有网络服务的转换。本申请实施例可以应用在对客户端***进行微服务转换的过程中,也可以应用在对服务端***进行微服务转换的过程中。还可以应用在同时对客户端***和服务端***进行微服务转换的过程中,对此不做限制。
请参阅图1和图3,本申请的另一些实施例中,根据服务调用类别,调用与目标服务标识对应的微服务,包括:如果服务调用类别为***服务调用类别,则采用目标插件对目标服务标识对应的微服务进行可用性验证;如果验证通过,则调用与目标服务标识对应的微服务;如果验证未通过,则直接调用与目标服务标识对应的微服务化之前的***服务。
请参阅图1和图3,本实施例中,通过针对单体应用架构中的各个应用***配置对应的目标插件,并采用目标插件对应用***提供的***服务进行非侵入式的微服务转换,得到与各个应用***对应的微服务,接收目标服务请求,并解析目标服务请求得到服务调用类别和目标服务标识,以及根据服务调用类别,调用与目标服务标识对应的微服务,能够实现使单体应用架构的代码在零改动的情况直接适配微服务架构,有效地提升微服务架构和单体应用架构的对接适配效率和对接适配性能。
请参阅图1,在本申请的一个实施例中,在步骤S500中,对所述***修改信息进行前端查询,以实现所述***信息的链路调用过程。用户通过服务端网络模块根据全局traceId查询到整个接口调用链路,包括***内的链路调用和***间的链路调用。在JAVA应用程序启动时,只需要在JVM参数中加上相关路径,如:-javaagent:相关jar路径,从而在运行时执行监控和调用链埋点,对业务零侵入。这样便可以结合CAT强大监控功能和字节码低成本接入优势。开发者可以在包含网络模块前端控制台页面上查询到链路调用信息,所查询的信息包括但不限于类、方法、入参、返参、全局traceId等。还可以监控指标报表,如服务调用链、响应时间、SQL执行等,如果有异常信息,可以实时查看。本申请提出的微服务链路调用方法可以生成可视化调用链路,实现操作的可视化呈现。使操作者快速实现对陌生***的链路调用,减少开发测试的学习成本,提高团队开发效率。
请参阅图4和图1,在本申请的另一个实施例中,本申请还提供一种微服务链路调用***,所述微服务链路调用***包括发送模块100、配置模块200、存储模块300和显示模块400。发送模块100设置在输入端,用于传输***信息。配置模块200与发送模块100连接,用于根据***信息配置链路调用插件。存储模块300设置在服务端,且与配置模块200连接,用于将链路调用插件修改后的数据存入数据库或缓存中。显示模块400与存储模块300连接,用于根据经链路调用插件修改后的数据进行数据的前端查询。
请参阅图4和图1,在本申请的一个实施例中,发送模块100设置在输入端,用于传输***信息。在本实施例中,开发***的信息可以为***历史文档信息、技术信息或者代码信息等。当开发***启动开始运行后,根据***的数量和状态进行插件的启动加载与配置,将***信息加载到Java虚拟机。当JVM运行一个Java程序时,可以使用类加载器加载Java程序的类文件,并且在计算机内申请一块内存区域,作为运行数据区。运行数据区可以用来存储程序的类文件、创建的静态对象和实例对象、方法、局部变量、中间结果、方法的返回值等。
请参阅图4和图1,在本申请的一个实施例中,可以基于类加载器,将目标服务对应的类加载到JVM。其中,在Java中,类可以理解为是对一类事物的声明。目标服务可以理解为要满足某些需求或实现某些功能的服务。在本申请的一些实施例中,JVM的作用主要是加载编译器编译好的字节码,并解释成机器码。在Java中,将虚拟机可以读懂的代码,称之为字节码。需要说明的是,字节码是指虚拟机可以读懂的代码,也就是Java中的class文件。Java中,类可以包括属性和方法,方法必须在类中。每个Java程序的主类都包括一个main()方法,JVM启动Java程序时,会调用主类的main()方法作为Java程序的入口。
请参阅图4和图1,在本申请的一个实施例中,当***A运行时检测到***A正处于工作状态,根据***A启动加载插件以进行字节码的动态修改。在本申请的一些实施例中,执行主体在硬件上可以例如为服务器或者计算机设备中的中央处理器,在软件上可以例如为服务器或者计算机设备中的相关的后台服务,对此不作限制。
请参阅图4和图1,在本申请的一个实施例中,针对客户端来说,JAVA应用程序是将代码编译为字节码,通过类加载器进行加载,然后在JVM上运行的,而JVM提供接口在类加载之前或者运行时对字节码进行修改,被用来将已有框架代码修改为满足通用功能的框架代码。在插件的配置中,可以使用maven命令mvn install生成agent.jar。将agent.jar放到***应用目录/wls/wls81中,并赋予agent.jar可执行权限。
请参阅图1-2和图4,在本申请的一个实施例中,配置模块200与发送模块100连接,用于根据***信息配置链路调用插件。在本实施例中,获取***信息,以通过插件对***信息进行零侵入式的微服务链路调用。接收并识别***信息类型,以获取***信息调用类别。根据***信息调用类别,调用与***信息类型相适配的微服务,以确定插件所要传输的信息。
其中,根据所述根据所述插件修改所述***信息的字节码包括以下步骤:
S210:获取所述***信息,加载所述***信息的字节码;
S220:接收并识别所述***信息类型,以获取所述***信息的字节码调用类别;
S230:根据所述***信息的字节码调用类别,调用与所述***信息类型相适配的目标插件,以完成所述***信息的字节码修改。
具体的,在步骤S210中,获取所述***信息,加载所述***信息的字节码。在本申请的一些实施例中,目标插件为Java Agent插件,也可以为其他任意可能的插件,对此不做限制。本申请中所配置的插件可以为Java Agent插件,上述Java Agent插件可以进行开发***内的链路调用,也可以进行开发***间的链路调用。本申请可以对单一***进行数据的收集和链路调用,也可以同时对多个***进行数据的收集和链路调用。进行信息的收集,所收集的信息包括但不限于类、方法、入参、返参、全局traceId等。
在步骤S220中,接收并识别所述***信息类型,以获取所述***信息的字节码调用类别。Java Agent插件是提供给传统架构***的软件安装包。***通过安装Java Agent插件,代码零改动即可完成微服务化升级。其实现原理是,基于JavaAgent对业务***进行字节码植入,通过对目标***字节码文件增强,实现对原有网络服务的转换。Java Agent插件的源码可以使用agent+bytebuddy+netty开发完成,并使用maven命令mvn install生成agent.jar。Java Agent可以为一个JAVA类,代理类必须实现一个public static voidpremain(String agentArgs,Instrumentation inst)成为代理入口点的main方法,这一点与常规Java应用程序的方法类似。JavaAgant可以理解为是一个字节码层面的类的加强器,其可以在不改变类的情况下,增加一些用户需要的功能。JavaAgant可以在字节码层面对类和方法进行修改。
在步骤S230中,根据所述***信息的字节码调用类别,调用与所述***信息类型相适配的目标插件,以完成所述***信息的字节码修改。可以采用目标插件对工作***进行零侵入式的微服务链路调用,并基于Java Agent插件对***网络服务对应的字节码文件进行字节码修改,以得到目标字节码文件。根据目标字节码文件生成微服务链路调用的函数接口和实现类,并将***网络服务的调用接口与函数接口相关联。根据关联后的调用接口、函数接口,以及实现类生成微服务,从而完成零侵入式的微服务链路调用。
本申请在采用上述零侵入式的微服务链路调用方法执行零侵入式的应用***微服务链路调用时,可以先针对单体应用架构中的各个应用***配置对应的Java Agent插件。在本申请的一些实施例中,应用***包括输入端、存储端、服务端以及显示端等,而输入端***可以为单一***,也可以包括多个***,例如包括***A和***B,在对***A和***B执行零侵入式的应用***微服务链路调用,可以针对每个***,配置一个与其对应的JavaAgent插件,从而采用Java Agent插件对应用***提供的网络服务进行零侵入式的微服务链路调用,得到与各个应用***对应的微服务。
请参阅图1、图3和图4,在本申请的一个实施例中,存储模块300设置在服务端,且与配置模块200连接,用于将链路调用插件修改后的数据存入数据库或缓存中。采用目标插件,并基于Java Agent对***字节码文件进行字节码植入,得到目标字节码文件。根据目标字节码文件生成微服务接口,将***服务的调用接口与函数接口相关联,根据关联后的调用接口完成***信息的链路调用。无需修改客户端代码,在Java程序运行时进行字节码修改和代码注入。使用Java静态语言在运行时可以进行各种动态的代码修改,可以进行零侵入的编程。其中,将***修改信息传输至服务端包括以下步骤:
S410:根据目标插件对***字节码文件进行字节码植入,得到目标字节码文件;
S420:根据所述目标字节码文件生成微服务接口;以及
S430:关联***服务的调用接口,连接所述调用接口和所述微服务接口,以将所述***修改信息传输至服务端。
具体的,在步骤S410中,根据目标插件对***字节码文件进行字节码植入,得到目标字节码文件。***通过接口发起请求时,Java Agent将方法、类、出参、入参、全局traceId等信息通过netty传输至服务端。开发人员根据TraceId、微服务信息和调用时间等信息查询日志信息和异常信息,用于开发人员快速分析定位问题,以及优化代码。
在步骤S420中,根据所述目标字节码文件生成微服务接口。本申请在premain方法中,可以注册一个Transformer,在每个类加载的时候捕获字节,进行所需的修改,然后返回修改后的字节。修改并返回修改后的字节属于类加载器所加载的字节,main方法将会执行原有的功能。当agent类加载后,premain方法会在应用程序的main方法之前被调用,并根据目标字节码文件生成微服务接口。
在步骤S430中,关联***服务的调用接口,连接所述调用接口和所述微服务接口,以将所述***修改信息传输至服务端。本申请实施例可以采用上述的目标插件,基于JavaAgent对业务***提供的网络服务进行字节码植入,通过对目标***提供的网络服务的字节码文件增强,实现对原有网络服务的转换。本申请实施例可以应用在对客户端***进行微服务转换的过程中,也可以应用在对服务端***进行微服务转换的过程中。还可以应用在同时对客户端***和服务端***进行微服务转换的过程中,对此不做限制。
请参阅图1、图3和图4,通过服务端进行数据处理,并存储数据。服务端接收信息并将信息存入数据库或者缓存中。在本申请中,例如通过数据存储端存储调用信息。服务端所储存的信息可以包括但不限于类、方法、入参、返参、全局traceId等。
请参阅图1和图4,在本申请的一个实施例中,显示模块400与存储模块300连接,用于根据经链路调用插件修改后的数据进行数据的前端查询。用户通过服务端网络模块根据全局traceId查询到整个接口调用链路,包括***内的链路调用和***间的链路调用。在JAVA应用程序启动时,只需要在JVM参数中加上相关路径,如:-javaagent:相关jar路径,从而在运行时执行监控和调用链埋点,对业务零侵入。这样便可以结合CAT强大监控功能和字节码低成本接入优势。开发者可以在包含网络模块前端控制台页面上查询到链路调用信息,所查询的信息包括但不限于类、方法、入参、返参、全局traceId等。还可以监控指标报表,如服务调用链、响应时间、SQL执行等,如果有异常信息,可以实时查看。本申请提出的微服务链路调用方法可以生成可视化调用链路,实现操作的可视化呈现。使操作者快速实现对陌生***的链路调用,减少开发测试的学习成本,提高团队开发效率。
请参阅图5,本申请还提出一种计算机可读存储介质10,计算机可读存储介质20存储有计算机指令20,计算机指令20用于使用所述微服务链路调用方法。计算机可读存储介质10可以是电子介质、磁介质、光介质、电磁介质、红外介质或半导体***或传播介质。计算机可读存储介质10还可以包括半导体或固态存储器、磁带、可移动计算机磁盘、随机存取存储器(RAM)、只读存储器(ROM)、硬磁盘和光盘。光盘可以包括光盘-只读存储器(CD-ROM)、光盘-读/写(CD-RW)和DVD。
请参阅图6,本申请还提供一种电子设备,包括处理器30和存储器40,存储器40存储有程序指令,处理器30运行程序指令实现所述微服务链路调用方法。处理器30可以是通用处理器,包括中央处理器(Central Processing Unit,简称CPU)、网络处理器(NetworkProcessor,简称NP)等;还可以是数字信号处理器(Digital Signal Processing,简称DSP)、专用集成电路(Application Specific Integrated Circuit,简称ASIC)、现场可编程门阵列(Field-Programmable Gate Array,简称FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件;存储器40可能包含随机存取存储器(Random AccessMemory,简称RAM),也可能还包括非易失性存储器(Non-Volatile Memory),例如至少一个磁盘存储器。存储器40也可以为随机存取存储器(Random Access Memory,RAM)类型的内部存储器,处理器30和存储器40可以集成为一个或多个独立的电路或硬件,如:专用集成电路(Application SpecificIntegrated Circuit,ASIC)。需要说明的是,存储器40中的计算机程序可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,电子设备,或者网络设备等)执行本申请各个实施例方法的全部或部分步骤。
本发明所示实施例的上述描述(包括在说明书摘要中所述的内容)并非意在详尽列举或将本发明限制到本文所公开的精确形式。尽管在本文仅为说明的目的而描述了本发明的具体实施例和本发明的实例,但是正如本领域技术人员将认识和理解的,各种等效修改是可以在本发明的精神和范围内的。如所指出的,可以按照本发明所述实施例的上述描述来对本发明进行这些修改,并且这些修改将在本发明的精神和范围内。
本文已经在总体上将***和方法描述为有助于理解本发明的细节。此外,已经给出了各种具体细节以提供本发明实施例的总体理解。然而,相关领域的技术人员将会认识到,本发明的实施例可以在没有一个或多个具体细节的情况下进行实践,或者利用其它装置、***、配件、方法、组件、材料、部分等进行实践。在其它情况下,并未特别示出或详细描述公知结构、材料和/或操作以避免对本发明实施例的各方面造成混淆。
因而,尽管本发明在本文已参照其具体实施例进行描述,但是修改自由、各种改变和替换意在上述公开内,在没有对应使用其他特征的情况下将采用本发明的一些特征。因此,可以进行许多修改,以使特定环境或材料适应本发明的实质范围和精神。本发明并非意在限制到在下面权利要求书中使用的特定术语和/或作为设想用以执行本发明的最佳方式公开的具体实施例,但是本发明将包括落入所附权利要求书范围内的任何和所有实施例及等同物。因而,本发明的范围将只由所附的权利要求书进行确定。
以上描述仅为本申请的较佳实施例以及对所运用技术原理的说明,本领域技术人员应当理解,本申请中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案,例如上述特征与本申请中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。除说明书所述的技术特征外,其余技术特征为本领域技术人员的已知技术,为突出本发明的创新特点,其余技术特征在此不再赘述。
Claims (10)
1.一种微服务链路调用方法,其特征在于,包括:
获取***信息,根据所述***信息配置插件;
根据所述插件修改所述***信息的字节码;
将所述字节码返回所述***,生成***修改信息;
将所述***修改信息传输至服务端;以及
对所述***修改信息进行前端查询,以实现所述***信息的链路调用过程。
2.根据权利要求1所述的微服务链路调用方法,其特征在于,所述***信息包括***状态信息和***文本信息,根据所述***状态信息配置所述插件的工作环境。
3.根据权利要求1所述的微服务链路调用方法,其特征在于,所述根据所述插件修改所述***信息的字节码包括以下步骤:
获取所述***信息,加载所述***信息的字节码;
接收并识别所述***信息类型,以获取所述***信息的字节码调用类别;以及
根据所述***信息的字节码调用类别,调用与所述***信息类型相适配的目标插件,以完成所述***信息的字节码修改。
4.根据权利要求1所述的微服务链路调用方法,其特征在于,所述将所述***修改信息传输至服务端包括以下步骤:
根据目标插件对***字节码文件进行字节码植入,得到目标字节码文件;
根据所述目标字节码文件生成微服务接口;以及
关联***服务的调用接口,连接所述调用接口和所述微服务接口,以将所述***修改信息传输至服务端。
5.根据权利要求4所述的微服务链路调用方法,其特征在于,所述目标插件为JavaAgent插件,在程序运行时进行所述字节码的修改和代码注入,得到目标字节码文件,并根据所述目标字节码文件通过所述调用接口完成所述***信息的链路调用。
6.根据权利要求4所述的微服务链路调用方法,其特征在于,所述根据所述目标插件对***字节码文件进行字节码植入,得到目标字节码文件包括,
根据所述目标插件从网络配置中心获取服务配置信息,解析所述服务配置信息并对网络进行协议转换,以获取所述目标字节码文件。
7.根据权利要求4所述的微服务链路调用方法,其特征在于,所述关联***服务的调用接口,连接所述调用接口和所述微服务接口,以将所述***修改信息传输至服务端包括,
验证所述调用接口和所述微服务接口的目标服务标识类别如果服务调用类别为***服务调用类别,则采用目标插件对目标服务标识对应的微服务进行可用性验证;
如果验证通过,则调用与所述调用接口目标服务标识对应的微服务;
如果验证未通过,则直接调用与所述调用接口目标服务标识对应的微服务化之前的***服务。
8.一种微服务链路调用***,其特征在于,包括:
发送模块,设置在输入端,用于传输***信息;
配置模块,与所述发送模块连接,用于根据所述***信息配置链路调用插件;
存储模块,设置在服务端,且与所述配置模块连接,用于将所述链路调用插件修改后的数据存入数据库或缓存中;
显示模块,与所述存储模块连接,用于根据经所述链路调用插件修改后的数据进行所述数据的前端查询。
9.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1所述的微服务链路调用方法。
10.一种计算机可读存储介质,其上存储于计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1所述的微服务链路调用方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111563876.3A CN114237770A (zh) | 2021-12-20 | 2021-12-20 | 一种微服务链路调用方法、***、设备及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111563876.3A CN114237770A (zh) | 2021-12-20 | 2021-12-20 | 一种微服务链路调用方法、***、设备及介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114237770A true CN114237770A (zh) | 2022-03-25 |
Family
ID=80759611
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111563876.3A Pending CN114237770A (zh) | 2021-12-20 | 2021-12-20 | 一种微服务链路调用方法、***、设备及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114237770A (zh) |
-
2021
- 2021-12-20 CN CN202111563876.3A patent/CN114237770A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108027722B (zh) | 在编译和部署中动态更新应用 | |
US9015702B2 (en) | Determining compatibility of an application with different versions of an operating system | |
US8156473B2 (en) | Model oriented debugging | |
Sen et al. | Jalangi: A selective record-replay and dynamic analysis framework for JavaScript | |
US8286149B2 (en) | Apparatus for and method of implementing feedback directed dependency analysis of software applications | |
US9684786B2 (en) | Monitoring an application in a process virtual machine | |
Nielsen et al. | Nodest: feedback-driven static analysis of Node. js applications | |
US10331425B2 (en) | Automated source code adaption to inject features between platform versions | |
Shatnawi et al. | Analyzing program dependencies in java ee applications | |
US9170787B2 (en) | Componentization of compiler functionality | |
US10078497B2 (en) | Bridging a module system and a non-module system | |
US9626171B2 (en) | Composing a module system and a non-module system | |
US9459986B2 (en) | Automatic generation of analysis-equivalent application constructs | |
US9405906B1 (en) | System and method for enhancing static analysis of software applications | |
US10083029B2 (en) | Detect application defects by correlating contracts in application dependencies | |
US11157249B1 (en) | Method and system for identifying and extracting independent services from a computer program | |
US10229273B2 (en) | Identifying components for static analysis of software applications | |
Arzt et al. | Towards cross-platform cross-language analysis with soot | |
CN114116509A (zh) | 程序分析方法、装置、电子设备和存储介质 | |
CN113987337A (zh) | 基于组件化动态编排的搜索方法、***、设备及存储介质 | |
EP2885712B1 (en) | Imperative attribution for elements in managed runtimes | |
Shatnawi et al. | Static code analysis of multilanguage software systems | |
CN111240728A (zh) | 应用程序更新方法、装置、设备和存储介质 | |
CN114237770A (zh) | 一种微服务链路调用方法、***、设备及介质 | |
Santos et al. | Salsa: static analysis of serialization features |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |