通过编排方式解决微服务外部依赖复杂性的系统及方法与流程

文档序号:32749051发布日期:2022-12-30 23:40阅读:32来源:国知局
通过编排方式解决微服务外部依赖复杂性的系统及方法与流程

1.本发明涉及微服务技术领域,具体地,涉及一种通过编排方式解决微服务外部依赖复杂性的系统及方法。


背景技术:

2.如图1,当前微服务都会依赖很多外部服务,且这些外部服务对应多种选择,如配置中心可以选取etcd、zookeeper、spring cloud config、apollo、nacos,消息队列可以选取rabbitmq、kafka等。为了保证在不同用户环境中,用户进行了不同的选择,微服务实际又成为了一个大单体,需要将所有外部依赖和核心业务都编译到一起,并在配置文件中记录所需要的选择。这会导致可执行文件不断增大,运行时占用内存不断增大。同时如果多个微服务都使用同一个依赖,当此依赖升级时,所有微服务都需要重新编译。并且在用户环境中,可能存在依赖调用顺序不同的情况,如可能需要在依赖a中获取数值,再将此应用于依赖b;也可能出现在依赖b中获取数值,再将此应用于依赖a的情况。这种情况无法通过配置文件进行穷举,会不断增加配置的复杂性。


技术实现要素:

