微服务的拆分方法、装置、设备及存储介质
技术领域
本发明涉及计算机应用技术领域,尤其涉及微服务的拆分方法、装置、设备及存储介质。
背景技术
随着计算机应用技术的发展,为更好发挥资源的利用率及实现应用的快速部署,可将单体应用拆分为多个微服务。利用微服务提供对外的服务,各个微服务之间支持相互关联和访问,以实现整体应用的功能服务。
现有微服务拆分方案中,单体应用微服务化通常是采用手动完成的,或者基于指令拆分完成的。以指令拆分为例,计算设备接收目标微服务的拆分指令,响应该拆分指令从单体应用的代码集合中拆分该拆分指令对应的目标代码,从而构成该目标微服务。在实践中发现,该拆分指令为研发人员对单体应用进行人工分析后而设计出的。因此,无论手动拆分还是指令拆分都需要人工参与,导致用户操作不便捷、人工成本较高、且微服务拆分的效率不高。
发明内容
本发明实施例公开了一种微服务的拆分方法、装置、设备及系统,能解决现有微服务拆分方案中存在的操作不便捷、人工成本较高及拆分效率不高等问题。
第一方面,本发明实施例提供一种微服务的拆分方法,该方法包括:计算设备基于应用的SQL语句生成该SQL语句查询的多个表之间的关联关系图,进而对该关联关系图进行拆分,得到多个内部关联度更强的关系子图。针对每个关系子图来说,从应用的程序代码中查询该关系子图对应的目标函数及目标函数相关的关联函数,并将该关系子图对应的目标函数及目标函数相关的关联函数作为一个微服务。
通过实施本发明实施例,能够解决现有微服务拆分方案中存在的操作不便捷、人工成本较高及拆分效率不高等问题,能快速实现应用的微服务拆分、缩短拆分时间、提升拆分效率。
结合第一方面,在一些可能的实施例中,计算设备对应用的SQL语句进行语法分析,得到该SQL语句对应的语法树结构。该语法树结构包括至少一个树节点及树节点之间的连接权重,每个树节点用于表征SQL语句查询的表,该树节点之间的连接权重为树节点对应SQL语句被执行的频次。进一步计算设备可对语法树结构中的至少一个树节点及树节点之间的连接权重进行图形构造,得到SQL语句查询的多个表之间的关联关系图。
通过实施本步骤,计算设备可分析应用中每个SQL语句对应的语法树结构,进而基于这些语法树结构构建出一个关联关系图,有利于提升关系图构建的高效性及完整性。
结合第一方面,在一些可能的实施例中,计算设备可对应用的程序代码进行分析,生成函数调用有向图,该函数调用有向图中记录有应用的至少一个代码函数及代码函数之间的调用关系。进一步计算设备可根据关系子图对应的目标函数,从函数调用有向图中查找与该目标函数存在调用关系的代码函数,并确定为该目标函数相关的关联函数。
通过实施本步骤,计算设备基于函数调用有向图能快速、便捷地实现关联函数的查找,有利于提升函数查找的便捷性及效率。
结合第一方面,在一些可能的实施例中,关联关系图中包括至少一个树节点及树节点之间的连接权重。计算设备可按照高内聚低耦合原则,对关联关系图进行拆分,得到多个内部关联度更强的关系子图。其中,该关系子图的内部关联度为关系子图中树节点之间的连接权重之和。
通过实施本步骤,计算设备采用高内聚低耦合原则实现关联关系图的拆分,从而获得关联度更高的关系子图,有利于提升子图拆分的效率及精度。
结合第一方面,在一些可能的实施例中,计算设备按照预设约束条件对关联关系图进行拆分,得到多个内部关联度更强的关系子图。其中,该预设约束条件包括以下中的至少一项:关系子图中树节点的总数量大于或等于第一阈值、关联关系图中孤立节点支持任意拆分到多个关系子图中的任一个、或关联关系图中孤立节点支持独立拆分到一个关系子图。
通过实施本步骤,计算设备能再结合预设约束条件实现关联关系图的拆分,有利于高效、快速实现关系图的拆分。
结合第一方面,在一些可能的实施例中,计算设备可获取第一树节点的第一邻居节点及第一邻居节点的第二邻居节点,其中该第一树节点为关联关系图中未被拆分的树节点,且第一树节点相关的连接权重之和大于第二树节点相关的连接权重之和,第二树节点为关联关系图中除第一树节点外的任一未被拆分的树节点;或者,第一树节点为第一树节点所在的关系子图对应栈中的任一树节点。进一步计算设备根据第一邻居节点的连接权重和第二邻居节点的连接权重,计算第一邻居节点的收益,进而根据该第一邻居节点的收益确定是否将第一邻居节点拆分到第一树节点所在的关系子图中。
通过实施本步骤,计算设备能通过邻居节点的方式,遍历关联关系图中所有的树节点,以实现关联关系图的拆分,从而有利于提升关系图拆分的便捷性及完整性。
结合第一方面,在一些可能的实施例中,若第一邻居节点的收益大于或等于第二阈值,则计算设备确定将第一邻居节点拆分到第一树节点所在的关系子图中。反之,若第一邻居节点的收益小于第二阈值,则计算设备确定第一邻居节点不在第一树节点所在的关系子图中,不将第一邻居节点拆分到第一树节点所在的关系子图中。
通过实施本步骤,计算设备能准确、快速地实现关联关系图中的节点拆分,有利于提升关系子图拆分的准确性及便捷性。
第二方面,本发明实施例提供一种微服务的拆分装置,该装置包括用于执行如上第一方面或第一方面的任意可能的实施方式中所描述的方法的功能器件,例如模块或单元等。
第三方面,本发明实施例提供一种计算设备,该设备包括:处理器,存储器,通信接口和总线;处理器、通信接口、存储器通过总线相互通信;通信接口,用于接收和发送数据;存储器,用于存储计算机指令;处理器,用于执行存储器中存储的计算机指令,使得计算设备执行上述第一方面或第一方面的任意可能的实施例中所描述的微服务的拆分方法。
第四方面,本发明实施例提供一种计算机可读存储介质,所述计算机可读存储介质存储计算机指令。所述计算机指令用于指示计算设备执行上述第一方面或第一方面的任意可能的实施例中所描述的微服务的拆分方法。
第五方面,提供了一种芯片产品,以执行上述第一方面或第一方面的任意可能的实施例中所描述的微服务的拆分方法。
本发明在上述各方面提供的实现方式的基础上,还可以进行进一步组合以提供更多实现方式。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍。
图1是本发明实施例提供的一种微服务的拆分方法的流程示意图。
图2是本发明实施例提供的一种语法树结构的示意图。
图3是本发明实施例提供的一种关联关系图生成的场景示意图。
图4是本发明实施例提供的一种关系子图划分的示意图。
图5是本发明实施例提供的另一种微服务的拆分方法的流程示意图。
图6是本发明实施例提供的一种函数调用有向图的示意图。
图7是本发明实施例提供的一种微服务的函数示意图。
图8是本发明实施例提供的一种微服务拆分的场景示意图。
图9是本发明实施例提供的一种微服务的拆分装置的结构示意图。
图10是本发明实施例提供的一种计算设备的结构示意图。
具体实施方式
下面将结合本发明的附图,对本发明实施例中的技术方案进行详细描述。
为解决现有微服务拆分方案中存在的操作不便捷、人工成本较高、拆分效率不高等问题,本发明提出一种微服务的拆分方法、相关装置及设备。请参见图1,是本发明实施例提供的一种微服务的拆分方法的流程示意图。如图1所示的方法,包括如下实施步骤:
S102、计算设备对应用的SQL语句进行语法分析,生成SQL语句查询的多个表之间的关联关系图。
本发明涉及的应用,也可称为应用程序,其可包括不限于单体应用,本发明下文以单体应用为例进行相关内容的阐述。单体应用是指一个文件包中包括了应用的所有功能,其由一系列代码函数组成,例如主函数main()、功能函数function()等。其中,这些代码函数中的部分代码函数包括有一系列结构化查询语句(structured query language,SQL)。该SQL语句是一种数据库查询和程序设计语言,用于存取数据、查询数据、更新数据和管理数据库。换句话说,SQL语句是对数据库进行操作的一种语言,该数据库中包括有一系列数据表,简称为表;每个表中记录有单体应用的业务数据。
以单体应用为微信应用为例,单体应用的业务数据可分为多个表存储,例如在单体应用中与不同用户的聊天信息可记录在不同的数据表中,以供用户查询。又如以单体应用为淘宝应用为例,在淘宝应用中将各个店铺的简介信息记录至表A中,将每家店铺各自的出售商品信息记录在相应地表B中。若某用户想在淘宝应用中查询店铺1的出售商品信息,则需通过表A在淘宝应用中查询到店铺1,再关联查询店铺1的表B,以从表B中查询到该店铺1的出售商品信息等。
在一个示例中,计算设备可对单体应用的SQL语句进行语法分析,得到该SQL语句对应的语法树结构。在实际应用中,单体应用中SQL语句的数量并不做限定,其可为一个或多个。当单体应用中SQL语句的数量为多个时,计算设备可对每个SQL语句进行语法分析,得到多个语法树结构。
对于任一语法树结构而言,该语法树结构包括一个或多个树节点、树节点之间的连接关系及连接权重。其中,每个树节点用于表征SQL语句所查询的表。树节点之间的连接关系,指树节点与树节点之间的连接关系用于表征树节点对应的表之间存在关联查询关系,例如树节点1和树节点2分别表征表1和表2,且它们之间存在连接关系。表示计算设备可通过对表1和表2进行关联查询,以从表1和表2中查询获得相应表中记录的业务数据。树节点之间的连接权重具体可为树节点对应的SQL语句被执行的频率,如某个SQL语句被计算设备执行了13次,则该SQL语句对应所指示的树节点之间的连接权重即为13。
具体实现中,计算设备在分析SQL语句时,该SQL语句中定义有针对单体应用中各表的操作,例如表之间的关联查询等。计算设备将以SQL语句查询的表为顶点,如果表与表之间存在关联查询,则在表与表之间构造一条边,该边的权重为SQL语句被执行的频率。
在实际应用中,计算设备每次在调用单体应用中SQL语句执行时,会直接记录该SQL语句被执行的频率。每执行一次该SQL语句,则该SQL语句被执行的频率递增加一。或者,计算设备也可在日志中记录该SQL语句的执行,相应地计算设备可依据日志中出现的该SQL语句的次数,统计该SQL语句被执行的频率。每个SQL语句所查询的表可以相同,也可不相同,具体根据实际需求确定,本发明不做限定。
举例来说,以SQL语句中的select语句为例,计算设备可对单体应用中每条SQL语句进行分析,过滤得到SQL语句中的select语句。进而使用语法解析工具包对select语句进行语法分析,得到相应地语法树结构。如,seclect语句为:seclect Ajoin B,则该select语句对应的语法树结构为A-B,表示表A与表B存在关联查询。该语法解析工具包为系统自定义设置的,不同厂商提供的语法解析工具包可以不相同,本发明不做限定。
在实际应用中,SQL语句或select语句更为复杂,其对应的语法树结构也更为复杂。例如图2示出一种可能的语法树结构的示意图。如图2,该语法树结构中包括5个树节点,分别为树节点1至树节点5。每个树节点表示一个表,图示分别可表示表1至表5。如图所示该语法树结构对应的SQL语句表明:树节点1与树节点2和树节点3存在连接关系,即表1分别与表2和表3存在关联查询。树节点2分别与树节点1、树节点4及树节点5存在连接关系,即表2支持与表1、表4及表5存在关联查询关系。
计算设备获得每个SQL语句对应的语法树结构后,可对每个语法树结构中的树节点及树节点之间的连接权重进行图形构造,从而形成一个SQL语句查询多个表之间的关联关系图。具体地,计算设备对每个语法树结构中的树节点进行关联分析,若任意两个语法树结构中存在相同的树节点,则对相同的树节点进行合并。若任意两个语法树结构中的树节点存在关联查询,则新建存在关联查询的树节点之间的连接关系。若任意两个语法树结构中包含存在关联查询关系的相同树节点,即每个语法树结构中树节点之间已建立有边及该边的权重,则可将该树节点之间的连接权重进行累加,并将累加后该边的权重作为对应树节点之间的连接权重。以此原理,计算设备可将每个SQL语句对应的语法树结构组合重构为一个关联关系图。
举例来说,请参见图3示出一种关联关系图生成的场景示意图。如图3,以单体应用包括n条SQL语句为例,计算设备可对n条SQL语句进行语法分析,得到n个语法树结构。每个语法树结构中树节点的数量并不做限定,具体可实际需求确定,它们相同,也可不相同。图示以每个语法树结构包括5个树节点为例,但并不构成限定。每个树节点表征一个表。n个语法树结构中任意两个语法树结构支持包含相同的树节点。进一步,计算设备对n个语法树结构中每个树节点所表征的表进行关联分析,若任意两个语法树结构中的树节点存在关联查询关系,则建立树节点之间的连接关系。若任意两个语法树结构中存在相同的树节点,则对相同的树节点进行合并,以此原理,可将n个语法树结构中的树节点进行图形重构,得到一个SQL语句查询多个表之间的关联关系图。具体如图3所示,图示中的圆圈表示一个树节点,圆圈之间连线上的数值表示树节点之间的连接权重,例如n1表示树节点1和树节点2之间的连接权重、n2表示树节点1与树节点4之间的连接权重等等。
在实际应用中,单体应用在计算设备中的实际部署形态并不做限定,例如其可以日志、配置文件等形式存在。以单体应用采用mybatis配置文件部署为例,计算设备从mybatis配置文件中采集单体应用包含的SQL语句,进而调用编程接口(例如antlr4接口)对SQL语句进行语法分析,生成该SQL语句对应的语法树结构。可选地,计算设备还可调用编程接口对语法树结构进行解析,以对语法树结构中的树节点及树节点之间的连接权重进行图形构建,得到关联关系图。
本发明涉及的计算设备可指具备计算能力的设备,其可包括但不限于计算机、服务器、终端设备或其他具备计算能力的设备。该终端设备包括但不限于手机、平板电脑(table personal computer)、个人数字助理(personal digital assistant,PDA)、移动上网装置(mobile internet device,MID)、可穿戴式设备(wearable device)、车载设备以及其他支持和网络通信的设备。
S104、计算设备对关联关系图进行拆分,得到多个内部关联度更强的关系子图。
在一个示例中,计算设备基于高内聚低耦合原则对关联关系图进行拆分,得到多个内部关联度更强的关系子图。该关系子图中包括至少一个树节点及树节点之间的连接关系。每个关系子图用于表征单体应用的一个微服务的数据库,该数据库中包括有该关系子图中每个树节点所表征的表。
具体实现中,计算设备基于高内聚低耦合原则,采用预设的图形分割算法对关联关系图进行拆分,得到多个内部关联度更强的关系子图。其中,该图形分割算法为系统自定义设置的,用于划分关联关系图,以从关联关系图中查找内部关联度更强的树节点以组合形成相应地关系子图。该图形分割算法包括但不限于贪婪算法、聚类算法、卷积神经网络算法、模糊分析算法或其他适用于图形分割的算法,本发明并不做限定。
高内聚低耦合原则是指要求每个关系子图中的内部关联度较大、并且关系子图之间的关联度相对较小。其中,每个关系子图的内部关联度是指该关系子图中包括的所有树节点之间的连接权重之和。关系子图之间的关联度是指用于连接任意两个关系子图的树节点之间的连接权重。在实际应用中,该原则可具体设计在图形分割算法中,以图形分割算法为贪婪算法为例,在图形拆分时,计算设备将2个树节点拆分至同一关系子图,具体依据的高耦合低内聚原则为:两个树节点位于同一关系子图的内部关联度大于两个树节点位于两个关系子图之间的关联度,也可称为内聚收益大于耦合损失。
举例来说,请参见图4示出一种可能的关系子图划分的示意图。如图4所示,计算设备基于高内聚低耦合原则将关联关系图划分为4个关系子图,如图分别为:子图41至图44。保证每个关系子图的内部关联度最大,关系子图之间的关联度最小。具体在如图4中是指:关系子图41至关系子图44各自的内部关联度最大,关系子图41至关系子图44中任意两个关系子图之间的关联度最大,其中,关系子图1的内部关联度L1为n1、n2和n3之和,具体可表示为n1+n2+n3。关系子图2的内部关联度L2为n6、n7和n8之和,具体可表示为n6+n7+n8。关系子图3的内部关联L3度为n9、n10、n11和n12之和,可表示为n9+n10+n11+n12。关系子图4的内部关联度L4为n14、n15、n16和n17之和,可表示为n14+n15+n16+n17。该关系子图1和关系子图2之间的关联度为n5,关系子图1与关系子图3之间的关联度为n4,关系子图3与关系子图4之间的关联度为n13。换句话说,计算设备在对关联关系图进行拆分时,不同子图拆分方式中,本例上述拆分方式所获得的上述4个关系子图,能满足高内聚低耦合原则,即保证L1至L4较大,n5、n4及n13相对较小。
再一个示例中,计算设备可按照预设约束条件,对关联关系图进行拆分,得到至少一个关系子图。该预设约束条件为系统自定义设置的,用于约束或限定关联关系图的分割。例如其可包括但不限于以下中的任一项或多项的组合:每个关系子图中包括的树节点的总数量大于或等于第一阈值、每个关系子图中包括的树节点所表征的表具备同一属性特征,例如表中记载有同一类型的业务数据等,关联关系图中的孤立节点支持任意分图,即计算设备可将关联关系图中的孤立节点分割到任意关系子图、或者关联关系图中的孤立节点支持单独分图,即计算设备将关联关系图中的孤立节点分割为独立的一个关系子图等。在实际应用中,该第一阈值为系统自定义设置的,例如5等等。
再一具体示例中,以预设图形算法为贪婪算法为例,下面详述基于贪婪算法如何拆分关联关系图。具体请参见图5所示的另一微服务的拆分方法,具体包括如下实施步骤:
S502、获取第一树节点的第一邻居节点及第一邻居节点的第二邻居节点。
在拆分关系子图时,计算设备可从关联关系图中获取第一树节点,该第一树节点为关联关系图中未被拆分的树节点,且该第一树节点相关的连接权重之和最大,具体可指该第一树节点相关的连接权重之和大于第二树节点相关的连接权重之和,该第二树节点指关联关系图中除第一树节点外任一未被拆分的树节点。
计算设备获得第一树节点后,还可获取第一树节点的第一邻居节点及第一邻居节点的第二邻居节点。在实际应用中,该第一邻居节点及第二邻居节点的数量并不做限定,其可为一个或多个,并不构成限定。具体地,针对每个第一树节点的第一邻居节点而言,计算设备可获取该第一邻居节点的所有邻居节点,为方便描述均称为第一邻居节点的第二邻居节点。该邻居节点是指与节点存在连接关系的树节点,称为该节点的邻居节点;具体地,第一树节点的第一邻居节点是指与第一树节点存在连接关系的树节点,第一邻居节点的第二邻居节点是指与第一邻居节点存在连接关系的树节点。
举例来说,参见图4所示例子,计算设备遍历关联关系图中每个树节点,计算获得每个树节点相关的连接权重之和。以树节点4为例,该树节点4相关的连接权重之和在图4中具体为n2、n3、n4和n5之和(即可表示为n2+n3+n4+n5),配置该树节点4所在的关系子图的标识,以区分或表示树节点4所在的关系子图,例如可配置该关系子图的标识为gno。进一步计算设备可从关联关系图中获取第一树节点的第一邻居节点,分别有树节点1、树节点3、树节点5及树节点9。然后获取每个第一邻居节点的所有第二邻居节点,具体地树节点1的第二邻居节点有树节点2,树节点3没有邻居节点,树节点5的第二邻居节点有树节点6和树节点7,树节点9的第二邻居节点有树节点12和树节点13。
S504、根据第一邻居节点的连接权重和第二邻居节点的连接权重,计算第一邻居节点的收益。并根据第一邻居节点的收益,确定是否将第一邻居节点拆分到第一树节点所在的关系子图。
在一具体实施例中,计算设备利用第一邻居节点的连接权重,具体可指第一树节点与第一邻居节点之间的连接权重(简称为第一连接权重)、第二邻居节点的连接权重,具体可指第一邻居节点与每个第二邻居节点之间的连接权重(简称为第二连接权重)对第一邻居节点进行收益评估,计算得到第一邻居节点的收益,进而依据该第一邻居节点的收益确定是否将第一邻居节点拆分到第一树节点所在的关系子图中。
具体实现中,计算设备识别第二邻居节点是否位于与第一树节点所在的关系子图中,若位于,则计算设备将计算第一连接权重和第二连接权重之和,计算所得的和为第一邻居节点的收益;反之,若第二邻居节点不位于第一树节点所在的关系子图中,则计算设备计算第一连接权重与第二连接权重之差,计算所得的差为第一邻居节点的收益。进一步,计算设备将判断该第一邻居节点的收益是否大于或等于第二阈值,若该第一邻居节点的收益大于或等于第二阈值,则确定第一邻居节点和第一树节点位于同一关系子图中,将该第一邻居节点拆分到第一树节点所在的关系子图。若该第一邻居节点的收益小于第二阈值,则确定第一邻居节点与第一树节点不在同一关系子图中,不将第一邻居节点拆分到第一树节点所在的关系子图。其中,该第二阈值为系统自定义设置的,例如0等。
举例来说,引用上述S502的例子,以第一树节点的第一邻居节点(即树节点4的邻居节点)为树节点1为例,第一邻居节点的第二邻居节点具体为树节点2。在首次拆分关联关系图时,计算设备并未对树节点2拆分,则该树节点2当前仍未位于第一树节点所在的关系子图中。此时,计算设备将计算第一连接权重n2与第二连接权重n1之间的差值,即(n2-n1),以作为树节点1的收益。该第一连接权重n2为树节点4与树节点1之间的连接权重。第二连接权重n1为树节点1与树节点2之间的连接权重。假设本例中该树节点1的收益大于第二阈值(如0),则计算设备将树节点1拆分至第一树节点(树节点4)所在的关系子图中,即树节点1和树节点4位于同一关系子图中。
以第一树节点的第一邻居节点为树节点5为例,该树节点5的第二邻居节点有树节点6及树节点7。同理在首次拆分关联关系图时,树节点6及树节点7均未位于第一树节点所在的关系子图中。计算设备计算第一树节点与第一邻居节点(即树节点4与树节点5)之间的第一连接权重n5、第一邻居节点与第二邻居节点之间的第二连接权重,即计算树节点5与树节点6之间的连接权重n6和树节点5与树节点7之间的连接权重n7之间的差值,即(n5-n6-n7),计算所得的差值为第一邻居节点(树节点5)的收益。本例中,假设该树节点5的收益小于第二阈值0,则计算设备不将树节点5拆分到树节点4所在的关系子图中,即树节点4和树节点5不在同一关系子图中。
S506、若确定将第一邻居节点拆分到第一树节点所在的关系子图,则将第一邻居节点添加到栈中,等待栈中的第一邻居节点作为第一树节点被处理,重复执行如上步骤S502的步骤。
S508、若确定不将第一邻居节点拆分到第一树节点所在的关系子图,则在栈不为空时,从栈中获取第一树节点,重复执行如上S502的步骤。在栈为空时,即无法从栈中获取第一树节点,则从关联关系图中获取第一树节点,重复执行如上S502的步骤,直至遍历完关联关系图中的所有树节点,以实现关联关系图的拆分。
计算设备以此原理可对第一树节点的每个第一邻居节点进行识别判定,判定每个第一邻居节点是否与第一树节点位于同一关系子图中。若该第一邻居节点位于第一树节点所在的关系子图(即第一邻居节点与第一树节点位于同一关系子图),则计算设备可将该第一邻居节点添加到该同一关系子图对应的栈中,以等待处理。具体地,计算设备在完成第一树节点的所有第一邻居节点的判定后,可识别该栈是否为空。若不为空,表示栈中存储有第一树节点的一个或多个第一邻居节点。进一步可将栈中的每个第一邻居节点作为第一树节点,重复执行如上步骤S502至S508的步骤,以通过邻居节点的形式从关联关系图中发现并寻找位于同一关系子图中的所有树节点,以实现一个关系子图的划分或拆分。
若栈为空,表示栈中并未存储第一树节点的任何第一邻居节点,即栈中无第一树节点的任何邻居节点,则计算设备可进入下一个关系子图的划分,令下个关系子图的标识为上个关系子图的标识递增1,具体可表示为gno=gno+1,同理按照步骤S502至S506的步骤,计算设备可实现下个关系子图的拆分。直至计算设备遍历完关联关系图中的每个树节点,以实现整个关联关系图的拆分,从而可获得一个或多个关系子图,这里不再赘述。
S106、计算设备根据每个关系子图,从单体应用的程序代码中查找关系子图对应的目标函数及目标函数相关的关联函数。
S108、计算设备将查找的目标函数及目标函数相关的关联函数作为一个微服务。
计算设备在获得多个关系子图后,可根据每个关系子图从单体应用的程序代码中查询每个关系子图对应的目标函数。在一个具体示例中,计算设备获得每个关系子图后,每个关系子图中包含的树节点对应有多个SQL语句,即每个关系子图对应有多个SQL语句。计算设备可根据每个SQL语句的标识,从单体应用的程序代码中查询每个SQL语句对应所在的目标函数,从而获得每个关系子图对应的目标函数。该SQL语句的标识用于区分SQL语句,其可包括但不限于SQL语句的名称、编号、索引等等。在实际应用中,每个SQL语句位于一个目标函数中被执行,计算设备可依据该SQL语句的标识,从单体应用的程序代码中查找该SQL语句对应所在的目标函数。
举例说明,计算设备获得每个关系子图后,每个关系子图对应有多个SQL语句。计算设备可通过解析预设的系统日志,从该系统日志中查询多个SQL语句中每个SQL语句对应所在的目标函数,从而获得每个关系子图对应的目标函数。其中,该系统日志中记录有SQL语句位于的目标函数。
计算设备获得每个关系子图对应的目标函数后,进一步可从该单体应用的程序代码中查询与该目标函数相关的关联函数。进而计算设备可将该目标函数和该目标函数相关的关联函数作为一个微服务。以此原理,计算设备可根据每个关系子图,将单体应用的程序代码拆分为与该关系子图对应的微服务。下面阐述计算设备如何查找目标函数相关的关联函数。
在一个具体示例中,计算设备可对单体应用的程序代码进行分析,生成函数调用有向图,该函数调用有向图中记录有单体应用的至少一个代码函数及代码函数之间的调用关系。具体地,计算设备可对单体应用的程序代码进行分析,从中识别出程序代码中的每个代码函数及代码函数之间的调用关系,进而生成函数调用有向图。该函数调用有向图指示有代码函数之间的调用关系。
举例来说,参见图6示出一种可能的函数调用有向图的示意图。如图6,单体应用的程序代码中包括有9个代码函数,分别如图所示m1至m9。其中,m1与m2之间存在函数调用关系,即函数m1可调用函数m2;m3与m4和m5之间存在函数调用关系,m7与m5和m8之间存在函数调用关系,m4与m6之间存在函数调用关系,m8与m9之间存在函数调用关系。图示中的箭头表示函数间的调用关系,这里不再赘述。
进一步,计算设备根据每个关系子图对应的目标函数,从函数调用有向图中查找与目标函数存在调用关系的代码函数(即查找与目标函数相关的代码函数),以作为该目标函数相关的关联函数。举例来说,引用图6所述例子,假设计算设备获得某个关系子图对应的目标函数有函数m2和m6,则计算设备可从图6所示的函数调用有向图中,查询与函数m2及m6存在直接调用关系及间接调用关系的关联函数,具体如图6中与m2存在函数调用关系的函数有m1,与m6存在函数调用关系的函数有m3、m4及m5。相应地,计算设备可将目标函数m2和m6,及与目标函数相关的关联函数m1、m3、m4及m5一起作为该关系子图对应的一个微服务,具体参见图7示出一种可能的微服务的函数示意图。如图7中,该微服务中包括有从单体应用的程序代码中拆分出的以下函数:m1、m2、m3、m4、m5及m6。此外,图7还示出各个函数之间的调用关系,具体可对应参考前述图6所述实施例中的相关介绍,这里不再赘述。
在实际应用中,本发明涉及的目标函数或代码函数包括但不限于主函数main()、功能函数function()或其他自定义的函数等。
为方便理解本发明,下面以一个具体例子进行详述。请参见图8示出一种微服务拆分的场景示意图。单体应用包括有由n个SQL语句组成的程序代码,每个SQL语句位于一个函数中执行。如图8在微服务拆分过程中,计算设备可对每个SQL语句进行语法分析,生成对应的语法树结构,该语法树结构中包括有至少一个树节点及树节点之间的连接权重。进一步,计算设备对n个SQL语句对应的n个语法树结构进行图形重构,对每个语法树结构中的树节点进行关联查询分析,以生成SQL语句查询的多个表之间的关联关系图。该关联关系图中包括有至少一个树节点及树节点之间的连接权重,该连接权重具体可指树节点所在SQL语句被执行的频率。
进一步计算设备可对该关联关系图进行拆分,得到多个内部关联度更强的关系子图。如图8示例性将关联关系图拆分为4个关系子图,分别如图所示的子图1至子图4,每个子图中包括4个树节点,这里仅为示意并不构成限定。在实际应用中每个关系子图中包含的树节点的数量并不做限定。
计算设备可对单体应用的程序代码进行分析,以得到该单体应用中包括的多个代码函数及代码函数之间的调用关系,进而生成函数调用有向图。如图8所示,该单体应用中包括有9个代码函数,分别为m1至m9,各代码函数之间的调用关系具体如图所示。其中m表示函数。
相应地计算设备获得关系子图后,可根据该关系子图中树节点对应的SQL语句,从单体应用的程序代码中查找该SQL语句对应的目标函数,即获得该关系子图对应的目标函数。进一步计算设备可从该函数调用有向图中,查询与该目标函数相关的关联函数,具体可包括但不限于与该目标函数存在直接或间接调用关系的代码函数等。具体如图8所示,以关系子图4为例,计算设备根据关系子图4中树节点对应的SQL语句,查询到关系子图4对应的目标函数有函数2和函数6,如图所示m2和m6。进一步计算设备可从图8所示的函数调用有向图中查询出与函数2及函数6相关的关联函数,分别有函数m1、m3、m4及m5。相应地,计算设备可将该关系子图4对应的目标函数m2和m6,及该目标函数相关的关联函数m1、m3、m4及m5一起作为一个微服务,具体如图8所示。
在实践中发现,计算设备采用本发明实现单体应用微服务拆分与手动微服务拆分的效果一致,具体如下表1示出本发明单体应用微服务拆分的具体情况。
表1
由上表1可知,单体应用的程序代码规模越大,该单体应用中包含的SQL语句数量更多,对该单体应用微服务化所需的耗时也越长。
通过实施本发明实施例,能够解决现有微服务拆分方案中存在的操作不便捷、人工成本较高及拆分效率不高等问题,能快速实现单体应用的微服务拆分,缩短微服务拆分的时间,提升拆分效率。
基于前述实施例中的相关介绍,下面介绍本发明适用的相关装置及设备。请参见图9是本发明实施例提供的一种微服务的拆分装置的结构示意图。如图9所示的装置900包括生成模块902、拆分模块904及查找模块906。其中,
所述生成模块902,用于基于应用的SQL语句,生成所述SQL语句查询的多个表之间的关联关系图;
所述拆分模块904,用于对所述关联关系图进行拆分,得到多个内部关联度更强的关系子图;
所述查找模块906,用于针对每个所述关系子图,从所述单体应用的程序代码中查找所述关系子图对应的目标函数及所述目标函数相关的关联函数,并将查找的所述关系子图对应的目标函数及所述目标函数相关的关联函数作为一个微服务。
在一些可能的实施例中,所述生成模块902具体用于对所述应用的SQL语句进行语法分析,得到所述SQL语句对应的语法树结构,所述语法树结构包括至少一个树节点及树节点之间的连接权重,每个树节点用于表征所述SQL语句查询的表,所述树节点之间的连接权重为所述树节点对应SQL语句被执行的频次;对所述语法树结构中的至少一个树节点及树节点之间的连接权重进行图形构造,得到所述SQL语句查询的多个表之间的关联关系图。
在一些可能的实施例中,所述查找模块906具体用于:对所述应用的程序代码进行分析,生成函数调用有向图,所述函数调用有向图中记录有所述应用的至少一个代码函数及所述代码函数之间的调用关系;根据所述关系子图对应的目标函数,从所述函数调用有向图中查找与所述目标函数存在调用关系的代码函数,并确定为所述目标函数相关的关联函数。
在一些可能的实施例中,所述关联关系图中包括至少一个树节点及树节点之间的连接权重,所述拆分模块904具体用于:按照高内聚低耦合原则,对所述关联关系图进行拆分,得到多个内部关联度更强的关系子图;其中,所述关系子图的内部关联度为所述关系子图中树节点之间的连接权重之和。
在一些可能的实施例中,所述拆分模块904具体用于:按照预设约束条件,对所述关联关系图进行拆分,得到多个内部关联度更强的关系子图;其中,所述预设约束条件包括以下中的至少一项:所述关系子图中树节点的总数量大于或等于第一阈值、所述关联关系图中的孤立节点支持任意拆分到所述多个关系子图中的任一个、或所述关联关系图中的孤立节点支持独立拆分到一个关系子图。
在一些可能的实施例中,所述关联关系图中包括至少一个树节点及树节点之间的连接权重,所述拆分模块904具体用于:获取第一树节点的第一邻居节点及所述第一邻居节点的第二邻居节点;其中,所述第一树节点为所述关联关系图中未被拆分的树节点,且所述第一树节点相关的连接权重之和大于第二树节点相关的连接权重之和,所述第二树节点为所述关联关系图中除所述第一树节点外的任一未被拆分的树节点;或者,所述第一树节点为所述第一树节点所在的关系子图对应栈中的任一树节点;根据所述第一邻居节点的连接权重和所述第二邻居节点的连接权重,计算所述第一邻居节点的收益,并根据所述第一邻居节点的收益确定是否将所述第一邻居节点拆分到所述第一树节点所在的关系子图。
在一些可能的实施例中,所述拆分模块904具体用于:若所述第一邻居节点的收益大于或等于第二阈值,则确定将所述第一邻居节点拆分到所述第一树节点所在的关系子图;若所述第一邻居节点的收益小于第二阈值,则确定不将所述第一邻居节点拆分到所述第一树节点所在的关系子图。
应理解的,本发明实施例的装置可以通过专用集成电路(application-specificintegrated circuit,ASIC)实现,或可编程逻辑器件(programmable logic device,PLD)实现,上述PLD可以是复杂程序逻辑器件(complex programmable logical device,CPLD),现场可编程门阵列(field-programmable gate array,FPGA),通用阵列逻辑(genericarray logic,GAL)或其任意组合。也可以通过软件实现上述方法实施例的相关描述,该装置中的各个模块也可以为软件单元。
需要说明的,图9仅仅是本发明实施例的一种可能的实现方式,实际应用中,该装置还可以包括更多或更少的部件,这里不作限制。关于本发明实施例中未示出或未描述的内容,可参见前述图1-图8各方法实施例中的相关阐述,这里不再赘述。
请参见图10是本发明实施例提供的一种计算设备的结构示意图。如图10所示的计算设备100包括有一个或多个处理器1001、通信接口1002和存储器1003,处理器1001、通信接口1002和存储器1003可通过总线方式连接,也可通过无线传输等其他手段实现通信。本发明实施例以通过总线1004连接为例其中,该存储器1003用于存储指令,该处理器1001用于执行该存储器1003存储的指令。该存储器1003存储程序代码,且处理器1001可以调用存储器1003中存储的程序代码执行以下操作:
基于应用的SQL语句,生成所述SQL语句查询的多个表之间的关联关系图;
对所述关联关系图进行拆分,得到多个内部关联度更强的关系子图;
针对每个所述关系子图,从所述应用的程序代码中查找所述关系子图对应的目标函数及所述目标函数相关的关联函数,并将查找的所述关系子图对应的目标函数及所述目标函数相关的关联函数作为一个微服务。
可选地,本发明实施例中处理器1001可以调用存储器1003中存储的程序代码用以执行如上图1-图8中任一方法实施例所描述的所有或部分实施步骤,和/或,文本中描述的其他内容等,这里不再赘述。
应理解,处理器1001可以由一个或者多个通用处理器构成,例如中央处理器(Central Processing Unit,CPU)。处理器1001可用于运行相关的程序代码中以下功能模块的程序。该功能模块具体可包括但不限于上文所述的生成模块902、拆分模块904及查找模块906等功能模块中的任一项或多项的组合。也就是说,处理器1001执行程序代码可以上述功能模块中的任一项或多项的功能。其中,关于这里提及的各个功能模块具体可参见前述实施例中的相关阐述,这里不再赘述。
通信接口1002可以为有线接口(例如以太网接口)或无线接口(例如蜂窝网络接口或使用无线局域网接口),用于与其他模块/设备进行通信。例如,本发明实施例中通信接口1002支持用于将拆分获得的微服务发送至其他设备使用等。
存储器1003可以包括易失性存储器(Volatile Memory),例如随机存取存储器(Random Access Memory,RAM);存储器也可以包括非易失性存储器(Non-VolatileMemory),例如只读存储器(Read-Only Memory,ROM)、快闪存储器(Flash Memory)、硬盘(Hard Disk Drive,HDD)或固态硬盘(Solid-State Drive,SSD);存储器1003还可以包括上述种类的存储器的组合。存储器1003可用于存储一组程序代码,以便于处理器1001调用存储器1003中存储的程序代码以实现本发明实施例中涉及的上述各功能模块的功能,或实现本发明上述实施例所提供的微服务的拆分方法或微服务的拆分装置。
需要说明的,图10仅仅是本发明实施例的一种可能的实现方式,实际应用中,计算设备还可以包括更多或更少的部件,这里不作限制。关于本发明实施例中未示出或未描述的内容,可参见前述图1-图9所述实施例中的相关阐述,这里不再赘述。
本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机指令,该计算机指令用于指示计算设备执行如上实施例所提供的微服务的拆分方法,或者该计算机指令指示计算设备部署微服务的拆分装置。
本发明实施例还提供一种计算机程序产品,当所述计算机程序产品在计算设备(具体可在计算设备中的处理器)上运行时,计算设备执行如上实施例中所提供的微服务的拆分方法,或者部署如上实施例提供的微服务的拆分装置。
结合本发明实施例公开内容所描述的方法或者算法的步骤可以硬件的方式来实现,也可以是由处理器执行软件指令的方式来实现。软件指令可以由相应的软件模块组成,软件模块可以被存放于随机存取存储器(英文:Random Access Memory,RAM)、闪存、只读存储器(英文:Read Only Memory,ROM)、可擦除可编程只读存储器(英文:ErasableProgrammable ROM,EPROM)、电可擦可编程只读存储器(英文:Electrically EPROM,EEPROM)、寄存器、硬盘、移动硬盘、只读光盘(CD-ROM)或者本领域熟知的任何其它形式的存储介质中。一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存储介质可以位于ASIC中。另外,该ASIC可以位于计算设备中。当然,处理器和存储介质也可以作为分立组件存在于计算设备中。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。