应用的部署方法、装置、设备及计算机可读存储介质与流程

文档序号:30970201发布日期:2022-08-02 20:31阅读:68来源:国知局
应用的部署方法、装置、设备及计算机可读存储介质与流程

1.本技术涉及计算机技术,尤其涉及一种应用的部署方法、装置、设备及计算机可读存储介质。


背景技术:

2.应用部署是指将应用部署到指定的数据处理环境,如私有云,得该应用可以在该数据处理环境中运行、并提供相应的功能、服务。其中,应用可以涉及各个不同的领域,例如,物联网领域、人工智能领域、游戏领域等。
3.相关技术中,一个应用通常分成多个组件来部署,在对应用进行部署时,需要每个组件负责人员帮忙分配资源、部署组件、申请云服务,导致负责人员的工作量大,应用部署的效率低。


技术实现要素:

4.本技术实施例提供一种应用的部署方法、装置、设备及计算机可读存储介质,能够提高应用部署的效率。
5.本技术实施例的技术方案是这样实现的:
6.本技术实施例提供一种应用的部署方法,包括:
7.响应于针对目标应用的部署指令,获取所述目标应用的描述文件、及所述目标应用依赖的至少一个组件的描述文件;
8.基于所述目标应用的描述文件生成所述目标应用对应的应用实例,并基于所述组件的描述文件生成各所述组件对应的组件实例;
9.以所述应用实例及组件实例为节点,构建对应所述目标应用的动态拓扑图;
10.基于所述动态拓扑图,分别对所述应用实例及各所述组件实例进行部署,以完成所述目标应用的部署。
11.本技术实施例提供一种应用的部署装置,包括:
12.获取模块,用于响应于针对目标应用的部署指令,获取所述目标应用的描述文件、及所述目标应用依赖的至少一个组件的描述文件;
13.生成模块,用于基于所述目标应用的描述文件及所述组件的描述文件,生成所述目标应用对应的应用实例及各所述组件对应的组件实例;
14.构建模块,用于以所述应用实例及组件实例为节点,构建对应所述目标应用的动态拓扑图;
15.部署模块,用于基于所述动态拓扑图,分别对所述应用实例及各所述组件实例进行部署,以完成所述目标应用的部署。
16.上述方案中,所述生成模块,还用于基于所述目标应用的描述文件,生成所述目标应用对应的应用对象,并基于所述组件的描述文件生成各所述组件对应的组件对象;
17.以所述应用对象及组件对象为节点,构建对应所述目标应用的静态拓扑图;
18.其中,所述静态拓扑图用于描述所述应用对象与所述组件对象间的依赖关系、及所述组件对象间的依赖关系;
19.根据所述静态拓扑图,生成所述目标应用对应的应用实例、及各所述组件对应的组件实例。
20.上述方案中,所述生成模块,还用于创建对应所述目标应用的空对象;
21.将所述目标应用的描述文件中的字段记录到对应所述目标应用的空对象中,以生成所述目标应用对应的应用对象;
22.创建对应各所述组件对应的空对象;
23.分别将各所述组件的描述文件中的字段记录到相应组件的空对象中,以生成所述目标应用对应的应用对象。
24.上述方案中,所述生成模块,还用于将所述应用对象及组件对象作为所述静态拓扑图的节点;
25.根据所述目标应用的描述文件,获取所述目标应用直接依赖的第一组件;
26.构建由所述应用对象,指向所述第一组件对应的组件对象的边;
27.根据各所述组件的描述文件,确定存在所述组件直接依赖的第二组件时,获取所述组件直接依赖的第二组件;
28.构建由所述组件对应的组件对象,指向所述第二组件对应的组件对象的边,以得到对应所述目标应用的静态拓扑图。
29.上述方案中,所述生成模块,还用于采用深度遍历的方式,自上而下对所述静态拓扑图进行遍历,并
30.在遍历的过程中,根据遍历到的对象生成相应的实例,以得到所述目标应用对应的应用实例、及各所述组件对应的组件实例。
31.上述方案中,所述生成模块,还用于当遍历到的所述对象为根节点时,创建对应所述根节点的实例;
32.获取所述对象携带的针对自身对象的部署参数,将所述部署参数添加至对应所述根节点的实例中。
33.上述方案中,所述生成模块,还用于当遍历到的所述对象为非根节点时,创建对应所述非根节点的实例;
34.获取所述对象携带的针对自身对象的部署参数、及上层对象传递的针对所述对象的部署参数;
35.将获取的所述部署参数添加至对应所述非根节点的实例中。
36.上述方案中,所述生成模块,还用于当遍历到的对象为非根节点时,获取上层对象传递的针对所述对象的下层对象的部署参数,并传递至所述对象的下层对象;
37.获取所述对象携带的针对下层对象的部署参数,并传递至所述对象的下层对象;
38.其中,传递至所述下层对象的部署参数,用于在生成所述下层对象对应的实例时添加至所述下层对象对应的实例中。
39.上述方案中,所述生成模块,还用于当所述对象携带实例共享组字段时,确定所述实例共享组字段对应实例共享组中的共享实例;
40.生成对应所述共享实例的实例标识;
41.其中,所述共享实例为所述对象对应的实例与其它实例共同依赖的实例,所述实例标识,用于在对所述动态拓扑图进行遍历过程以及生成相应实例的过程中,不再生成所述共享实例对应对象的实例。
42.上述方案中,所述部署模块,还用于从所述动态拓扑图的叶子节点开始,从下往上逐层部署各节点对应的实例,所述实例为应用实例或组件实例。
43.上述方案中,所述部署模块,还用于将所述动态拓扑图的叶子节点对应的实例添加至可部署序列;
44.循环执行以下操作,直至所述可部署序列为空:
45.从所述可部署序列中取出目标数量的实例进行部署;
46.当所述目标数量的实例部署完成时,在所述实例的上层实例中添加标识信息,所述标识信息用于指示所述实例已部署完成;
47.根据所述标识信息确定所述上层实例依赖的实例已完成部署时,将所述上层实例添加至所述可部署序列。
48.上述方案中,所述部署模块,还用于从所述可部署序列中取出目标数量的实例添加至部署序列中;
49.对所述部署序列中的实例进行并发部署。
50.本技术实施例提供一种计算机设备,包括:
51.存储器,用于存储可执行指令;
52.处理器,用于执行所述存储器中存储的可执行指令时,实现本技术实施例提供的应用的部署方法。
53.本技术实施例提供一种计算机可读存储介质,存储有可执行指令,用于引起处理器执行时,实现本技术实施例提供的应用的部署方法。
54.本技术实施例具有以下有益效果:
55.应用上述实施例,通过基于所述目标应用的描述文件生成所述目标应用对应的应用实例,并基于所述组件的描述文件生成各所述组件对应的组件实例;以所述应用实例及组件实例为节点,构建对应所述目标应用的动态拓扑图;基于所述动态拓扑图,分别对所述应用实例及各所述组件实例进行部署,以完成所述目标应用的部署;如此,由于动态拓扑图描述了应用实例与组件实例间的关系、及组件实例间的关系,使得计算机设备能够处理应用实例与组件实例间的关系、及组件实例间的关系,开发人员仅需要触发针对目标应用的部署指令,计算机设备就能够利用动态拓扑图,实现目标应用的自动部署,减少了开发人员的工作量,并提高了应用部署的效率。
附图说明
56.图1是本技术实施例提供的应用的部署系统100的架构示意图;
57.图2是本技术实施例提供的计算机设备500的结构示意图;
58.图3是本技术实施例提供的应用的部署方法的流程示意图;
59.图4是本技术实施例提供的目标应用的部署界面示意图;
60.图5是本技术实施例提供的静态拓扑图的示意图;
61.图6是本技术实施例提供的动态拓扑图的示意图;
62.图7是本技术实施例提供的应用的部署的软件系统架构示意图;
63.图8是本技术实施例提供的应用的部署方法的流程示意图;
64.图9是本技术实施例提供的动态拓扑图的生成过程示意图;
65.图10是本技术实施例提供的实例部署的过程示意图;
66.图11是本技术实施例提供的单个实例部署的流程示意图。
具体实施方式
67.为了使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术作进一步地详细描述,所描述的实施例不应视为对本技术的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本技术保护的范围。
68.在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
69.在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本技术实施例能够以除了在这里图示或描述的以外的顺序实施。
70.除非另有定义,本文所使用的所有的技术和科学术语与属于本技术的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本技术实施例的目的,不是旨在限制本技术。
71.对本技术实施例进行进一步详细说明之前,对本技术实施例中涉及的名词和术语进行说明,本技术实施例中涉及的名词和术语适用于如下的解释。
72.1)组件,包括应用组件和云服务,其中,应用组件为完成单一功能的代码和制品,在云平台上部署和运行,为网络上的调用方提供服务;云服务为软件即服务(saas,software-as-a-service)平台或平台即服务(paas,platform-as-a-service)平台提供的云服务,包括有名字服务、nosql服务、关系型数据库服务、消息队列、文字识别等,应用组件可以依赖云服务。
73.2)应用,由多个组件组成,为一个或多个客户端应用提供后台服务;
74.3)实例,抽象类在实例化之后叫做一个实例,其中,抽象类是静态的,不占进程内存,而实例是拥有动态内存的。
75.4)响应于,用于表示所执行的操作所依赖的条件或者状态,当满足所依赖的条件或状态时,所执行的一个或多个操作可以是实时的,也可以具有设定的延迟;在没有特别说明的情况下,所执行的多个操作不存在执行先后顺序的限制。
76.为实现应用的部署,相关技术中提供了两种方案,即helm包管理方案和开放应用模型(oam,open application model)方案。
77.这里,helm是kubernetes平台的包管理方案,kubernetes平台是一个开源的、用于管理云平台中多个主机上的容器化的应用。在kubernetes平台上的一个应用通常分成多个组件来部署,每个组件都有它的部署方式、服务访问方式、以及依赖的其它组件和服务等等;且组件的每个维度都有一个独立描述文件。在helm包管理方案中,将所有描述文件打成
包,通过模板的形式将描述文件中的可变字段暴露给用户;这里的包存放在统一仓库中,用户根据需要拉取对应的包,使用helm工具部署到kubernetes平台上。
78.申请人在实施本技术的过程中发现,helm包管理方案是将部署一个应用所需要的所有描述文件简单的打包到一起,然后将用户参数通过模板替换的方式设置到每个组件中,应用的部署过程复杂,且其仅适用于kubernetes平台。
79.oam方案通过定义由组件、应用部署配置、运维特征组成的云原生应用模型,实现开发、运维、基础架构三种角色的关注点分离,构建以应用为中心的平台。
80.申请人在实施本技术的过程中发现,oam方案中将开发与运维独立为两种角色,组件由开发人员负责,运维特性和资源由运维人员负责,其没有考虑客户端组件和后台服务的依赖关系,缺乏端云一体、配置打通、拓扑管理等实施细节,无法实现应用的自动部署。
81.基于此,本技术实施例提供一种应用的部署方法、装置、设备和计算机可读存储介质,能够提高应用部署的效率。
82.参见图1,图1是本技术实施例提供的应用的部署系统100的架构示意图,为实现支撑一个示例性应用,应用的部署系统100包括终端400、容器平台200、数据库500,其中,终端400与容器平台200通过网络300连接,网络300可以是广域网或者局域网,又或者是二者的组合。这里,应用和组件部署在容器平台中。
83.在实际实施时,开发人员为目标应用及其依赖的组件编写描述文件,并将编写的描述文件存储在代码库;
84.当需要部署目标应用时,开发人员通过终端400输入的用于触发针对目标应用的部署指令的命令行;终端400在接收到该命令行后,触发针对目标应用的部署指令;
85.终端400响应于针对目标应用的部署指令,从代码库获取标应用的描述文件、及目标应用依赖的至少一个组件的描述文件;基于目标应用的描述文件生成目标应用对应的应用实例,并基于组件的描述文件生成各组件对应的组件实例;以应用实例及组件实例为节点,构建对应目标应用的动态拓扑图;基于动态拓扑图,将应用实例及各组件实例部署至容器平台200,以完成目标应用的部署;
86.在一些实施例中,终端400可以将生成的动态拓扑图存储至数据库500,以供再次部署时使用。
87.在一些实施例中,容器平台200可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(cdn,content delivery network)、以及大数据和人工智能平台等基础云计算服务的云服务器。终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表、车载设备、智能电视等,但并不局限于此。
88.参见图2,图2是本技术实施例提供的计算机设备500的结构示意图,在实际应用中,计算机设备500可以为终端或服务器,以计算机设备为图1所示的终端为例,对实施本技术实施例的应用的部署方法的计算机设备进行说明。图2所示的计算机设备500包括:至少一个处理器510、存储器550、至少一个网络接口520和用户接口530。计算机设备500中的各个组件通过总线系统540耦合在一起。可理解,总线系统540用于实现这些组件之间的连接通信。总线系统540除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是
为了清楚说明起见,在图2中将各种总线都标为总线系统540。
89.处理器510可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(dsp,digital signal processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
90.用户接口530包括使得能够呈现媒体内容的一个或多个输出装置531,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口530还包括一个或多个输入装置532,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。
91.存储器550可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器550可选地包括在物理位置上远离处理器510的一个或多个存储设备。
92.存储器550包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(rom,read only memory),易失性存储器可以是随机存取存储器(ram,random access memory)。本技术实施例描述的存储器550旨在包括任意适合类型的存储器。
93.在一些实施例中,存储器550能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
94.操作系统551,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
95.网络通信模块552,用于经由一个或多个(有线或无线)网络接口520到达其他计算设备,示例性的网络接口520包括:蓝牙、无线相容性认证(wifi)、和通用串行总线(usb,universal serial bus)等;
96.呈现模块553,用于经由一个或多个与用户接口530相关联的输出装置531(例如,显示屏、扬声器等)使得能够呈现信息(例如,用于操作外围设备和显示内容和信息的用户接口);
97.输入处理模块554,用于对一个或多个来自一个或多个输入装置532之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。
98.在一些实施例中,本技术实施例提供的应用的部署装置可以采用软件方式实现,图2示出了存储在存储器550中的应用的部署装置555,其可以是程序和插件等形式的软件,包括以下软件模块:获取模块5551、生成模块5552、构建模块5553和部署模块5554,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。
99.将在下文中说明各个模块的功能。
100.在另一些实施例中,本技术实施例提供的会话消息的处理装置可以采用硬件方式实现,作为示例,本技术实施例提供的会话消息的处理装置可以是采用硬件译码处理器形式的处理器,其被编程以执行本技术实施例提供的表情的处理方法,例如,硬件译码处理器形式的处理器可以采用一个或多个应用专用集成电路(asic,application specific integrated circuit)、dsp、可编程逻辑器件(pld,programmable logic device)、复杂可编程逻辑器件(cpld,comp lex programmable logic device)、现场可编程门阵列(fpga,
field-programm able gate array)或其他电子元件。
101.将结合本技术实施例提供的终端的示例性应用和实施,说明本技术实施例提供的应用的部署方法。
102.参见图3,图3是本技术实施例提供的应用的部署方法的流程示意图,将结合图3示出的步骤进行说明。
103.步骤301:终端响应于针对目标应用的部署指令,获取目标应用的描述文件、及目标应用依赖的至少一个组件的描述文件。
104.这里,一个目标应用对应于一个客户端的后台程序,它由至少一个组件构成,这些组件可能又依赖于其它组件。其中,目标应用依赖的至少一个组件包括目标应用直接依赖的组件、及目标应用间接依赖的组件。目标应用直接依赖的组件即为构成该目标应用的组件,目标应用间接依赖的组件即为构成目标应用的组件所依赖的组件。
105.例如,目标应用由组件a和组件d组成,其中,组件a依赖于组件b和组件c,组件d依赖于组件e,组件e又依赖于组件f,那么,目标应用直接依赖的组件为组件a和组件d,目标应用间接依赖的组件为组件b、组件c、组件e、组件f,那么,需要获取目标应用的描述文件和组件a、组件d、组件b、组件c、组件e及组件f的描述文件。
106.需要说明的是,这里的组件包括应用组件和云服务,其中,包括应用组件和云服务,其中,应用组件为完成单一功能的代码和制品,在云平台上部署和运行,为网络上的调用方提供服务;云服务为saas平台或paas平台提供的云服务,包括有名字服务、nosql服务、关系型数据库服务、消息队列、文字识别等,应用组件可以依赖云服务。
107.在实际应用中,目标应用的描述文件、及目标应用依赖的至少一个组件的描述文件由开发人员预先编写好存储在代码库中,在需要对目标应用进行部署时,开发人员触发针对目标应用的部署指令,终端从代码库中获取目标应用的描述文件、及目标应用依赖的至少一个组件的描述文件。
108.这里,针对目标应用的部署指令可以通过部署控件触发,也可以是通过用于部署应用的命令行触发,还可以通过其它方式触发。
109.示例性的,当针对目标应用的部署指令是通过命令行触发时,开发人员通过命令行部署工具输入用于部署目标应用的命令行,如,输入“fef d”。
110.在实际实施时,描述文件对应用或组件进行描述,为了解决依赖组件的自动部署以及相互通讯的问题,本技术对应用和组件进行统一的建模,并规范模型的描述文件。示例性的,本技术的描述文件可以采用yaml格式,字段包括:kind、name、platform、version、deploy、platform、configs、exports、imports、depends、containers。
111.其中,kind用于指示类型,这里的类型包括component、application、xaa s等类型,component表明所描述的对象是一个后台组件;application表明所描述的对象是一个应用程序;xaas表明所描述的对象是一个paas服务或saas服务。name用于指示所描述的对象(应用或组件)的名字。platform用于指示应用组件,通常为cloud。version用于指示所描述的对象的版本号。deployplatform用于指示所描述的对象的部署平台。configs用于定义所描述的对象部署需要的外部参数,即部署参数,如启动参数,包括容器启动需要的环境变量及取值等。exports为导出参数,定义若干个变量,用于存储所描述的对象部署完毕后的返回值;常见的返回值有:内网服务名字和外网接入名字等。imports描述当前组件或应用
所依赖的组件,在部署当前组件或应用之前,需要先部署这些被依赖的应用组件。depends:描述当前应用或组件依赖的云服务。containers:描述所描述的对象包含的容器镜像。
112.作为示例,图4是本技术实施例提供的目标应用的部署界面示意图,参见图4,在要对目标应用进行部署时,开发人员编写目标应用的描述文件401,这里描述文件中包括kind、name、platform、version、deploy等字段。然后,开发人员触发针对目标应用的部署指令,以使终端执行相应的部署任务,这里可以呈现部署的过程402,并在部署完成后呈现部署结果403。
113.步骤302:基于目标应用的描述文件及组件的描述文件,生成目标应用对应的应用实例及各组件对应的组件实例。
114.在实际实施时,由于目标应用依赖于其它组件,应用实例会调用其依赖的其它组件的组件实例,在调用过程中,其会将调用所使用的参数传递至相应的组件实例;以及,对于每个组件,若该组件依赖其它组件,那么该组件实例会调用其依赖的其它组件的组件实例,在调用过程中,需要将调用所使用的参数传递至相应的组件实例。
115.基于此,对于被应用或组件依赖的组件,本技术在生成该组件的组件实例时,不仅需要基于该组件的描述文件,还需要基于依赖于该组件的目标应用和组件的描述文件,从这些描述文件中获取生成组件实例所需的参数,以生成组件实例;而对于目标应用,本技术在生成该目标应用的应用实例时,仅需要基于目标应用的描述文件,便可以获取生成应用实例所需的参数,进而生成应用实例。
116.在一些实施例中,可以通过以下方式生成目标应用对应的应用实例及各组件对应的组件实例:基于目标应用的描述文件,生成目标应用对应的应用对象,并基于组件的描述文件生成各组件对应的组件对象;以应用对象及组件对象为节点,构建对应目标应用的静态拓扑图;其中,静态拓扑图用于描述应用对象与组件对象间的依赖关系、及组件对象间的依赖关系;根据静态拓扑图,生成目标应用对应的应用实例、及各组件对应的组件实例。
117.在实际实施时,基于目标应用的描述文件,可以抽象出一个应用类,将该应用类作为应用对象;以及基于各组件的描述文件,可以抽象出一个组件类,将该组件类作为组件对象,其中,每个组件对应一个组件对象。这里应用对象和组件对象是静态的,不占用进程内存,以应用对象和组件对象为节点、以应用对象与组件对象间的依赖关系、及组件对象间的依赖关系为边,构建静态拓扑图。
118.如此,终端可以基于静态拓扑图,确定应用对象与组件对象间的依赖关系、及组件对象间的依赖关系,进而为应用对象生成对应的应用实例,以及为组件对象生成对应组件实例。
119.在一些实施例中,可以通过以下方式生成目标应用对应的应用对象:创建对应目标应用的空对象;将目标应用的描述文件中的字段记录到对应目标应用的空对象中,以生成目标应用对应的应用对象;可以通过以下方式生成各组件对应的组件对象:创建对应各组件对应的空对象;分别将各组件的描述文件中的字段记录到相应组件的空对象中,以生成组件对应的组件对象。
120.在实际实施时,创建一个对应目标应用的空对象,然后将目标应用的描述文件中的字段作为对象中定义的变量,添加至空对象中,以生成目标应用对应的应用对象;对于每个组件,都创建一个空对象,然后将组件的描述文件中的字段作为对象中定义的遍历,添加
至空对象中,以生成相应组件对应的组件对象。
121.在一些实施例中,可以通过以下方式构建对应目标应用的静态拓扑图,包括:将应用对象及组件对象作为静态拓扑图的节点;根据目标应用的描述文件,获取目标应用直接依赖的第一组件;构建由应用对象,指向第一组件对应的组件对象的边;根据各组件的描述文件,确定存在组件直接依赖的第二组件时,获取组件直接依赖的第二组件;构建由组件对应的组件对象,指向第二组件对应的组件对象的边,以得到对应目标应用的静态拓扑图。
122.在实际实施时,静态拓扑图为有向拓扑图,拓扑图中边的方向即为依赖方向,由依赖方指向被依赖方。描述文件中记载有依赖关系,可以通过描述文件确定描述的对象所依赖的组件,包括依赖的应用组件和云服务,如上述描述文件中的imports字段用于描述所描述的对象依赖的其它应用组件,以及depends字段描述所描述的对象依赖的云服务。
123.在实际应用中,可以采用递归的方式,逐个对描述文件进行解析,以获取目标应用直接依赖的组件,以及各组件直接依赖的组件。这里,目标应用与组件间的依赖关系,和应用对象与组件对象间的依赖关系是一致的;以及组件间的依赖关系与组件对象间的依赖关系是一致的。例如,目标应用直接依赖应用组件a和应用组件d,应用对象直接依赖于应用组件对象a和应用组件对象d。
124.作为示例,图5是本技术实施例提供的静态拓扑图的示意图,参见图5,当根据描述文件,确定目标应用直接依赖应用组件a和应用组件d,应用组件a直接依赖于应用组件b、应用组件c和redis云服务,以及应用组件d直接依赖应用组件c和redis云服务时,可以构建如图5所示的静态拓扑图,如应用对象与应用组件对应a之间存在一条由应用对象指向应用组件对象a的边。
125.在一些实施例中,可以通过以下方式生成目标应用对应的应用实例、及各组件对应的组件实例:采用深度遍历的方式,自上而下对静态拓扑图进行遍历,并在遍历的过程中,根据遍历到的对象生成相应的实例,以得到目标应用对应的应用实例、及各组件对应的组件实例。
126.其中,对象为目标应用对应的应用对象或组件对应的组件对象,相应的,生成的实例为目标应用对应的应用实例或组件对应的组件实例。
127.在实际实施时,根据有向拓扑图的方向,从上而下进行深度遍历,也即从应用对象开始进行遍历。需要说明的是,对于被多个组件对象依赖的组件对象,需要遍历多次,遍历的次数由依赖于该组件对象的组件对象数量确定。
128.例如,参见图5,先对应用对象进行访问,然后访问应用组件对象a和应用组件对象d,接着访问应用组件对象b、应用组件对象c和redis云服务对象。由于应用组件对象b、应用组件对象c和redis云服务不仅被应用组件对象a依赖,还被应用组件对象d依赖,需要对其访问两次。
129.在一些实施例中,可以通过以下方式根据遍历到的对象生成相应的实例:当遍历到的对象为根节点时,创建对应根节点的实例;获取对象携带的针对自身对象的部署参数,将部署参数添加至对应根节点的实例中。
130.这里,当遍历到的对象为根节点时,生成实例所需的参数仅包括该对象携带的针对自身对象的部署参数。根节点通常为静态拓扑图中,不存在任何边指向该节点的节点,如图5中的应用对象。
131.在实际实施时,根节点通常为应用对象,该应用对象通常依赖于其它组件,而未被其它组件依赖,基于此,在生成应用实例时,仅仅需要获取该应用对象自身所携带的部署参数。
132.这里的部署参数指的是在进行部署时所需要的参数,可以通过对象中的config字段中获取,包括指定部署平台需要的参数、指定申请云平台资源需要的参数及取值、指定容器启动需要的环境变量及取值。
133.在实际应用中,为该对象分配唯一实例标识,如实例身份标识号(id,identity document),以《本层对象名》为键(key),以实例标识为值(value)插入哈希(hash)表中,这里的本层对象即为当前对象。然后创建对应当前对象的实例,以实例标识为key,插入hash表中。将当前对象中的部署参数,填到对应当前对象的实例中。
134.在一些实施例中,可以通过以下方式根据遍历到的对象生成相应的实例:当遍历到的对象为非根节点时,创建对应非根节点的实例;获取对象携带的针对自身对象的部署参数、及上层对象传递的针对对象的部署参数;将获取的部署参数添加至对应非根节点的实例中。
135.这里,当遍历到的对象为非根节点时,生成实例所需的参数不仅包括对象携带的针对自身对象的部署参数,还包括由其上层对象传递的部署参数。其中,上层对象为依赖于当前对象的对象,在静态拓扑图中,该对象与当前对象相邻、且该对象与当前对象之间的边指向当前对象。例如,参见图5,当前对象为应用组件对象a时,上层对象为应用对象。
136.在实际实施时,上层对象可以携带针对当前对象的部署参数,然后将其传递给当前对象;或者,上层对象也可以将该上层对象接收到的它的针对当前对象的部署参数传递给当前对象。这里,部署参数的传递过程称为入参传入的过程。
137.在实际应用中,为该对象分配唯一实例标识,以《本层对象名》为key,以实例标识为值value插入哈希(hash)表中,这里的本层对象即为当前对象。然后创建对应当前对象的实例,以实例标识为key,插入hash表中。将当前对象中的部署参数,填到对应当前对象的实例中;以及将上层对象传递的针对当前对象的部署参数,填入对应当前对象的实例中。
138.在一些实施例中,在根据遍历到的对象生成相应的实例之后,当遍历到的对象为根节点时,获取该对象携带的针对其它对象的部署参数,并将其传递至对象的下层对象。这里针对其它对象的部署参数,可以是针对下层对象的部署参数,也可以是针对下层对象的下层对象的部署参数等,也即在静态拓扑图中,任何位于该对象下层的对象的部署参数均可。其中,传递至下层对象的部署参数,用于在生成下层对象对应的实例时添加至下层对象对应的实例中。
139.这里的下层对象为当前对象依赖的对象,在静态拓扑图中,该对象与当前对象相邻、且当前对象与该对象之间的边指向该对象,例如,参见图5,当前对象为应用组件对象a时,下层对象为应用组件对象b、应用组件对象c和redis云服务对象;当前对象为应用对象时,位于其下层的对象包括除应用对象外的所有对象。
140.在实际实施时,下层对象的部署参数的传递形式不同于其它对象的传递形式,如此,下层对象在获取到该部署参数时,能够直接用于生成实例。例如,下层对象的部署参数,以《本层实例id》.《下层对象名》.params为key存储在哈希(hash)表中,除下层参数外的其它对象的部署参数以《本层实例id》.《下层对象名》.pass为key存储在hash中,以实现部署
参数的传递。
141.需要说明的是,本层实例指的是遍历到当前对象时,生成的实例;在实例生成过程中,每个实例对应一个唯一的实例id。如此,在下层对象的部署过程中,可以通过《本层实例id》.《下层对象名》.params查找相应的部署参数。
142.在一些实施例中,在根据遍历到的对象生成相应的实例之后,当遍历到的对象为非根节点时,终端还可以获取上层对象传递的针对下层对象的部署参数,并传递至下层对象;获取对象携带的针对下层对象的部署参数,并传递至对象的下层对象;其中,传递至下层对象的部署参数,用于在生成下层对象对应的实例时添加至下层对象对应的实例中。
143.在实际实施时,当遍历到的对象为非根节点时,判断该对象是否为叶子节点,若该对象也不为叶子节点时,说明存在该对象的下层对象。这里,上层对象传递的针对下层对象的部署参数,已经以《上层实例id》.《本层对象名》.pass为key存储在hash表中,如果这个部署参数是下层对象的部署参数,则将其转换为以《本层实例id》.《下层对象名》.params为key存储在hash中;如果这个部署参数是下层对象的下层对象的部署参数,则将其转换为以《本层实例id》.《下层对象名》.pass为key存储在hash中,以实现部署参数的传递。
144.对于当前对象携带的针对下层对象的部署参数,可以通过如上述的方式进行传递,也即以《本层实例id》.《下层对象名》.params为key存储在哈希(hash)表;对于当前对象携带的针对除下层参数外的其它对象的部署参数以《本层实例id》.《下层对象名》.pass为key存储在hash中,以实现部署参数的传递。
145.在一些实施例中,根据遍历到的对象生成相应的实例之后,方法还包括:当对象携带实例共享组字段时,确定实例共享组字段对应实例共享组中的共享实例;生成对应共享实例的实例标识;其中,共享实例为对象对应的实例与其它实例共同依赖的实例,实例标识,用于在对动态拓扑图进行遍历过程以及生成相应实例的过程中,不再生成共享实例对应对象的实例。
146.在实际实施时,实例共享组字段用于定义共享实例,当存在实例共享组字段时,标识定义了共享实例,例如,实例共享组字段中的定义可以为a依赖的c组件和d依赖的c组件共同依赖一个c实例,可以确定实例共享组字段对应实例共享组的共享实例,如当前对象为a时,共享实例为c实例。当定义了共享实例时,为共享实例预分配实例id,如此,在遍历到共享实例对应的对象时,根据该预分配实例id,查找实例,以判断是否已存在实例,在已存在实例对象时,跳过该对象的遍历,不再生成实例对象。
147.本技术通过当对象携带实例共享组字段时,确定实例共享组字段对应实例共享组的共享实例;生成对应共享实例的实例标识,解决了多个组件共同调用一个组件实例的问题。
148.在实际应用中,预先为共享实例分配好id,并以《本层实例id》.《下层组件名》[.《下层组件名》]*为key将实例id存储在hash中。其中,[]*表示根据实际层次填写如果有一级下层组件,则为.《下层组件名》,如果有两级下层组件,则为.《下层组件名》.《下下层组件名》,如果无下层组建,则无此字符串。
[0149]
以对象为图5中的应用组件对象a为例,这里的key为《组件a的id》.《组件c的组件名》。需要说明的是,应用组件实例a和应用组件实例d同一个组件应用组件实例c,因此,在hash表中会存在两个key:《组件a的id》.《组件c的组件名》和《组件d的id》.《组件c的组件名
》;它们的value都是预分配的组件实例cid。
[0150]
步骤303:以应用实例及组件实例为节点,构建对应目标应用的动态拓扑图。
[0151]
其中,动态拓扑图用于描述应用实例与组件实例间的依赖关系、及组件实例间的依赖关系。在应用的实际部署中,存在同一个组件实例被多个组件实例依赖的情况;也存在同一个组件被部署为多个实例,分别被不同组件实例依赖的情况。图6是本技术实施例提供的动态拓扑图的示意图,参见图5及图6,假设应用组件实例a和应用组件实例d依赖同一个应用组件实例c以及同一个redis云服务实例,但分别依赖不同的应用组件实例b,那么,生成如图6的动态拓扑图。
[0152]
步骤304:基于动态拓扑图,分别对应用实例及各组件实例进行部署,以完成目标应用的部署。
[0153]
在一些实施例中,可以通过摘果算法分别对引用实例及各组件实例进行部署,也即通过以下方式分别对应用实例及各组件实例进行部署:从动态拓扑图的叶子节点开始,从下往上逐层部署各节点对应的实例,实例为应用实例或组件实例。
[0154]
在实际实施时,为遵循实例间的依赖关系,本技术实施例按批部署各实例,也即从动态拓扑图的叶子节点开始,从下往上逐层部署各节点对应的实例,以保证在上层实例部署时,其依赖的下层实例均已部署完成,不会影响上层实例的部署。
[0155]
例如,以图6中的动态拓扑图为例,先对应用组件实例b-i、应用组件实例c、redis服务实例和应用组件实例b-ii进行部署,然后再对应用组件实例a和应用组件d进行部署;最后对应用实例进行部署。
[0156]
在一些实施例中,可以通过以下方式从下往上逐层部署各节点对应的实例:将动态拓扑的叶子节点对应的实例添加至可部署序列;循环执行以下操作,直至可部署序列为空:从可部署序列中取出目标数量的实例进行部署;当目标数量的实例部署完成时,在实例的上层实例中添加标识信息,标识信息用于指示实例已部署完成;根据标识信息确定上层实例依赖的实例已完成部署时,将上层实例添加至可部署序列。
[0157]
在实际应用中,可以在实例部署完成后,在其上层实例中添加标识信息,以标识该实例已完成;对于上层实例,若该上层实例中的标识信息指示该上层实例依赖的所有实例都部署完成,那么说明该上层实例可以被部署了。基于此,可以创建一个可部署序列,处于可部署序列中的实例均为可以被部署的实例,然后从可部署序列中取出实例进行部署。当可部署序列为空,表示所有实例都已部署完成。
[0158]
在一些实施例中,可以通过以下方式从可部署序列中取出目标数量的实例进行部署:从可部署序列中取出目标数量的实例添加至部署序列中;当部署序列中的实例均为组件实例时,对部署序列中的组件实例进行并发部署。
[0159]
这里,多个组件实例可以并发部署,基于此,当部署序列中的实例均为组件实例时,对部署序列中的组件实例进行并发部署;当部署序列中的实例不均为组件实例时,先对部署序列中的组件实例进行并发部署,再对其它实例进行部署。
[0160]
在一些实施例中,当实例为组件实例时,在部署过程中,针对部署序列中的每个目标实例可以通过以下方式实现部署:将目标实例依赖的实例的访问方式添加至目标实例中;根据访问方式,将向指定云平台部署组件实例或申请服务;从目标实例中获取目标实例的访问方式;基于访问方式,将向指定云平台部署组件实例或申请服务。
[0161]
这里的访问方式指的是网服务名字和外网接入名。对于目标实例依赖的实例,该目标实例在部署完成后,会将该目标实例的访问方式存储起来,以供上层实例在部署时使用,例如,可以以《实例id》.《服务名字变量名》为key将服务名字记录在hash中。
[0162]
其中,目标实例在部署完成后,会将其存储起来,当对目标实例的上层实例进行部署时,可以获取存储的目标实例的访问方式,该过程为出参传出的过程,也即将目标实例的访问方式传递给目标实例的上层实例。
[0163]
这里对于目标实例的访问方式,可以以通过exports字段获取,该字段指定了网服务名字和外网接入名。
[0164]
在实际应用中,当所依赖的实例为应用组件实例时,基于访问方式,云平台的openapi部署该组件实例;当所依赖的实例为云服务实例时,向openapi向云平台申请该云服务。
[0165]
相应的,当目标实例为应用组件实例时,基于访问方式,云平台的openapi部署该应用组件实例;当所依赖的实例为云服务实例时,向openapi向云平台申请该云服务。
[0166]
当实例为应用实例,由于application实例由若干component实例和xaas实例组成,其本身并不需要做任何部署和申请操作;因此只需要将其需要暴露给客户的组件实例的访问方式(接入名字),即从hash中以《下层实例id》.《服务名字变量名》为key提取出服务名字,返回给命令行工具即可。
[0167]
应用上述实施例,通过基于目标应用的描述文件生成目标应用对应的应用实例,并基于组件的描述文件生成各组件对应的组件实例;以应用实例及组件实例为节点,构建对应目标应用的动态拓扑图;基于动态拓扑图,分别对应用实例及各组件实例进行部署,以完成目标应用的部署;如此,由于动态拓扑图描述了应用实例与组件实例间的依赖关系、及组件实例间的依赖关系,使得计算机设备能够处理应用实例与组件实例间的依赖关系、及组件实例间的依赖关系,开发人员仅需要触发针对目标应用的部署指令,计算机设备就能够利用动态拓扑图,实现目标应用的自动部署,减少了开发人员的工作量,并提高了应用部署的效率。
[0168]
下面,将说明本技术实施例在一个实际的应用场景中的示例性应用。图7是本技术实施例提供的应用的部署的软件系统架构示意图,参见图7,应用的部署系统包括:命令行工具701、部署服务702、数据库703、容器平台704、paas平台705、saas平台706。
[0169]
命令行工具701,由部署平台提供,供应用部署方使用,输入参数为应用及其包含组件的若干个描述文件;向部署平台下发部署、升级、卸载等命令,向使用者展示命令执行进展及结果。
[0170]
部署服务702,用于实施本技术的后台服务,提前打通与容器平台、paas平台、saas平台的接口;接收命令行工具提交的命令和若干描述文件;根据不同命令的需要,解析描述文件,生成应用与应用组件、应用组件与应用组件、应用组件与云服务的依赖拓扑;按照依赖关系的逆序,将应用组件部署在容器平台,以及向paas平台/saas平台申请云服务;与此同时,将上游预置的部署参数向下传递到指定的组件,将下游组件实例化后的访问参数传递给上游组件。
[0171]
数据库703,用于记录驱动应用部署的主状态机和从状态机,存储应用部署的实例拓扑,以及应用组件部署、云服务申请的流水。
[0172]
容器平台704,指kubernetes容器平台;应用和应用组件部署在容器平台,提供服务。
[0173]
paas平台705/saas平台706,指提供paas/saas服务的公有云;paas/saas服务有名字服务、nosql服务、关系型数据库服务、消息队列、文字识别等等;通常开发人员部署的应用组件会依赖或调用这些服务。
[0174]
这里,为了解决依赖组件的自动部署以及相互通讯的问题,本技术通过规范描述文件来定义应用和组件的模型,开发者按照格式要求编写描述文件,由命令行工具提交给部署平台。
[0175]
下面对本技术的描述文件进行详细说明,本技术的描述文件采用yaml格式,主要字段包括:
[0176]
kind:目前支持component、application、package、xaas等类型。其中,component表明所描述的对象是一个应用组件;application表明所描述的对象是一个应用程序;xaas表明所描述的对象是一个paas/saas服务。
[0177]
name:所描述的对象(应用、应用组件、服务等)的名字。
[0178]
platform:后台组件,通常为cloud。
[0179]
version:所描述的对象的版本号。
[0180]
deployplatform:所描述的对象的部署平台,例如容器平台。
[0181]
configs:定义所描述的对象部署需要的外部参数,具体分三类,分别定义在其下的三个字段中:features、params、envs。
[0182]
其中,features指定部署平台需要的参数,features中的share定义一个实例共享组,例如,a依赖的c组件和d依赖的c组件共享一个c实例;params指定申请云平台资源需要的参数及取值;envs指定容器启动需要的环境变量及取值。
[0183]
exports:定义若干个变量,用于存储组件部署完毕后的返回值;常见的返回值有:内网服务名字和外网接入名字等。
[0184]
imports:描述所描述的对象依赖的其他组件;在部署本组件之前,需要先部署好这些被依赖的组件。
[0185]
depends:描述所描述的对象依赖的云服务。
[0186]
containers:描述所描述的对象包含的容器镜像。
[0187]
也即,本技术定义的描述文件包括描述对象(应用、应用组件等)制品、运维特性、以及资源,如组件制品包括组件的名字、部署的平台、版本号、镜像地址、调用的服务、启动参数;资源包括申请资源的参数以及对外服务的名字;运维特性包括部署的区域、是否开启水平伸缩、日志级别等,其中,运维特性分散在组件和资源的参数中。
[0188]
基于上述软件系统架构及描述文件的说明,下面对本技术实施例提供的应用的部署方法进行说明,图8是本技术实施例提供的应用的部署方法的流程示意图,参见图8,本技术实施例提供的应用的部署方法包括:
[0189]
步骤801:部署服务获取目标应用的描述文件及目标应用依赖的多个组件的描述文件。
[0190]
这里,目标应用及目标应用依赖的多个组件都有自己的描述文件,命令行工具在给部署服务下发部署、升级、降级等命令时,会将这些描述文件打包并下发给部署服务。
[0191]
在实际实施时,在组件开发阶段,开发人员为组件编写描述文件,放在代码仓库根目录下,该描述文件记录了组件的名字、部署的平台、版本号、镜像地址、调用的服务、启动参数、申请资源的参数、对外服务的名字等等。
[0192]
在应用部署阶段,首先,开发人员为目标应用编写描述文件,放在代码仓库根目录下;该描述文件记录了应用的名字、版本号、直接依赖的组、对外服务的名字等。然后,开发人员使用命令行工具,执行一键部署,即输入fef d命令;命令行工具在接收到该命令后,下发针对部署指令及目标应用的描述文件及目标应用依赖的多个组件的描述文件至部署服务,部署服务获取目标应用的描述文件及目标应用依赖的多个组件的描述文件。
[0193]
步骤802:根据描述文件生成相应的对象,并基于生成的对象,构建对应目标应用的静态拓扑图。
[0194]
在实际实施时,部署服务从目标应用的描述文件开始,采用递归的方式,逐个对描述文件进行解析,根据描述文件抽象出类,以生成相应的对象。其中,对象包括应用对象和组件对象,目标应用对应应用对象,每个组件对应一个组件对象,描述文件中的每个字段都记录在对象中。
[0195]
在生成对象后,以生成的对象为节点,以对象间的依赖关系为边,构建对应应用静态拓扑图。这里的依赖关系可以根据描述文件中的imports字段和depends字段确定。参见图5,目标应用直接依赖组件a和组件d,组件a依赖于组件b、组件c和redis云服务,以及组件d依赖组件c和redis云服务。
[0196]
步骤803:自上而下对静态拓扑图进行遍历,为每个对象生成对应的实例,并基于生成的实例,构建对应目标应用的动态拓扑图。
[0197]
这里,动态拓扑图用于描述实例间的依赖关系。在应用的实际部署中,存在同一个组件实例或云服务实例,被多个组件实例依赖的情况,也即多个组件实例共同调用同一组件实例或云服务实例;也存在同一个组件被部署为多个实例,分别被不同组件实例依赖的情况。其中,描述文件中的share字段正是用于定义共享实例,可以通过share字段确定以上两种情况,参见图5,假设应用组件实例a和应用组件实例d依赖同一个应用组件实例c以及同一个redis云服务实例,但分别依赖不同的应用组件实例b,那么,生成如图6所述的动态拓扑图。
[0198]
在实际实施时,图9是本技术实施例提供的动态拓扑图的生成过程示意图,参见图9,本技术实施例中的步骤803可以通过步骤901-步骤9015实现。
[0199]
步骤901:从根节点开始,采用深度遍历的方式对静态拓扑图进行遍历。
[0200]
这里,在遍历过程中,对于有多个上层对象的对象,需要遍历两次,例如,参见图5,对于图5中的应用组件对象b,需要对应用组件对象b遍历两次,也即为应用组件对象a和应用组件对象c创建一个下层组件实例b。
[0201]
步骤902:取下一个对象,若存在下一个对象,执行步骤903;否则,结束流程。
[0202]
步骤903:以[《上层实例id》].《本层对象名》为key,查询实例id,若存在实例id,执行步骤912;否则,执行步骤904。
[0203]
这里,若存在实例id,则表示已生成过实例id,如对于共享实例,在遍历其上层实例时,已经为其预分配了实例id。
[0204]
步骤904:为对象分配唯一实例id,以[《上层实例id》].《本层对象名》为key,插入
hash表中。
[0205]
步骤905:创建对应当前对象的实例,以实例id为key,插入hash表中。
[0206]
步骤906:将本层对象中的部署参数,填到对应本层对象的实例中。
[0207]
步骤907:以[《上层实例id》].《本层对象名》.params为key,从hash表中读取上层对象指定的本层对象的部署参数,填到对应本层对象的实例中。
[0208]
步骤908:判断本层对象是否为叶子节点,若是,执行步骤915;否则执行步骤909。
[0209]
步骤909:将上层对象指定的下层对象的部署参数继续往下传递。
[0210]
这里涉及上层对象、本层对象、下层对象。上层对象指定的下层对象的部署参数,已经以《上层实例id》.《本层对象名》.pass为key存储在hash表中,如果这个部署参数是下层对象的部署参数,则将其转换为以《本层实例id》.《下层对象名》.params为key存储在hash中;如果这个部署参数是下下层对象的部署参数,则将其转换为以《本层实例id》.《下层对象名》.pass为key存储在hash中。
[0211]
步骤910:将本层对象指定的下层对象的部署参数继续往下传递。
[0212]
与步骤909类似,如果这个部署参数是下层组件的部署参数,则将其转换为以《本层实例id》.《下层对象名》.params为key存储在hash表中;如果这个部署参数是下层组件的下层组件的部署参数,则将其转换为以《本层实例id》.《下层对象名》.pass为key存储在hash表中。
[0213]
步骤911:当本层对象中定义了共享实例时,为共享实例预分配实例id。
[0214]
这里,本层对象的描述中可以定义下层组件的共享实例,当定义了共享实例时,需要预先为共享实例分配好id,并以《本层实例id》.《下层组件名》[.《下层组件名》]*为key将实例id存储在hash中。其中,[]*表示根据实际层次填写如果有一级下层组件,则为.《下层组件名》,如果有两级下层组件,则为.《下层组件名》.《下下层组件名》,如果无下层组建,则无此字符串。
[0215]
以本层对象为图4中的组件a为例,这里的key为《组件a的id》.《组件c的组件名》。需要说明的是,组件a实例和组件d实例共享同一个组件c实例,因此,在hash表中会存在两个key:《组件a的id》.《组件c的组件名》和《组件d的id》.《组件c的组件名》;它们的value都是预分配的组件c实例id。
[0216]
步骤912:以实例id为key,查询实例,若存在实例对象,执行步骤913;否则,执行步骤905。
[0217]
步骤913:在实例对象的上层实例列表中新增一个上层实例id。
[0218]
这里,通过新增一个上层实例id,来在本层实例中记录上层实例的id,例如,对于图6中的应用组件实例c,已记录了上层实例“应用组件实例a”,这里再增加一个上层实例id,即应用组件实例d。
[0219]
步骤914:跳过本层对象。
[0220]
步骤915:将对应本层对象的实例添加至可部署序列中。
[0221]
步骤804:从动态拓扑图的叶子节点开始,自下而上逐层对实例进行部署。
[0222]
这里,对于组件实例,将其部署至容器平台,对于云服务实例,向相应的服务平台申请服务。
[0223]
在实际实施时,图10是本技术实施例提供的实例部署的过程示意图,参见图10,本
申请实施例中的步骤804可以通过步骤1001-步骤1007实现。
[0224]
步骤1001:将动态拓扑图的叶子节点对应的实例添加至可部署序列。
[0225]
步骤1002:判断可部署序列是否为空或者超时,若是,结束流程;否则,执行步骤1003。
[0226]
步骤1003:从可部署序列中取出n个实例添加至部署序列中。
[0227]
步骤1004:对部署序列中的实例并发部署。
[0228]
步骤1005:当实例部署完成,在其所有上层实例中标识该实例已部署完成。
[0229]
步骤1006:检查这些上层实例依赖的实例是否都已完成部署。
[0230]
步骤1007:将依赖的实例都已完成部署的上层实例添加至可部署序列。
[0231]
这里,当实例为应用组件(component)实例或云服务(xaas)实例,图11是本技术实施例提供的单个实例部署的流程示意图,参见图11,在部署过程中,针对部署序列中的每个目标实例可以通过步骤1101-步骤1104实现单个实例的部署。
[0232]
步骤1101:将目标实例依赖的实例的访问方式添加至目标实例中。
[0233]
这里,针对目标实例依赖的每个实例,从hash中以《下层实例id》.《服务名字变量名》为key提取出服务名字,存储在目标实例中。
[0234]
步骤1102:将向指定云平台部署组件实例或申请服务。
[0235]
这里,当所依赖的实例为component实例时,基于访问方式,云平台的openapi部署该组件实例;当所依赖的实例为xaas实例时,向openapi向云平台申请该云服务。
[0236]
步骤1103:从目标实例中获取目标实例的访问方式,并基于访问方式,将向指定云平台部署组件实例或申请服务。
[0237]
这里的访问方式可以通过exports字段获取,该字段指定了网服务名字和外网接入名。
[0238]
步骤1104:以《实例id》.《服务名字变量名》为key将服务名字记录在hash中。
[0239]
这里,存储的服务名字会作为上层实例的部署参数,供上层实例在部署时使用。
[0240]
针对应用(application)实例,由于application实例由若干component实例和xaas实例组成,其本身并不需要做任何部署和申请操作;因此只需要将其需要暴露给客户的组件实例的访问方式(接入名字),即从hash中以《下层实例id》.《服务名字变量名》为key提取出服务名字,返回给命令行工具即可。
[0241]
在实际应用中,在目标应用的过程中可以通过用户界面展示部署过程,在在部署完成后,显示部署成功的提示信息。
[0242]
应用本技术上述实施例,能够在分钟级别就可以完成应用的部署,大大提升应用的部署效率,大大减轻开发及运维过程中的工作量。
[0243]
下面继续说明本技术实施例提供的应用的部署装置555的实施为软件模块的示例性结构,在一些实施例中,如图2所示,存储在存储器550的应用的部署装置555中的软件模块可以包括:
[0244]
获取模块5551,用于响应于针对目标应用的部署指令,获取所述目标应用的描述文件、及所述目标应用依赖的至少一个组件的描述文件;
[0245]
生成模块5552,用于基于所述目标应用的描述文件及所述组件的描述文件,生成所述目标应用对应的应用实例及各所述组件对应的组件实例;
[0246]
构建模块5553,用于以所述应用实例及组件实例为节点,构建对应所述目标应用的动态拓扑图;
[0247]
部署模块5554,用于基于所述动态拓扑图,分别对所述应用实例及各所述组件实例进行部署,以完成所述目标应用的部署。
[0248]
在一些实施例中,所述生成模块5552,还用于基于所述目标应用的描述文件,生成所述目标应用对应的应用对象,并基于所述组件的描述文件生成各所述组件对应的组件对象;
[0249]
以所述应用对象及组件对象为节点,构建对应所述目标应用的静态拓扑图;
[0250]
其中,所述静态拓扑图用于描述所述应用对象与所述组件对象间的依赖关系、及所述组件对象间的依赖关系;
[0251]
根据所述静态拓扑图,生成所述目标应用对应的应用实例、及各所述组件对应的组件实例。
[0252]
在一些实施例中,所述生成模块5552,还用于创建对应所述目标应用的空对象;
[0253]
将所述目标应用的描述文件中的字段记录到对应所述目标应用的空对象中,以生成所述目标应用对应的应用对象;
[0254]
创建对应各所述组件对应的空对象;
[0255]
分别将各所述组件的描述文件中的字段记录到相应组件的空对象中,以生成所述目标应用对应的应用对象。
[0256]
在一些实施例中,所述生成模块5552,还用于将所述应用对象及组件对象作为所述静态拓扑图的节点;
[0257]
根据所述目标应用的描述文件,获取所述目标应用直接依赖的第一组件;
[0258]
构建由所述应用对象,指向所述第一组件对应的组件对象的边;
[0259]
根据各所述组件的描述文件,确定存在所述组件直接依赖的第二组件时,获取所述组件直接依赖的第二组件;
[0260]
构建由所述组件对应的组件对象,指向所述第二组件对应的组件对象的边,以得到对应所述目标应用的静态拓扑图。
[0261]
在一些实施例中,所述生成模块5552,还用于采用深度遍历的方式,自上而下对所述静态拓扑图进行遍历,并
[0262]
在遍历的过程中,根据遍历到的对象生成相应的实例,以得到所述目标应用对应的应用实例、及各所述组件对应的组件实例。
[0263]
在一些实施例中,所述生成模块,还用于当遍历到的所述对象为根节点时,创建对应所述根节点的实例;
[0264]
获取所述对象携带的针对自身对象的部署参数,将所述部署参数添加至对应所述根节点的实例中。
[0265]
在一些实施例中,所述生成模块5552,还用于当遍历到的所述对象为非根节点时,创建对应所述非根节点的实例;
[0266]
获取所述对象携带的针对自身对象的部署参数、及上层对象传递的针对所述对象的部署参数;
[0267]
将获取的所述部署参数添加至对应所述非根节点的实例中。
[0268]
在一些实施例中,所述生成模块5552,还用于当遍历到的对象为非根节点时,获取上层对象传递的针对所述对象的下层对象的部署参数,并传递至所述对象的下层对象;
[0269]
获取所述对象携带的针对下层对象的部署参数,并传递至所述对象的下层对象;
[0270]
其中,传递至所述下层对象的部署参数,用于在生成所述下层对象对应的实例时添加至所述下层对象对应的实例中。
[0271]
在一些实施例中,所述生成模块5552,还用于当所述对象携带实例共享组字段时,确定所述实例共享组字段对应实例共享组中的共享实例;
[0272]
生成对应所述共享实例的实例标识;
[0273]
其中,所述共享实例为所述对象对应的实例与其它实例共同依赖的实例,所述实例标识,用于在对所述动态拓扑图进行遍历过程以及生成相应实例的过程中,不再生成所述共享实例对应对象的实例。
[0274]
在一些实施例中,所述部署模块5554,还用于从所述动态拓扑图的叶子节点开始,从下往上逐层部署各节点对应的实例,所述实例为应用实例或组件实例。
[0275]
在一些实施例中,所述部署模块5554,还用于将所述动态拓扑图的叶子节点对应的实例添加至可部署序列;
[0276]
循环执行以下操作,直至所述可部署序列为空:
[0277]
从所述可部署序列中取出目标数量的实例进行部署;
[0278]
当所述目标数量的实例部署完成时,在所述实例的上层实例中添加标识信息,所述标识信息用于指示所述实例已部署完成;
[0279]
根据所述标识信息确定所述上层实例依赖的实例已完成部署时,将所述上层实例添加至所述可部署序列。
[0280]
在一些实施例中,所述部署模块5554,还用于从所述可部署序列中取出目标数量的实例添加至部署序列中;
[0281]
对所述部署序列中的实例进行并发部署。
[0282]
本技术实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行本技术实施例上述的应用的部署方法。
[0283]
本技术实施例提供一种存储有可执行指令的计算机可读存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本技术实施例提供的方法,例如,如图3示出的方法。
[0284]
在一些实施例中,计算机可读存储介质可以是fram、rom、prom、eprom、eeprom、闪存、磁表面存储器、光盘、或cd-rom等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
[0285]
在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
[0286]
作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在
保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(html,hyper text markup language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
[0287]
作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
[0288]
以上所述,仅为本技术的实施例而已,并非用于限定本技术的保护范围。凡在本技术的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本技术的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1