3.针对现有技术中存在的问题,本发明提供了一种通过编排方式解决微服务外部依赖复杂性的系统及方法,通过编排方式解决微服务外部依赖复杂性。
4.为实现上述目的,本发明采用如下技术方案:一种通过编排方式解决微服务外部依赖复杂性的系统,包括:信息库、低代码前端编辑器、flow文件、可编排框架、独立动态库,所述低代码前端编辑器、flow文件、独立动态库均与信息库连接,所述flow文件还分别与低代码前端编辑器、可编排框架连接,所述可编排框架还与独立动态库连接。
5.进一步地,所述可编排框架包括:启动器、api/flow库、核心api,所述启动器分别与核心api、api/flow库连接。
6.进一步地,所述启动器分别与独立动态库、flow文件连接。
7.进一步地,所述核心api包括:startmain、loadlibrary、loadflow、runapi、runflow,所述startmain用于读取flow文件中的主flow,按照主flow的编排,调用api/flow库中相关功能;所述loadlibrary用于读取独立动态库中需要的动态库和flow,将动态库内的api信息存入api/flow库;所述loadflow用于读取需要的flow文件,将flow的功能存入api/flow库;所述runapi用于执行外部api;所述runflow用于执行flow。
8.本发明还提供了一种所述通过编排方式解决微服务外部依赖复杂性的系统的工作方法,具体包括如下步骤:
9.步骤s1、通过低代码前端编辑器编排flow;
10.步骤s2、启动可编排框架,载入flow文件中的主flow,并根据主flow的编排,继续载入独立动态库和flow文件中的其他flow;
11.步骤s3、通过独立动态库中的核心业务代码执行外部api或flow。
12.进一步地,步骤s1包括如下子步骤:
13.步骤s1.1、编译独立动态库并提供api接口;
14.步骤s1.2、将api的信息填入信息库;
15.步骤s1.3、低代码前端编辑器从信息库中读取api的信息,方便拖曳和编辑;
16.步骤s1.4、通过低代码前端编辑器创建flow文件;
17.步骤s1.5、低代码前端编辑器根据编辑的结果将编排写入flow文件;
18.步骤s1.6、低代码前端编辑器将写入编排的flow文件的信息填入信息库。
19.进一步地,步骤s2包括如下子步骤:
20.步骤s2.1、调用者启动可编排框架,将flow文件中的主flow路径传给启动器;
21.步骤s2.2、启动器载入主flow,进行解析;
22.步骤s2.3、按照主flow的定义,调用loadlibrary,传入需要载入的动态库列表,载入需要的动态库,获取其中的api信息,并将api信息存入api/flow库;
23.步骤s2.4、按照主flow的定义,调用loadflow,传入需要载入的flow文件列表,载入需要的flow文件,将flow信息存入api/flow库;
24.步骤s2.5、按照主flow的定义,调用runapi或runflow,调用业务逻辑。
25.进一步地,步骤s3中当核心业务代码执行外部api时,具体流程如下:
26.i、在核心业务代码中通过runapi,将所需要的api名称和参数传入,并将api名称和参数存入信息库;
27.ii、在编排主flow时,将依赖api对应的动态库名称作为参数传入loadlibrary;
28.iii、在启动时,载入对应动态库,将api信息写入api/flow库;在运行时,调用runapi,在api/flow库中查找api信息并执行。
29.进一步地,步骤s3中当核心业务代码执行flow时,具体流程如下:
30.i、在核心业务代码中通过runflow,将所需要的flow名称和参数传入,并将flow名称和参数存入信息库;
31.ii、在编排主flow时,将依赖api对应的动态库名称作为参数传入loadlibrary,将依赖flow对应的flow文件名作为参数传入loadflow;
32.iii、在启动时,载入对应flow文件,将flow信息写入flow库;在运行时,调用runflow,在api/flow库中查找flow信息并执行。
33.与现有技术相比,本发明具有如下有益效果:本发明将微服务中的单体进一步拆分为api和flow,从而将核心业务和外部依赖解耦;同时,通过低代码前端编辑器对api进行编排,生成flow,从而可以灵活选择外部依赖,而不改变核心业务逻辑,不需要的外部依赖不需要编入微服务镜像,从而节约了存储和内存空间。
附图说明
34.图1为现有的单个微服务解决复杂性外部依赖的框架图;
35.图2为本发明通过编排方式解决微服务外部依赖复杂性的系统的框架图;
36.图3为本发明中通过低代码前端编辑器编排flow的流程图;
37.图4为本发明中可编排框架启动的流程图;
38.图5为主flow中按需加载不同的消息队列动态库,并执行动态库里的相应api的示
意图;
39.如图6为依赖于主flow的核心业务逻辑示意图。
具体实施方式
40.下面结合附图和实施例对本发明的技术方案作进一步解释说明。
41.如图2为本发明通过编排方式解决微服务外部依赖复杂性的系统的框架图,该系统包括:信息库、低代码前端编辑器、flow文件、可编排框架、独立动态库,信息库包含api信息和flow信息,具体包含类型、名称、功能,api所在动态库,输入/返回参数的名称,依赖其他api和flow这些字段。api信息是由开发者在编写完api后填入的,flow信息是低代码前端编辑器编辑flow后自动生成的;低代码前端编辑器根据信息库,让用户通过拖曳、编辑的模式生成最终的flow,flow的内容存到flow文件,flow的信息填入信息表。flow文件包含:主flow和其他flow,主flow在启动时对外部依赖进行初始化,并最终进入用户核心业务;同一类型接口,不同底层实现,在核心业务调用一个固定名称flow,针对不同用户需求,在flow中完成对底层实现的屏蔽;对非核心业务,有不同的业务需求,同样针对不同用户需求,在flow中完成具体的业务需求;其他flow,比如对于消息队列,常用的如kafka和rabbitmq,这样在核心业务中只调用一个统一接口的消息队列发送flow,但是内部根据客户需求,可以封装kafka api,或者封装rabbitmq api;此外,还有用于pre/post流程的flow,比如一个事务失败时,有的用户可能选择发送短信告警,有的用户可能选择发送邮件告警。本发明中独立动态库不与可编排框架编译到一起,且可编排框架不依赖于独立动态库,在内部根据主flow编排在底层按需载入,大大节约了存储空间和内存,这些api也会调用其他api和flow,但是并不是直接通过函数调用,而是通过编排系统调用,避免了编译时的依赖。可编排框架负责加载并解析主flow,再按照主flow的编排,按需加载其他flow和动态库,并执行各种初始化和业务逻辑。因此,低代码前端编辑器、flow文件、独立动态库均与信息库连接,flow文件还分别与低代码前端编辑器、可编排框架连接,可编排框架还与独立动态库连接。本发明将微服务中的单体进一步拆分为api和flow,从而将核心业务和外部依赖解耦;同时,通过低代码前端编辑器对api进行编排,生成flow,从而可以灵活选择外部依赖,而不改变核心业务逻辑,不需要的外部依赖不需要编入微服务镜像,从而节约了存储和内存空间。
42.本发明中可编排框架包括:启动器、api/flow库、核心api,启动器负责系统的初始化,并通过调用核心api执行主flow;api/flow库是使用核心api加载动态库和flow文件的结果,在api代码中或者flow中可以使用核心api调用其中的api/flow。因此,启动器分别与核心api、api/flow库连接,启动器分别与独立动态库、flow文件连接。
43.本发明中核心api包括:startmain、loadlibrary、loadflow、runapi、runflow,startmain用于读取flow文件中的主flow,按照主flow的编排,调用api/flow库中相关功能;loadlibrary用于读取独立动态库中需要的动态库和flow,将动态库内的api信息存入api/flow库;loadflow用于读取需要的flow文件,将flow的功能存入api/flow库;runapi用于执行外部api;runflow用于执行folw。
44.本发明还提供了一种通过编排方式解决微服务外部依赖复杂性的系统的工作方法,具体包括如下步骤:
45.步骤s1、通过低代码前端编辑器编排flow;如图3,具体包括如下子步骤:
46.步骤s1.1、编译独立动态库并提供api接口;
47.步骤s1.2、将api的信息填入信息库;
48.步骤s1.3、低代码前端编辑器从信息库中读取api的信息,方便拖曳和编辑;
49.步骤s1.4、通过低代码前端编辑器创建flow文件;
50.步骤s1.5、低代码前端编辑器根据编辑的结果将编排写入flow文件;
51.步骤s1.6、低代码前端编辑器将写入编排的flow文件的信息填入信息库,便于在一个flow中调用存在的另一个flow。
52.步骤s2、启动可编排框架,载入flow文件中的主flow,并根据主flow的编排,继续载入独立动态库和flow文件中的其他flow;如图4,具体包括如下子步骤:
53.步骤s2.1、调用者启动可编排框架,将flow文件中的主flow路径传给启动器;
54.步骤s2.2、启动器载入主flow,进行解析;
55.步骤s2.3、按照主flow的定义,调用loadlibrary,传入需要载入的动态库列表,载入需要的动态库,获取其中的api信息,并将api信息存入api/flow库;
56.步骤s2.4、按照主flow的定义,调用loadflow,传入需要载入的flow文件列表,载入需要的flow文件,将flow信息存入api/flow库;
57.步骤s2.5、按照主flow的定义,调用runapi或runflow,调用业务逻辑。
58.步骤s3、通过独立动态库中的核心业务代码执行外部api或flow;具体地,
59.当核心业务代码执行外部api时,具体流程如下:
60.i、在核心业务代码中通过runapi,将所需要的api名称和参数传入,并将api名称和参数存入信息库;
61.ii、在编排主flow时,将依赖api对应的动态库名称作为参数传入loadlibrary;
62.iii、在启动时,载入对应动态库,将api信息写入api/flow库;在运行时,调用runapi,在api/flow库中查找api信息并执行。
63.当核心业务代码执行flow时,具体流程如下:
64.i、在核心业务代码中通过runflow,将所需要的flow名称和参数传入,并将flow名称和参数存入信息库;
65.ii、在编排主flow时,将依赖api对应的动态库名称作为参数传入loadlibrary,将依赖flow对应的flow文件名作为参数传入loadflow;
66.iii、在启动时,载入对应flow文件,将flow信息写入flow库;在运行时,调用runflow,在api/flow库中查找flow信息并执行。
67.实施例
68.开发者开发了一个小额免密扣款程序,从消息队列接收请求,获取用户设置的小额免密最大额度,根据两个用户的比较,执行不同用户定义的业务流程。涉及的伪代码包括:从消息队列接收请求,获取用户小额免密最大额度,如果扣款额》最大额度,扣款失败处理;否则扣款成功处理。
69.现在有甲、乙两个客户,其对周边的依赖和业务流程有非常大的差别,如表1所示,在传统开发模式时,需要大量的配置用于用户不同选择,同时kafka、rabbitmq、短信、邮件依赖都需要编译到应用中,加大了应用的体积;当更多客户引入时,可能由于不断的新依赖需求,导致配置和应用体积的不可控膨胀。
70.表1:甲,乙客户需求对比表
[0071][0072]
而使用本发明解决微服务外部依赖复杂性的系统后,对外的依赖将全部抽象为对外flow,表述为:runflow(从消息队列接收请求),runflow(获取用户小额免密最大额度),如果扣款额》最大额度,runflow(扣款失败);否则runflow(扣款成功)。通过本发明的方法,提取甲、乙用户的api信息,如表2所示。
[0073]
表2:api信息
[0074]
[0075][0076]
如图5,用户甲需要kafka队列,因此只需要加载kafka动态库,不需要加载rabbitmq动态库;用户乙需要rabbitmq队列,因此只需要加载rabbitmq动态库,不需要加载kafka动态库;用户甲需要发短信,因此只需要加载shortmessage动态库,不需要加载email动态库动态库;用户乙需要发邮件,因此只需要加载email动态库,不需要加载shortmessage动态库动态库。根据用户需求,针对甲,乙两个用户,构建了不同的主flow,如表3所示。
[0077]
表3:根据客户需求构建主flow
[0078]
[0079][0080]
如图6,用户核心业务将对外依赖抽象为flow,在flow中实现了依赖差异,这样用户核心业务逻辑不需要针对不同用户单独开发、单独编译,从而节约了存储和内存空间。下面将针对4个flow进行一一进行解释。
[0081]
表4:根据用户需求,对比甲乙两个用户的接收请求flow文件
[0082][0083]
表5:根据用户需求,对比甲乙两个用户的获取用户小额免密最大额度
[0084][0085]
表6:根据用户需求,对比甲乙两个用户的扣款成功
[0086][0087]
表7:根据用户需求,对比甲乙两个用户的扣款失败
[0088][0089]
以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1