CN115185495A - 单体应用微服务拆分方法、***、设备及存储介质 - Google Patents
单体应用微服务拆分方法、***、设备及存储介质 Download PDFInfo
- Publication number
- CN115185495A CN115185495A CN202210843226.2A CN202210843226A CN115185495A CN 115185495 A CN115185495 A CN 115185495A CN 202210843226 A CN202210843226 A CN 202210843226A CN 115185495 A CN115185495 A CN 115185495A
- Authority
- CN
- China
- Prior art keywords
- track
- service
- micro
- single application
- application
- 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
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3692—Test management for test results analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明属于微服务解耦领域,公开了一种单体应用微服务拆分方法、***、设备及存储介质,包括获取单体应用的测试用例执行过程的监控日志,得到单体应用轨迹;根据单体应用轨迹,调用FoSCI框架,得到单体应用拆分方案;获取单体应用源码,根据单体应用源码、单体应用轨迹以及单体应用拆分方案拆分单体应用,得到若干微服务;获取若干微服务的测试用例执行过程的监控日志,得到微服务轨迹;对比单体应用轨迹以及微服务轨迹,得到轨迹相似度,当轨迹相似度大于预设阈值时,输出拆分的微服务;否则,获取并根据人工修改后的拆分方案,更新当前拆分方案并重复上述步骤。使得微服务拆分工作形成闭环,不断优化方案,保证拆分后的微服务能够进行落地实现。
Description
技术领域
本发明属于微服务解耦领域,涉及一种单体应用微服务拆分方法、***、设备及存储介质。
背景技术
微服务是一些协同工作的小而自治的服务。在单体应用中,通常会创建一些抽象层或者模块来保证代码的内聚性,以避免由于代码库不断增大而导致的维护困难现象。微服务将内聚性这一概念用在独立的服务上,根据业务的边界来确定服务的边界,这样就很容易确定某个功能代码应该放在哪里,而且由于该服务专注于某个边界之内,可以很好地避免由于代码库过大衍生出的很多相关问题。
随着微服务的不断发展,其在企业中的使用频率越来越高,能够快速且准确的实施拆分是微服务使用企业的共同期待。对此,学术界做了很多研究工作。目前,根据拆分边界的选择方式分类,微服务拆分方法包括数据驱动的方法、结构驱动的方法、领域驱动的方法以及根据轨迹信息抽取业务逻辑以进行拆分的方法,这些方法都在实施微服务自动拆分的领域都做出了一定的贡献。
但是,当前这些微服务拆分方法仍然存在一些问题。例如,目前的微服务拆分方法仅能实现对微服务的拆分,对微服务拆分方案实现闭环优化的工作很少,目前在实施完拆分之后,更多的关注点放在使用指标度量拆分后的方案质量,无法保证拆分后的微服务能够进行落地实现。
发明内容
本发明的目的在于克服上述现有技术中,现有微服务拆分方案在实施完拆分之后,无法保证拆分后的微服务能够进行落地实现的缺点,提供一种单体应用微服务拆分方法、***、设备及存储介质。
为达到上述目的,本发明采用以下技术方案予以实现:
本发明第一方面,一种单体应用微服务拆分方法,包括:
S1:获取单体应用的测试用例执行过程的监控日志,得到单体应用轨迹;
S2:根据单体应用轨迹,调用FoSCI框架,得到单体应用拆分方案;
S3:获取单体应用源码,根据单体应用源码、单体应用轨迹以及单体应用拆分方案拆分单体应用,得到若干微服务;
S4:获取若干微服务的测试用例执行过程的监控日志,得到微服务轨迹;
S5:对比单体应用轨迹以及微服务轨迹,得到轨迹相似度,当轨迹相似度大于预设阈值时,输出拆分的微服务;否则,获取并根据人工修改后的拆分方案,更新当前拆分方案并返回S3。
可选的,所述获取单体应用的测试用例执行过程的监控日志,得到单体应用轨迹包括:
基于动态插桩技术,对单体应用的测试用例执行过程进行监控以提取监控日志,对监控日志中的重复数据或噪声数据进行清洗过滤,得到单体应用轨迹数据;
将单体应用轨迹数据按照下式进行形式化表示,得到单体应用轨迹:
ATi={a_trace_idi,a_call_seti}
其中,ATi为单体应用轨迹的第i条轨迹,a_trace_idi代表单体应用轨迹的第i条轨迹的编号,a_call_seti代表单体应用轨迹的第i条轨迹中所有的调用关系集;a_call_seti={ac1,...,acl,...,ack};其中,k为单体应用轨迹的第i条轨迹中调用关系的个数;acl为单体应用轨迹的第i条轨迹中第l个调用关系;acl=(method1,method2,m1para,m2para,class1,class2,m1_return,m2_return),其中,method1表示第l个调用关系中的源方法名,method2表示第l个调用关系中的目的方法名,m1_para表示第l个调用关系中的源方法的入参类型,m2_para表示第l个调用关系中的目的方法的入参类型,class1表示为第l个调用关系中的源方法所在的类名,class2表示第l个调用关系中的目的方法所在的类名,m1_return表示第l个调用关系中的源方法的返回值类型,m2_return表示第l个调用关系中的目的方法的返回值类型。
可选的,所述根据单体应用轨迹,调用FoSCI框架,得到单体应用拆分方案包括:
将单体应用轨迹根据FoSCI框架输入要求进行转化处理并输入FoSCI框架,得到单体应用拆分方案;
其中,单体应用拆分方案包含实体集合SC和接口集合I:
SC={SCt}={service_namet,entity_sett}
I={It}={service_namet,interface_sett}
其中,service_namet表示第t个微服务的名称,entity_sett表示第t个微服务下的所有实体集合,entity_sett={entity1,...,entityq},其中,q表示第t个微服务中实体的个数,entityq表示第t个微服务中实体q的名称;interface_sett表示第t个微服务下的所有接口集合,interface_sett={o1,...,on},其中,on为第n个方法,on=(oper,oper_para,oper_return),oper代表接口中第n个方法的方法名,oper_para代表第n个方法入参类型,oper_return代表第n个方法返回值类型。
可选的,所述根据单体应用源码、单体应用轨迹以及单体应用拆分方案拆分单体应用包括:
根据单体应用拆分方案中的实体集合创建若干微服务代码目录,将单体应用源码中所有内容复制至各微服务代码目录,将各微服务代码目录中不属于当前微服务的类作为dummy类,清除dummy类中所有方法内的逻辑和注解并注入异常;
每个微服务分别创建微服务工具类:包括创建用于记录每条轨迹信息的代码文件、用于进行传输数据的序列化的代码文件、用于获取当前application的上下文的代码文件以及用于微服务对象管理的代码文件;
根据单体应用拆分方案中的接口集合确定每个微服务的入口类,根据每个微服务的入口类的方法信息创建每个微服务的服务类;以及在每个微服务下创建一个服务注册类,在服务注册类中对微服务的服务类进行注册;
将单体应用轨迹中每条轨迹内的调用关系均表示为一个调用链形式的结果,得到若干调用链,以及结合实体集合对各调用链中跨服务的类节点进行识别,获取每个微服务下的代理类集合;以及对每个微服务下的代理类集合的内容进行修改,使当前微服务可以与相关微服务进行通信;
在每个微服务下的pom.xml文件内引入服务间通信框架的配置;以及在每个微服务下的web.xml文件中注入rest接口的配置。
可选的,所述获取若干微服务的测试用例执行过程的监控日志,得到微服务轨迹包括:
根据单体应用轨迹,在各微服务的代码中进行方法调用后以及有返回值的地方***调用日志,然后将各微服务部署在服务器上,使用与S1中相同的测试用例进行测试和监控日志的获取,得到微服务轨迹:
MTi={m_trace_idi,m_call_seti}
其中,MTi为微服务轨迹的第i条轨迹,m_trace_idi代表微服务轨迹的第i条轨迹的编号,m_call_seti代表微服务轨迹的第i条轨迹中所有的调用关系集;m_call_seti={mc1,...,mcl,...,mck};其中,k为微服务轨迹的第i条轨迹中调用关系的个数,mcl为微服务轨迹的第i条轨迹中第l个调用关系;mcl=(method1,method2,mlpara,m2para,class1,class2,m1_return,m2-return)。
可选的,所述对比单体应用轨迹以及微服务轨迹,得到轨迹相似度包括:
通过下式进行单体应用轨迹的第i条轨迹与微服务轨迹的第i条轨迹的对比:
len(a_call_seti)=len(m_call_seti)
a_call_seti.ack=m_call_seti.mck
其中,len(a_call_seti)为单体应用轨迹的第i条轨迹调用关系集长度;len(m_call_seti)为微服务轨迹的第i条轨迹调用关系集长度;a_call_seti.ack为单体应用轨迹的第i条轨迹调用关系集中的第k条调用关系;m_call_seti.mck为微服务轨迹的第i条轨迹调用关系集中的第k条调用关系;
当单体应用轨迹的第i条轨迹与微服务轨迹的第i条轨迹满足上式时,单体应用轨迹的第i条轨迹与微服务轨迹的第i条轨迹一致;否则,不一致;
通过下式得到轨迹相似度:轨迹相似度=单体应用轨迹与微服务轨迹中轨迹一致的数量/轨迹总数量。
可选的,所述预设阈值为90%。
本发明第二方面,一种单体应用微服务拆分***,包括:
单体应用轨迹获取模块,用于获取单体应用的测试用例执行过程的监控日志,得到单体应用轨迹;
拆分方案获取模块,用于根据单体应用轨迹,调用FoSCI框架,得到单体应用拆分方案;
拆分模块,用于获取单体应用源码,根据单体应用源码、单体应用轨迹以及单体应用拆分方案拆分单体应用,得到若干微服务;
微服务轨迹获取模块,用于获取若干微服务的测试用例执行过程的监控日志,得到微服务轨迹;
校验模块,用于对比单体应用轨迹以及微服务轨迹,得到轨迹相似度,当轨迹相似度大于预设阈值时,输出拆分的微服务;否则,获取并根据人工修改后的拆分方案,更新当前拆分方案并触发拆分模块。
本发明第三方面,一种计算机设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述单体应用微服务拆分方法的步骤。
本发明第四方面,一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上所述单体应用微服务拆分方法的步骤。
与现有技术相比,本发明具有以下有益效果:
本发明单体应用微服务拆分方法,首先使用一组测试用例提取单体应用运行轨迹,基于运行轨迹对单体应用拆分生成初步拆分方案,然后,基于初步拆分方案,对单体应用代码进行拆分,得到若干微服务,实现了对单体应用从拆分方案到代码拆分的流程,节省了时间成本和人力成本,接着对若干微服务使用同单体应用一致的测试用例进行测试以及运行轨迹提取,将提取到的单体应用运行轨迹和微服务运行轨迹进行轨迹对比,根据对比结果反馈拆分方案是否合理。若不合理,用户还可自定义修改拆分方案,优化拆分结果。本方法单体应用微服务拆分方法不仅考虑到拆分代码的生成,同时根据拆分代码的结果还可对拆分方案的合理性进行评估,使得微服务拆分工作形成闭环,不断优化方案,最终生成满意的拆分结果,保证拆分后的微服务能够进行落地实现。
附图说明
图1为本发明实施例的单体应用微服务拆分方法流程图;
图2为本发明实施例的单体应用自动服务化之后跨服务调用的顺序流程图;
图3为本发明实施例的单体应用微服务拆分***结构框图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、***、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
下面结合附图对本发明做进一步详细描述:
参见图1,本发明一实施例中,提供一种单体应用微服务拆分方法,利用单体应用源码以及动态运行轨迹来进行微服务拆分和落地实现的工作。具体的,该单体应用微服务拆分方法包括以下步骤:
S1:获取单体应用的测试用例执行过程的监控日志,得到单体应用轨迹;
S2:根据单体应用轨迹,调用FoSCI框架,得到单体应用拆分方案;
S3:获取单体应用源码,根据单体应用源码、单体应用轨迹以及单体应用拆分方案拆分单体应用,得到若干微服务;
S4:获取若干微服务的测试用例执行过程的监控日志,得到微服务轨迹;
S5:对比单体应用轨迹以及微服务轨迹,得到轨迹相似度,当轨迹相似度大于预设阈值时,输出拆分的微服务;否则,获取并根据人工修改后的拆分方案,更新当前拆分方案并返回S3。
本发明单体应用微服务拆分方法,首先使用一组测试用例提取单体应用运行轨迹,基于运行轨迹对单体应用拆分生成初步拆分方案,然后,基于初步拆分方案,对单体应用代码进行拆分,得到若干微服务,实现了对单体应用从拆分方案到代码拆分的流程,节省了时间成本和人力成本,接着对若干微服务使用同单体应用一致的测试用例进行测试以及运行轨迹提取,将提取到的单体应用运行轨迹和微服务运行轨迹进行轨迹对比,根据对比结果反馈拆分方案是否合理。若不合理,用户还可自定义修改拆分方案,优化拆分结果。本方法单体应用微服务拆分方法不仅考虑到拆分代码的生成,同时根据拆分代码的结果还可对拆分方案的合理性进行评估,使得微服务拆分工作形成闭环,不断优化方案,最终生成满意的拆分结果,保证拆分后的微服务能够进行落地实现。
在一种可能的实施方式中,所述获取单体应用的测试用例执行过程的监控日志,得到单体应用轨迹包括:
基于动态插桩技术,对单体应用的测试用例执行过程进行监控以提取监控日志,对监控日志中的重复数据或噪声数据进行清洗过滤,得到单体应用轨迹数据。
将单体应用轨迹数据按照下式进行形式化表示,得到单体应用轨迹:
ATi={a_trace_idi,a_call_seti}
其中,ATi为单体应用轨迹的第i条轨迹,a_trace_idi代表单体应用轨迹的第i条轨迹的编号,a_call_seti代表单体应用轨迹的第i条轨迹中所有的调用关系集;a_call_seti={ac1,...,acl,...,ack};其中,k为单体应用轨迹的第i条轨迹中调用关系的个数;acl为单体应用轨迹的第i条轨迹中第l个调用关系;acl=(method1,method2,m1para,m2para,class1,class2,m1_return,m2-return),其中,method1表示第l个调用关系中的源方法名,method2表示第l个调用关系中的目的方法名,m1_para表示第l个调用关系中的源方法的入参类型,m2_para表示第l个调用关系中的目的方法的入参类型,class1表示为第l个调用关系中的源方法所在的类名,class2表示第l个调用关系中的目的方法所在的类名,m1_return表示第l个调用关系中的源方法的返回值类型,m2_return表示第l个调用关系中的目的方法的返回值类型。
具体的,基于动态插桩技术,对单体应用的测试用例执行过程进行监控以提取监控日志时,可以采用动态插桩工具Kieker,在单体应用需要监控的位置前后***监控代码,实现对函数级代码的动态监控。直接提取到的监控日志中存在很多重复或噪声数据,需要将这些数据清除出数据集,然后对清除完的噪声数据的轨迹数据集进行形式化表示。
在一种可能的实施方式中,所述根据单体应用轨迹,调用FoSCI框架,得到单体应用拆分方案包括:将单体应用轨迹根据FoSCI框架输入要求进行转化处理并输入FoSCI框架,得到单体应用拆分方案。
其中,单体应用拆分方案包含实体集合SC和接口集合I:
SC={SCt}={service_namet,entity_sett}
I={It}={service_namet,interface_sett}
其中,service_namet表示第t个微服务的名称,entity_sett表示第t个微服务下的所有实体集合,entity_sett={entity1,...,entityq},其中,q表示第t个微服务中实体的个数,entityq表示第t个微服务中实体q的名称;interface_sett表示第t个微服务下的所有接口集合,interface_sett={o1,...,on},其中,on为第n个方法,on=(oper,oper_para,oper_return),oper代表接口中第n个方法的方法名,oper_para代表第n个方法入参类型,oper_return代表第n个方法返回值类型。
在一种可能的实施方式中,所述根据单体应用源码、单体应用轨迹以及单体应用拆分方案拆分单体应用包括:根据单体应用拆分方案中的实体集合创建若干微服务代码目录,将单体应用源码中所有内容复制至各微服务代码目录,将各微服务代码目录中不属于当前微服务的类作为dummy类,清除dummy类中所有方法内的逻辑和注解并注入异常;创建微服务工具类:包括创建用于记录每条轨迹信息的代码文件、用于进行传输数据的序列化的代码文件、用于获取当前application的上下文的代码文件以及用于微服务对象管理的代码文件;根据单体应用拆分方案中的接口集合确定每个微服务的入口类,根据每个微服务的入口类的方法信息创建每个微服务的服务类;以及在每个微服务下创建一个服务注册类,在服务注册类中对微服务的服务类进行注册;将单体应用轨迹中每条轨迹内的调用关系均表示为一个调用链形式的结果,得到若干调用链,以及结合实体集合对各调用链中跨服务的类节点进行识别,获取每个微服务下的代理类集合;以及对每个微服务下的代理类集合的内容进行修改,使当前微服务可以与相关微服务进行通信;在每个微服务下的pom.xml文件内引入服务间通信框架的配置;以及在每个微服务下的web.xml文件中注入rest接口的配置。
具体的,根据单体应用源码、单体应用轨迹以及单体应用拆分方案拆分单体应用包括以下步骤:
步骤S301:创建微服务项目代码目录。根据拆分方案中的实体集合SC创建对应微服务代码目录,将单体应用源码中所有内容复制进去。除此之外,要将不属于当前微服务的类作为dummy类,清除dummy类中所有方法内的逻辑并注入异常,同时其中所有注解也要进行清除,防止部署时报错。
步骤S302:创建微服务工具类。创建EvaluatorLogger.java,用于记录每条轨迹信息;创建SerializationUtil.java,用于进行传输数据的序列化;创建SpringContectUtil.java,用于获取当前application的上下文;创建ClusterObjectManager.java,用于微服务对象管理。
步骤S303:创建微服务服务类。基于拆分方案中的接口集合I,确定每个微服务的入口类,根据入口的方法信息等即可创建每个微服务的服务类。在创建服务类之后,在每个微服务的根目录下创建名为JAXRSConfiguration.java的服务注册类,在其中对本微服务内的服务类进行注册。
步骤S304:创建微服务的代理类。将单体应用轨迹进行整理,每条轨迹内的调用关系均表示为一个调用链形式的结果:call_chaini={(class1.method1,class1.method2),(class1.method2,class2.method3),...}。再结合实体集合SC,对每条调用链中跨服务的类节点进行识别,最终可以获取到每个微服务下的代理类集合。之后,再对这些类的内容进行修改,使其可以与另一个相关微服务进行通信。
步骤S305:修改配置文件信息。在每个微服务下的pom.xml文件内引入服务间通信框架的配置,以支持服务间的通信。同时,还需修改web.xml,在其中注入rest接口的配置,以支持远程调用。
具体的,参见图2,示出了单体应用自动服务化之后跨服务调用的顺序。当两个微服务之间需要进行通信时,进行请求的服务需要进行服务代理才可以完成请求的过程,而被请求的服务需要定义服务类用来接受请求,故图2中使用class1代理类代表请求代理类,class2服务类代表接受请求的服务类。具体的,包括:
如class1首次调用class2中的方法,首先需要在class1代理类中进行通信代理,通过class1代理类调用class2的服务类请求创建class2对象,class2服务类接收到请求后会实例化一个class2对象,之后会将实例化后的对象加到对象管理器中,对象管理器会返回一个对象标识ID,class2服务类将这个ID返回给class1代理类,classl代理类在下次请求执行方法时只要带上这个ID,class2服务类便可直接从对象管理器中取出对应对象,然后调用相应的方法执行即可。这样便完成了一次跨服务的通信。
在一种可能的实施方式中,所述获取若干微服务的测试用例执行过程的监控日志,得到微服务轨迹包括:根据单体应用轨迹,在各微服务的代码中进行方法调用后以及有返回值的地方***调用日志,然后将各微服务部署在服务器上,使用与S1中相同的测试用例进行测试和监控日志的获取,得到微服务轨迹。
具体的,基于单体应用轨迹,在拆分后的微服务代码每次方法调用后以及有返回值的地方***调用日志,用于跟踪拆分后的服务代码运行轨迹。在服务器上部署拆分后的微服务的代码,运行代码。使用与S1中相同的测试用例进行测试。运行结束之后,取出所有测试日志,对测试日志进行整理,最终输出微服务轨迹:
MTi={m_trace_idi,m_call_seti}
其中,MTi为微服务轨迹的第i条轨迹,m_trace_idi代表微服务轨迹的第i条轨迹的编号,m_call_seti代表微服务轨迹的第i条轨迹中所有的调用关系集;m_call_seti={mc1,...,mcl,...,mck};其中,k为微服务轨迹的第i条轨迹中调用关系的个数,mcl为微服务轨迹的第i条轨迹中第l个调用关系;mcl=(method1,method2,m1para,m2para,class1,class2,m1_return,m2_return)。
在一种可能的实施方式中,所述对比单体应用轨迹以及微服务轨迹,得到轨迹相似度包括:
通过下式进行单体应用轨迹的第i条轨迹与微服务轨迹的第i条轨迹的对比:
len(a_call_seti)=len(m_call_seti)
a_call_seti.ack=m_call_seti.mck
其中,len(a_call_seti)为单体应用轨迹的第i条轨迹调用关系集长度;len(m_call_seti)为微服务轨迹的第i条轨迹调用关系集长度;a_call_seti.ack为单体应用轨迹的第i条轨迹调用关系集中的第k条调用关系;m_call_seti.mck为微服务轨迹的第i条轨迹调用关系集中的第k条调用关系。
当单体应用轨迹的第i条轨迹与微服务轨迹的第i条轨迹满足上式时,单体应用轨迹的第i条轨迹与微服务轨迹的第i条轨迹一致;否则,不一致;然后,通过下式得到轨迹相似度:轨迹相似度=单体应用轨迹与微服务轨迹中轨迹一致的数量/轨迹总数量。
具体的,考虑到后期微服务落地实现的日志***是依据前面的单体应用轨迹进行的,在拆分之后可能存在一定的误差,本实施例中,轨迹相似度的预设阈值设置为90%,轨迹相似度达到90%以上,就可以确认微服务自动服务化成功。
若未达到阈值,首先需排查是哪些轨迹未执行,再确认是否这些轨迹相关处已***日志记录。如全部检查过,那可能是由于拆分方案的部分不合理导致,可手动调整,再将调整后的拆分方案输入步骤S3,重新拆分生成新的微服务。之后,再次进行轨迹一致性验证,直到调整到满足一致性条件为止,此时得到的微服务为最优拆分结果,输出拆分后的微服务。
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面结合具体实施例详细说明本发明的具体实施方式。本实施方式中以宠物商店应用jpetstore为例对其单体应用源码进行自动服务化,具体步骤如下:
步骤S11:基于动态插桩技术,对jpetstore源码在测试用例上的执行过程进行监控,提取监控日志,对其中的数据进行清洗后可得到单体应用轨迹,单体应用轨迹按具体如表1所示:
表1单体应用轨迹表
步骤S21:基于FoSCI框架识别微服务,获取拆分方案。其中,拆分方案包含实体集合SC和接口集合I。实体集合SC具体如表2所示:
表2实体集合SC表
接口集合I具体如表3所示:
表3接口集合I表
步骤S31:基于单体应用源码、单体应用轨迹以及单体应用拆分方案,将拆分方案中的微服务方案进行落地实现。具体包括以下步骤:
步骤S301:创建微服务代码目录。微服务方案中有四个微服务,所以创建0、1、2和3四个代码目录,将源目录下所有内容分别复制到四个目录下。0号微服务内有4个实体,1号微服务中有6个实体,2号微服务中有3个实体,3号微服务中有3个实体,对不属于相应微服务的实体进行内容清除并进行异常注入。
步骤S302:创建微服务工具类。在四个代码目录下分别生成EvaluatorLogger.java、SerializationUtil.java、SpringContectUtil.java以及ClusterObjectManager.java这四个类。
步骤S303:创建微服务服务类。基于单体应用拆分方案中的接口集合I,可以分别确认0号微服务的入口类是OrderActionBean,1号微服务的入口类是CatalogActionBean,2号微服务的入口类是CartActionBean,3号微服务的入口类是AccountActionBean。对这四个类建立其对应的服务类。并在每个微服务的根目录下创建一个名为JAXRSConfiguration.java的服务注册类,在其中对相应服务类进行注册。
步骤S304:创建微服务的代理类。基于单体应用轨迹,0号微服务的代理类是OrderService,1号微服务暂无服务间调用行为,所以无代理类,2号微服务的代理类有CatalogActionBean、Cart,3号微服务的代理类有AccountActionBean。对其中有远程调用处进行处理,以支持服务间的互相调用。
步骤S305:修改配置文件信息。在每个微服务下的pom.xml文件内引入服务间通信框架的配置,以支持服务间的通信。同时,还需修改web.xml,在其中注入rest接口的配置,以支持远程调用。
步骤S41:在服务器上部署初步拆分后的微服务的代码,取得其运行日志,提取微服务轨迹。基于单体应用轨迹和落地后的微服务轨迹,对其进行轨迹一致性对比,若一致则输出拆分后的微服务,若不一致则调整拆分方案转步骤S31。
下述为本发明的装置实施例,可以用于执行本发明方法实施例。对于装置实施例中未披露的细节,请参照本发明方法实施例。
参见图3,本发明再一实施例中,提供一种单体应用微服务拆分***,能够用于实现上述的单体应用微服务拆分方法,具体的,该单体应用微服务拆分***包括单体应用轨迹获取模块、拆分方案获取模块、拆分模块、微服务轨迹获取模块以及校验模块。其中,单体应用轨迹获取模块用于获取单体应用的测试用例执行过程的监控日志,得到单体应用轨迹;拆分方案获取模块用于根据单体应用轨迹,调用FoSCI框架,得到单体应用拆分方案;拆分模块用于获取单体应用源码,根据单体应用源码、单体应用轨迹以及单体应用拆分方案拆分单体应用,得到若干微服务;微服务轨迹获取模块用于获取若干微服务的测试用例执行过程的监控日志,得到微服务轨迹;校验模块用于对比单体应用轨迹以及微服务轨迹,得到轨迹相似度,当轨迹相似度大于预设阈值时,输出拆分的微服务;否则,获取并根据人工修改后的拆分方案,更新当前拆分方案并触发拆分模块。
在一种可能的实施方式中,所述获取单体应用的测试用例执行过程的监控日志,得到单体应用轨迹包括:
基于动态插桩技术,对单体应用的测试用例执行过程进行监控以提取监控日志,对监控日志中的重复数据或噪声数据进行清洗过滤,得到单体应用轨迹数据。
将单体应用轨迹数据按照下式进行形式化表示,得到单体应用轨迹:
ATi={a_trace_idi,a_call_seti}
其中,ATi为单体应用轨迹的第i条轨迹,a_trace_idi代表单体应用轨迹的第i条轨迹的编号,a_call_seti代表单体应用轨迹的第i条轨迹中所有的调用关系集;a_call_seti={ac1,...,acl,...,ack};其中,k为单体应用轨迹的第i条轨迹中调用关系的个数;acl为单体应用轨迹的第i条轨迹中第l个调用关系;acl=(method1,method2,m1para,m2para,class1,class2,m1_return,m2-return),其中,method1表示第l个调用关系中的源方法名,method2表示第l个调用关系中的目的方法名,m1_para表示第l个调用关系中的源方法的入参类型,m2_para表示第l个调用关系中的目的方法的入参类型,class1表示为第l个调用关系中的源方法所在的类名,class2表示第l个调用关系中的目的方法所在的类名,m1_return表示第l个调用关系中的源方法的返回值类型,m2_return表示第l个调用关系中的目的方法的返回值类型。
在一种可能的实施方式中,所述根据单体应用轨迹,调用FoSCI框架,得到单体应用拆分方案包括:将单体应用轨迹根据FoSCI框架输入要求进行转化处理并输入FoSCI框架,得到单体应用拆分方案。
其中,单体应用拆分方案包含实体集合SC和接口集合I:
SC={SCt}={service_namet,entity_sett}
I={It}={service_namet,interface_sett}
其中,service_namet表示第t个微服务的名称,entity_sett表示第t个微服务下的所有实体集合,entity_sett={entity1,...,entityq},其中,q表示第t个微服务中实体的个数,entityq表示第t个微服务中实体q的名称;interface_sett表示第t个微服务下的所有接口集合,interface_sett={o1,...,on},其中,on为第n个方法,on=(oper,oper_para,oper_return),oper代表接口中第n个方法的方法名,oper_para代表第n个方法入参类型,oper_return代表第n个方法返回值类型。
在一种可能的实施方式中,所述根据单体应用源码、单体应用轨迹以及单体应用拆分方案拆分单体应用包括:
根据单体应用拆分方案中的实体集合创建若干微服务代码目录,将单体应用源码中所有内容复制至各微服务代码目录,将各微服务代码目录中不属于当前微服务的类作为dummy类,清除dummy类中所有方法内的逻辑和注解并注入异常;每个微服务分别创建微服务工具类:包括创建用于记录每条轨迹信息的代码文件、用于进行传输数据的序列化的代码文件、用于获取当前application的上下文的代码文件以及用于微服务对象管理的代码文件;根据单体应用拆分方案中的接口集合确定每个微服务的入口类,根据每个微服务的入口类的方法信息创建每个微服务的服务类;以及在每个微服务下创建一个服务注册类,在服务注册类中对微服务的服务类进行注册;将单体应用轨迹中每条轨迹内的调用关系均表示为一个调用链形式的结果,得到若干调用链,以及结合实体集合对各调用链中跨服务的类节点进行识别,获取每个微服务下的代理类集合;以及对每个微服务下的代理类集合的内容进行修改,使当前微服务可以与相关微服务进行通信;在每个微服务下的pom.xml文件内引入服务间通信框架的配置;以及在每个微服务下的web.xml文件中注入rest接口的配置。
在一种可能的实施方式中,所述获取若干微服务的测试用例执行过程的监控日志,得到微服务轨迹包括:根据单体应用轨迹,在各微服务的代码中进行方法调用后以及有返回值的地方***调用日志,然后将各微服务部署在服务器上,使用与S1中相同的测试用例进行测试和监控日志的获取,得到微服务轨迹:
MTi={m_trace_idi,m_call_seti}
其中,MTi为微服务轨迹的第i条轨迹,m_trace_idi代表微服务轨迹的第i条轨迹的编号,m_call_seti代表微服务轨迹的第i条轨迹中所有的调用关系集;m_call_seti={mc1,...,mcl,...,mck};其中,k为微服务轨迹的第i条轨迹中调用关系的个数,mcl为微服务轨迹的第i条轨迹中第l个调用关系;mcl=(method1,method2,m1para,m2para,class1,class2,m1_return,m2_return)。
在一种可能的实施方式中,所述对比单体应用轨迹以及微服务轨迹,得到轨迹相似度包括:
通过下式进行单体应用轨迹的第i条轨迹与微服务轨迹的第i条轨迹的对比:
len(a_call_seti)=len(m_call_seti)
a_call_seti.ack=m_call_seti.mck
其中,len(a_call_seti)为单体应用轨迹的第i条轨迹调用关系集长度;len(m_call_seti)为微服务轨迹的第i条轨迹调用关系集长度;a_call_seti.ack为单体应用轨迹的第i条轨迹调用关系集中的第k条调用关系;m_call_seti.mck为微服务轨迹的第i条轨迹调用关系集中的第k条调用关系。
当单体应用轨迹的第i条轨迹与微服务轨迹的第i条轨迹满足上式时,单体应用轨迹的第i条轨迹与微服务轨迹的第i条轨迹一致;否则,不一致;然后,通过下式得到轨迹相似度:轨迹相似度=单体应用轨迹与微服务轨迹中轨迹一致的数量/轨迹总数量。
在一种可能的实施方式中,所述预设阈值为90%。
前述的单体应用微服务拆分方法的实施例涉及的各步骤的所有相关内容均可以援引到本发明施例中的单体应用微服务拆分***所对应的功能模块的功能描述,在此不再赘述。
本发明实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,另外,在本发明各个实施例中的各功能模块可以集成在一个处理器中,也可以是单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
本发明再一个实施例中,提供了一种计算机设备,该计算机设备包括处理器以及存储器,所述存储器用于存储计算机程序,所述计算机程序包括程序指令,所述处理器用于执行所述计算机存储介质存储的程序指令。处理器可能是中央处理单元(CentralProcessing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital SignalProcessor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable GateArray,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其是终端的计算核心以及控制核心,其适于实现一条或一条以上指令,具体适于加载并执行计算机存储介质内一条或一条以上指令从而实现相应方法流程或相应功能;本发明实施例所述的处理器可以用于单体应用微服务拆分方法的操作。
本发明再一个实施例中,本发明还提供了一种存储介质,具体为计算机可读存储介质(Memory),所述计算机可读存储介质是计算机设备中的记忆设备,用于存放程序和数据。可以理解的是,此处的计算机可读存储介质既可以包括计算机设备中的内置存储介质,当然也可以包括计算机设备所支持的扩展存储介质。计算机可读存储介质提供存储空间,该存储空间存储了终端的操作***。并且,在该存储空间中还存放了适于被处理器加载并执行的一条或一条以上的指令,这些指令可以是一个或一个以上的计算机程序(包括程序代码)。需要说明的是,此处的计算机可读存储介质可以是高速RAM存储器,也可以是非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。可由处理器加载并执行计算机可读存储介质中存放的一条或一条以上指令,以实现上述实施例中有关单体应用微服务拆分方法的相应步骤。
本领域内的技术人员应明白,本发明的实施例可提供为方法、***、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求保护范围之内。
Claims (10)
1.一种单体应用微服务拆分方法,其特征在于,包括:
S1:获取单体应用的测试用例执行过程的监控日志,得到单体应用轨迹;
S2:根据单体应用轨迹,调用FoSCI框架,得到单体应用拆分方案;
S3:获取单体应用源码,根据单体应用源码、单体应用轨迹以及单体应用拆分方案拆分单体应用,得到若干微服务;
S4:获取若干微服务的测试用例执行过程的监控日志,得到微服务轨迹;
S5:对比单体应用轨迹以及微服务轨迹,得到轨迹相似度,当轨迹相似度大于预设阈值时,输出拆分的微服务;否则,获取并根据人工修改后的拆分方案,更新当前拆分方案并返回S3。
2.根据权利要求1所述的单体应用微服务拆分方法,其特征在于,所述获取单体应用的测试用例执行过程的监控日志,得到单体应用轨迹包括:
基于动态插桩技术,对单体应用的测试用例执行过程进行监控以提取监控日志,对监控日志中的重复数据或噪声数据进行清洗过滤,得到单体应用轨迹数据;
将单体应用轨迹数据按照下式进行形式化表示,得到单体应用轨迹:
ATi={a_trace_idi,a_call_seti}
其中,ATi为单体应用轨迹的第i条轨迹,a_trace_idi代表单体应用轨迹的第i条轨迹的编号,a_call_seti代表单体应用轨迹的第i条轨迹中所有的调用关系集;a_call_seti={ac1,...,acl,...,ack};其中,k为单体应用轨迹的第i条轨迹中调用关系的个数;acl为单体应用轨迹的第i条轨迹中第l个调用关系;acl=(method1,method2,m1para,m2para,class1,class2,m1_return,m2_return),其中,method1表示第l个调用关系中的源方法名,method2表示第l个调用关系中的目的方法名,m1_para表示第l个调用关系中的源方法的入参类型,m2_para表示第l个调用关系中的目的方法的入参类型,class1表示为第l个调用关系中的源方法所在的类名,class2表示第l个调用关系中的目的方法所在的类名,m1_return表示第l个调用关系中的源方法的返回值类型,m2_return表示第l个调用关系中的目的方法的返回值类型。
3.根据权利要求2所述的单体应用微服务拆分方法,其特征在于,所述根据单体应用轨迹,调用FoSCI框架,得到单体应用拆分方案包括:
将单体应用轨迹根据FoSCI框架输入要求进行转化处理并输入FoSCI框架,得到单体应用拆分方案;
其中,单体应用拆分方案包含实体集合SC和接口集合I:
SC={SCt}={service_namet,entity_sett}
I={It}={service_namet,interface_sett}
其中,service_namet表示第t个微服务的名称,entity_sett表示第t个微服务下的所有实体集合,entity_sett={entity1,...,entityq},其中,q表示第t个微服务中实体的个数,entityq表示第t个微服务中实体q的名称;interface_sett表示第t个微服务下的所有接口集合,interface_sett={o1,...,on},其中,on为第n个方法,on=(oper,oper_para,oper_return),oper代表接口中第n个方法的方法名,oper_para代表第n个方法入参类型,oper_return代表第n个方法返回值类型。
4.根据权利要求3所述的单体应用微服务拆分方法,其特征在于,所述根据单体应用源码、单体应用轨迹以及单体应用拆分方案拆分单体应用包括:
根据单体应用拆分方案中的实体集合创建若干微服务代码目录,将单体应用源码中所有内容复制至各微服务代码目录,将各微服务代码目录中不属于当前微服务的类作为dummy类,清除dummy类中所有方法内的逻辑和注解并注入异常;
每个微服务分别创建微服务工具类:包括创建用于记录每条轨迹信息的代码文件、用于进行传输数据的序列化的代码文件、用于获取当前application的上下文的代码文件以及用于微服务对象管理的代码文件;
根据单体应用拆分方案中的接口集合确定每个微服务的入口类,根据每个微服务的入口类的方法信息创建每个微服务的服务类;以及在每个微服务下创建一个服务注册类,在服务注册类中对微服务的服务类进行注册;
将单体应用轨迹中每条轨迹内的调用关系均表示为一个调用链形式的结果,得到若干调用链,以及结合实体集合对各调用链中跨服务的类节点进行识别,获取每个微服务下的代理类集合;以及对每个微服务下的代理类集合的内容进行修改,使当前微服务可以与相关微服务进行通信;
在每个微服务下的pom.xml文件内引入服务间通信框架的配置;以及在每个微服务下的web.xml文件中注入rest接口的配置。
5.根据权利要求4所述的单体应用微服务拆分方法,其特征在于,所述获取若干微服务的测试用例执行过程的监控日志,得到微服务轨迹包括:
根据单体应用轨迹,在各微服务的代码中进行方法调用后以及有返回值的地方***调用日志,然后将各微服务部署在服务器上,使用与S1中相同的测试用例进行测试和监控日志的获取,得到微服务轨迹:
MTi={m_trace_idi,m_call_seti}
其中,MTi为微服务轨迹的第i条轨迹,m_trace_idi代表微服务轨迹的第i条轨迹的编号,m_call_seti代表微服务轨迹的第i条轨迹中所有的调用关系集;m_call_seti={mc1,...,mcl,...,mck};其中,k为微服务轨迹的第i条轨迹中调用关系的个数,mcl为微服务轨迹的第i条轨迹中第l个调用关系;mcl=(method1,method2,m1para,m2para,class1,class2,m1_return,m2_return)。
6.根据权利要求5所述的单体应用微服务拆分方法,其特征在于,所述对比单体应用轨迹以及微服务轨迹,得到轨迹相似度包括:
通过下式进行单体应用轨迹的第i条轨迹与微服务轨迹的第i条轨迹的对比:
len(a_call_seti)=len(m_call_seti)
a_call_seti.ack=m_call_seti.mck
其中,len(a_call_seti)为单体应用轨迹的第i条轨迹调用关系集长度;len(m_call_seti)为微服务轨迹的第i条轨迹调用关系集长度;a_call_seti.ack为单体应用轨迹的第i条轨迹调用关系集中的第k条调用关系;m_call_seti.mck为微服务轨迹的第i条轨迹调用关系集中的第k条调用关系;
当单体应用轨迹的第i条轨迹与微服务轨迹的第i条轨迹满足上式时,单体应用轨迹的第i条轨迹与微服务轨迹的第i条轨迹一致;否则,不一致;
通过下式得到轨迹相似度:轨迹相似度=单体应用轨迹与微服务轨迹中轨迹一致的数量/轨迹总数量。
7.根据权利要求1所述的单体应用微服务拆分方法,其特征在于,所述预设阈值为90%。
8.一种单体应用微服务拆分***,其特征在于,包括:
单体应用轨迹获取模块,用于获取单体应用的测试用例执行过程的监控日志,得到单体应用轨迹;
拆分方案获取模块,用于根据单体应用轨迹,调用FoSCI框架,得到单体应用拆分方案;
拆分模块,用于获取单体应用源码,根据单体应用源码、单体应用轨迹以及单体应用拆分方案拆分单体应用,得到若干微服务;
微服务轨迹获取模块,用于获取若干微服务的测试用例执行过程的监控日志,得到微服务轨迹;
校验模块,用于对比单体应用轨迹以及微服务轨迹,得到轨迹相似度,当轨迹相似度大于预设阈值时,输出拆分的微服务;否则,获取并根据人工修改后的拆分方案,更新当前拆分方案并触发拆分模块。
9.一种计算机设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至7任一项所述单体应用微服务拆分方法的步骤。
10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述单体应用微服务拆分方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210843226.2A CN115185495A (zh) | 2022-07-18 | 2022-07-18 | 单体应用微服务拆分方法、***、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210843226.2A CN115185495A (zh) | 2022-07-18 | 2022-07-18 | 单体应用微服务拆分方法、***、设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115185495A true CN115185495A (zh) | 2022-10-14 |
Family
ID=83519934
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210843226.2A Pending CN115185495A (zh) | 2022-07-18 | 2022-07-18 | 单体应用微服务拆分方法、***、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115185495A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116775171A (zh) * | 2023-08-25 | 2023-09-19 | 太平金融科技服务(上海)有限公司深圳分公司 | 一种架构切换方法、装置、电子设备及存储介质 |
-
2022
- 2022-07-18 CN CN202210843226.2A patent/CN115185495A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116775171A (zh) * | 2023-08-25 | 2023-09-19 | 太平金融科技服务(上海)有限公司深圳分公司 | 一种架构切换方法、装置、电子设备及存储介质 |
CN116775171B (zh) * | 2023-08-25 | 2023-12-05 | 太平金融科技服务(上海)有限公司深圳分公司 | 一种架构切换方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7681182B1 (en) | Including function call graphs (FCG) generated from trace analysis data within a searchable problem determination knowledge base | |
US10061578B2 (en) | System and method of configuring a data store for tracking and auditing real-time events across different software development tools in agile development environments | |
EP2228726B1 (en) | A method and system for task modeling of mobile phone applications | |
CN107220142B (zh) | 执行数据恢复操作的方法及装置 | |
CN108280023B (zh) | 任务执行方法、装置和服务器 | |
CN103995715B (zh) | 应用程序的修复方法、装置及服务器 | |
CN110659018B (zh) | 一种流程引擎实现方法及装置 | |
US11385898B2 (en) | Task orchestration method for data processing, orchestrator, device and readable storage medium | |
CN111290958B (zh) | 一种调试智能合约的方法及装置 | |
CN111522728A (zh) | 自动化测试用例的生成方法、电子设备及可读存储介质 | |
CN103176892A (zh) | 一种页面监控方法及*** | |
CN115185495A (zh) | 单体应用微服务拆分方法、***、设备及存储介质 | |
CN112541746A (zh) | 一种全栈自动化编排方法及*** | |
CN116560626A (zh) | 基于自定义规则的数据处理方法、***、设备和存储介质 | |
CN113742228B (zh) | 测试、数据回放及录制方法、***、装置、设备及介质 | |
CN114092246A (zh) | 金融交易链路的问题定位方法及装置 | |
CN116049115B (zh) | 一种软件日志处理方法 | |
CN116467188A (zh) | 一种多环境场景下的通用本地复现***和方法 | |
CN113220592B (zh) | 自动化测试资源的处理方法、装置、服务器及存储介质 | |
CN115185825A (zh) | 接口测试的调度方法及装置 | |
US8631391B2 (en) | Method and a system for process discovery | |
CN109857390B (zh) | 一种Git仓库文件注解***的注解传递方法 | |
Salva et al. | Autofunk, a fast and scalable framework for building formal models from production systems | |
CN117472641B (zh) | 数据质量的检测方法、装置、电子设备及存储介质 | |
CN111931184B (zh) | 反序列化漏洞检测方法及装置 |
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 |