发明内容
本发明旨在至少解决现有技术中存在的技术问题之一。为此,本发明提出一种微服务分库方法,能够通过程序算法,便捷的查询出微服务使用到的数据库表,并进行自动划分微服务,创建数据库,迁移数据表和数据。
本发明还提出一种微服务分库系统。
本发明还提出一种实施上述微服务分库方法的计算机可读存储介质。
根据本发明的第一方面实施例的一种微服务分库方法,所述方法包括以下步骤:S100、扫描数据库中所有的表,创建概要表,所述概要表存储所述所有的表的表名;S200、将所述概要表中的所述表名进行加前后缀处理之后,构建DFA树;S300、扫描微服务的所有配置文件和Java的源代码文件,将得到的表名的字符串通过所述DFA树进行匹配,将匹配完成的表名及其对应的微服务的名称存储到微服务表;S400、对所述微服务表中的数据进行调整处理之后,进行微服务分库处理。
根据本发明实施例的微服务分库方法,至少具有如下有益效果:
(1)通过DFA算法高效的计算出文件中存在的数据表;
(2)多个微服务同时用到一张表,可以通过sql查询很便捷的进行筛选出来;
(3)自动创建数据库,自动表拆分,自动数据迁移,便捷的数据迁移;
(4)分库时程序代替人工处理,在效率上由很大的提升,减少放错的机会。
根据本发明的一些实施例,所述方法还包括:将所有微服务的源代码放置在同一文件夹。
根据本发明的一些实施例,所述步骤S200包括:将单个字符作为前缀添加的到所述表名的前面,作为后缀添加到所述表名的后面,基于添加过所述前缀和后缀的表名构建DFA树。
根据本发明的一些实施例,所述步骤S300包括:S301、逐行扫描一微服务的配置文件或Java的源代码文件,扫描到SQL语句;S302、将所述SQL语句作为输入字符串输入到所述DFA树进行匹配;S303、当匹配到前缀字符时开始基于所述DFA树进行表名匹配;S304、匹配成功后将匹配到的表名和所述微服务的名称存储到所述微服务表中。
根据本发明的一些实施例,所述步骤S400包括:S401、根据各微服务的业务,对所述微服务表中的数据进行调整。
根据本发明的一些实施例,所述步骤S400包括:S402、以微服务名称为数据库名称创建数据库,以步骤S100中的所述数据库为主库,对所述主库的表进行数据结构和数据的复制;S403、导出各个数据库文件,复制到指定的MySQL的数据库服务器中的数据模块中。
根据本发明的第二方面实施例的一种微服务分库系统,所述系统包括:概要表创建模块,用于扫描数据库中所有的表,创建概要表,所述概要表存储所述所有的表的表名;DFA树构建模块,用于将所述概要表中的所述表名进行加前后缀处理之后,构建DFA树;表名匹配模块,用于扫描微服务的所有配置文件和Java的源代码文件,将得到的表名的字符串通过所述DFA树进行匹配,将匹配完成的表名及其对应的微服务的名称存储到微服务表;分库处理模块,用于对所述微服务表中的数据进行调整处理之后,进行微服务分库处理。
根据本发明实施例的微服务分库系统,至少具有如下有益效果:
(1)通过DFA算法高效的计算出文件中存在的数据表;
(2)多个微服务同时用到一张表,可以通过sql查询很便捷的进行筛选出来;
(3)自动创建数据库,自动表拆分,自动数据迁移,便捷的数据迁移;
(4)分库时程序代替人工处理,在效率上由很大的提升,减少放错的机会。
根据本发明的一些实施例,所述分库处理模块包括数据调整模块,用于根据各微服务的业务,对所述微服务表中的数据进行调整。
根据本发明的一些实施例,所述分库处理模块包括数据库创建模块和数据迁移模块;所述数据库创建模块,用于以微服务名称为数据库名称创建数据库,以所述概要表创建模块中的所述数据库为主库,对所述主库的表进行数据结构和数据的复制;所述数据迁移模块,用于导出各个数据库文件,复制到指定的MySQL的数据库服务器中的数据模块中。
根据本发明的第三方面实施例的一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现本发明的第一方面实施例中任一项的方法。
本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
在本发明的描述中,若干的含义是一个或者多个,多个的含义是两个及两个以上,大于、小于、超过等理解为不包括本数,以上、以下、以内等理解为包括本数。如果有描述到第一、第二只是用于区分技术特征为目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量或者隐含指明所指示的技术特征的先后关系。
术语解释:
1.概要表:记录着整个数据中所有的数据表的表名
2.微服务表:与微服务关联的数据表,存储着与各个微服务相关联对应的数据库表的表名
3.DFA即Deterministic Finite Automaton,也就是确定有穷自动机它是是通过事件和当前的状态得到下一个状态。
参照图1,本发明的实施例的微服务分库方法包括:
步骤S100、扫描数据库中所有的表,创建概要表,其中,概要表用来存储所有的表的表名;
步骤S200、将概要表中的表名进行加前后缀处理,然后构建DFA树;
步骤S300、扫描微服务的所有配置文件和Java的源代码文件,将得到的表名的字符串通过DFA树进行匹配,将匹配完成的表名及其对应的微服务的名称存储到微服务表;
步骤S400、对微服务表中的数据进行调整处理之后,进行微服务分库处理。
在一些实施例中,在开始步骤S100之前,将所有微服务的源代码放置在同一文件夹,方便进行扫描操作。
在一些实施例中,步骤S200包括:将单个字符作为前缀添加的到表名的前面,作为后缀添加到表名的后面,基于添加过所述前缀和后缀的表名构建DFA树。例如,表名为table1,将单引号‘’作为前后缀对表名table1进行添加前后缀处理,得到‘table1’,这样处理不仅便于构建DFA树,也便于对源代码中的表名信息进行匹配。
进一步参照图2,在一些实施例中,步骤S300包括以下步骤:
步骤S301、逐行扫描一微服务的配置文件或Java的源代码文件,扫描到SQL语句;
步骤S302、将SQL语句作为输入字符串输入到DFA树进行匹配;
步骤S303、当匹配到前缀字符时开始基于DFA树进行表名匹配;
步骤S304、匹配成功后将匹配到的表名和微服务的名称存储到微服务表中。
在一些实施例中,步骤S400包括:S401、根据各微服务的业务,对微服务表中的数据进行调整。
在一些实施例中,步骤S400包括:
步骤S402、以微服务名称为数据库名称创建数据库,以步骤S1中的数据库为主库,对主库的表进行数据结构和数据的复制;
步骤S403、导出各个数据库文件,复制到指定的MySQL的数据库服务器中的数据模块中。
参照图3,下面以一实施例详细说明本发明的方法。
1.把所有微服务源代码都放置在同一个文件夹
2.通过程序扫描数据库中的所有表,然后存储到一个指定的“概要表”中
3.通过扫描所有微服务的文件中的“.xml”文件和“.java”中每一行的值进行读取和解析,通过DFA算法来对“概要表”的数据库表进行匹配,具体使用算法如下:
(1)把在“概要表”中的所欲数据表的表名加上前缀如:“`”,“(”,“”,“”和后缀如:“`”,“)”,“”,“””,“<”,“\r”,“(”等sql语句在java代码中可能出现的表格的结束符号。
参照下表1,表1为对表名进行前后缀处理的结果。
表名称 |
处理后的表名称 |
t |
`t` |
tt |
`tt` |
Tb |
`Tb` |
表1对表名进行加前后缀处理
(2)再把处理后的“概要表”中的表名列表构建成一个DFA,这样输入扫描微服务源文件中的字符串,通过在整个DFA上的转移实现对应微服务数据表查找的功能。
(3)构建如图3所示的DFA树。
4.扫描“.java”和“.xml”文件解析并匹配数据库表方式如下:
(1)扫描“.xml”内容如下:
<select id=“select”>
select*from‘tt’
</select>
(2)扫描“.java”内容如下:
@Select(“select*from‘tt’”)
@ResultType(CustomerDO.class)
List<CustomerDO>query();
(3)如(1)和(2)所示,当扫描读取文件获取到字符串“select*from`tt`”和“@select(“select*from`tt`”)”,把字符串输入到如图3所示的由“概要表”组成的DFA树,对输入的每一个字符进行匹配,当匹配到字符“`”时候进入DFA树匹配阶段,一直到“`tt`”匹配成功,则说明`tt`为数据表相关,再通过“`tt`”移除特殊字符找到对应的“tt”数据库表。
5.把从文件中匹配到的数据库表存储到如下表2所示的“微服务表”。
微服务名称 |
表名称 |
Server1 |
tt |
Server2 |
Tb |
Server3 |
Table1 |
表2微服务表
6.通过业务进行规划,“微服务表”表中的的数据对应关系进行梳理,调整“微服务表”中的数据。
7.调整完成之后,通过程序自动以微服务名称为数据名称,创建数据库,并且对主库中的数据表进行数据结构复制和数据的复制,以达到在同一连接下根据不同微服务创建对应的库,数据表,以及数据迁移的工作。
8.导出这一连接所存在的各个数据库文件,复制到指定的mysql的数据库服务器中的数据模块下,完成微服务数据拆分。
参照图4,本发明的实施例的微服务分库系统包括:概要表创建模块,用于扫描数据库中所有的表,创建概要表,概要表存储所有的表的表名;DFA树构建模块,用于将概要表中的表名进行加前后缀处理之后,构建DFA树;表名匹配模块,用于扫描微服务的所有配置文件和Java的源代码文件,将得到的表名的字符串通过DFA树进行匹配,将匹配完成的表名及其对应的微服务的名称存储到微服务表;分库处理模块,用于对微服务表中的数据进行调整处理之后,进行微服务分库处理。
在一些实施例中,分库处理模块包括数据调整模块,用于根据各微服务的业务,对微服务表中的数据进行调整。
在一些实施例中,分库处理模块包括数据库创建模块和数据迁移模块;数据库创建模块,用于以微服务名称为数据库名称创建数据库,以概要表创建模块中的数据库为主库,对主库的表进行数据结构和数据的复制;数据迁移模块,用于导出各个数据库文件,复制到指定的MySQL的数据库服务器中的数据模块中。
尽管本文描述了具体实施方案,但是本领域中的普通技术人员将认识到,许多其它修改或另选的实施方案同样处于本公开的范围内。例如,结合特定设备或组件描述的功能和/或处理能力中的任一项可以由任何其它设备或部件来执行。另外,虽然已根据本公开的实施方案描述了各种例示性具体实施和架构,但是本领域中的普通技术人员将认识到,对本文所述的例示性具体实施和架构的许多其它修改也处于本公开的范围内。
上文参考根据示例性实施方案所述的系统、方法、系统和/或计算机程序产品的框图和流程图描述了本公开的某些方面。应当理解,框图和流程图中的一个或多个块以及框图和流程图中的块的组合可分别通过执行计算机可执行程序指令来实现。同样,根据一些实施方案,框图和流程图中的一些块可能无需按示出的顺序执行,或者可以无需全部执行。另外,超出框图和流程图中的块所示的那些部件和/或操作以外的附加部件和/或操作可存在于某些实施方案中。
因此,框图和流程图中的块支持用于执行指定功能的装置的组合、用于执行指定功能的元件或步骤的组合以及用于执行指定功能的程序指令装置。还应当理解,框图和流程图中的每个块以及框图和流程图中的块的组合可以由执行特定功能、元件或步骤的专用硬件计算机系统或者专用硬件和计算机指令的组合来实现。
本文所述的程序模块、应用程序等可包括一个或多个软件组件,包括例如软件对象、方法、数据结构等。每个此类软件组件可包括计算机可执行指令,所述计算机可执行指令响应于执行而使本文所述的功能的至少一部分(例如,本文所述的例示性方法的一种或多种操作)被执行。
软件组件可以用各种编程语言中的任一种来编码。一种例示性编程语言可以为低级编程语言,诸如与特定硬件体系结构和/或操作系统平台相关联的汇编语言。包括汇编语言指令的软件组件可能需要在由硬件架构和/或平台执行之前由汇编程序转换为可执行的机器代码。另一种示例性编程语言可以为更高级的编程语言,其可以跨多种架构移植。包括更高级编程语言的软件组件在执行之前可能需要由解释器或编译器转换为中间表示。编程语言的其它示例包括但不限于宏语言、外壳或命令语言、作业控制语言、脚本语言、数据库查询或搜索语言、或报告编写语言。在一个或多个示例性实施方案中,包含上述编程语言示例中的一者的指令的软件组件可直接由操作系统或其它软件组件执行,而无需首先转换成另一种形式。
软件组件可存储为文件或其它数据存储构造。具有相似类型或相关功能的软件组件可一起存储在诸如特定的目录、文件夹或库中。软件组件可为静态的(例如,预设的或固定的)或动态的(例如,在执行时创建或修改的)。
上面结合附图对本发明实施例作了详细说明,但是本发明不限于上述实施例,在所属技术领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下作出各种变化。