首页> 中国专利> 系统平台架构、函数发布方法及装置、平台及存储介质

系统平台架构、函数发布方法及装置、平台及存储介质

摘要

本发明实施例公开了系统平台架构、函数发布方法及装置、平台及存储介质,所述方法包括:接收函数发布请求;根据所述函数发布请求,确定待发布的目标函数的运行环境;根据所述目标函数的运行环境的镜像文件,启动函数服务容器;基于所述函数服务容器继续发布所述目标函数。

著录项

  • 公开/公告号CN114816445A

    专利类型发明专利

  • 公开/公告日2022-07-29

    原文格式PDF

  • 申请/专利号CN202110129777.8

  • 发明设计人 李剑锋;

    申请日2021-01-29

  • 分类号G06F8/61(2018.01);G06F9/455(2006.01);

  • 代理机构北京派特恩知识产权代理有限公司 11270;北京派特恩知识产权代理有限公司 11270;

  • 代理人李娟;张颖玲

  • 地址 215163 江苏省苏州市高新区昆仑山路58号1幢中移软件园

  • 入库时间 2023-06-19 16:11:11

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-08-16

    实质审查的生效 IPC(主分类):G06F 8/61 专利申请号:2021101297778 申请日:20210129

    实质审查的生效

说明书

技术领域

本发明涉及云计算技术领域,尤其涉及系统平台架构、函数发布方法及装置、平台及存储介质。

背景技术

云计算改变了我们对操作系统的认知,原来一个系统的计算资源、存储和网络是可以分离配置的,而且还可以弹性扩展,但是长久以来,在开发应用时始终没有摆脱服务器的束缚,应用必须运行在服务器上(不论是实体还是虚拟的),并且必须经过部署、配置、初始化才可以运行,还需要对服务器和应用进行监控和管理,同时需要保证数据的安全性。

无论是选择公有云还是自建的数据中心,都会面临服务器数量预估、存储容量规划和数据库的选型等问题。同时需要在基础设施之上部署依赖软件,以运行应用程序。FaaS(Functions as a Service)函数即服务,FaaS是无服务器计算的一种形式。与服务器端软件不同的是,应用程序部署到拥有操作系统的虚拟机或者容器中,一般需要长时间驻留在操作系统中运行,而FaaS是直接将程序部署上到平台上即可,当有事件到来时触发执行,没有请求访问后会自动销毁后台程序,不占用平台硬件资源。

发明内容

有鉴于此,本发明实施例期望提供一种函数发布方法及装置、平台及计算机存储介质。

第一方面,本发明实施例提供了一种系统平台架构,包括:

代码仓库,用于存储函数代码;

数据库;

容器镜像仓库,用于存储至少一种代码语言对应的运行环境,其中,所述运行环境包括镜像文件;

云平台,分别与所述代码仓库、数据库和容器镜像仓库连接,用于基于接收的待发布的目标函数的函数发布请求,将所述目标函数的函数代码上传至所述代码仓库;将所述函数发布请求携带的发布信息上传至所述数据库;以及,根据所述目标函数的运行环境的镜像文件,启动函数服务容器,发布所述目标函数。

在一个实施例中,所述函数服务容器为一种服务承载容器。

在一个实施例中,所述函数服务容器为:加载有所述镜像文件的所述服务承载容器。

在一个实施例中,所述云平台为Serverless平台。

在一个实施例中,所述镜像文件,为从容器镜像仓库获取的所述代码语言对应的源镜像,所述源镜像包括所述代码语言对应的开发工具包。

第二方面,本发明实施例提供了一种函数发布方法,包括:

接收函数发布请求;

根据所述函数发布请求,确定待发布的目标函数的运行环境;

根据所述目标函数的运行环境的镜像文件,启动函数服务容器;

基于所述函数服务容器继续发布所述目标函数。

在一个实施例中,所述根据所述目标函数的运行环境的镜像文件,启动函数服务容器,包括:

创建服务承载容器;

将所述镜像文件,添加到所述服务承载容器内得到启动后的所述函数服务容器。

在一个实施例中,所述根据所述函数发布请求,确定待发布的目标函数的运行环境,包括:根据所述发布请求携带的发布信息,确定所述目标函数的运行环境对应的环境变量的值;

所述方法还包括:

将所述环境变量的值,赋值给所述函数服务容器内的所述镜像文件对应的所述环境变量。

在一个实施例中,所述方法还包括:

根据所述函数发布请求携带的发布信息,确定所述目标函数的函数代码的存储地址;

从所述存储地址拉取所述函数代码,其中,所述函数代码,用于添加到所述函数服务容器中。

在一个实施例中,所述存储地址存储在所述目标函数的部署文件中。

在一个实施例中,所述根据所述函数发布请求,确定待发布的目标函数的运行环境,包括:

根据所述函数发布请求所指定的代码语言的语言信息,确定所述目标函数的运行环境,所述语言信息至少包括:语言类型。

在一个实施例中,所述语言信息还包括:版本信息。

第三方面,本发明实施例提供了一种函数发布装置,包括:

接收单元,用于接收函数发布请求;

确定单元,用于根据所述函数发布请求,确定待发布的目标函数的运行环境;

启动单元,用于根据所述目标函数的运行环境的镜像文件,启动函数服务容器;

发布单元,用于基于所述函数服务容器继续发布所述目标函数。

第四方面,本发明实施例提供了一种平台,所述平台包括:处理器、存储器和通信总线;

所述通信总线,用于实现所述处理器和所述存储器之间的通信连接;

所述处理器用于执行所述存储器中存储的函数计算程序,以实现上述任一项提供的方法。

第五方面,本发明实施例提供了一种计算机存储介质,所述计算机存储介质存储有计算机可执行指令;所述计算机可执行指令被执行后,能够实现上述任一项提供的方法。

本发明实施例的函数发布方法根据接收的函数发布请求,确定待发布的目标函数的运行环境;并根据目标函数的运行环境的镜像文件,启动函数服务容器;最终,基于所述函数服务容器继续发布目标函数。本发明实施例的函数发布方法以容器技术为载体,基于预先设置的镜像文件将目标函数运行所需要的完整的依赖环境快速重现出来,进而在该运行依赖环境下启动函数服务容器,实现目标函数在容器中快速部署发布。

附图说明

图1为本发明实施例提供的函数发布装置的系统架构示意图;

图2为本发明实施例提供的第一种函数发布方法的流程示意图;

图3为本发明实施例提供的镜像文件加载流程示意图;

图4为本发明实施例提供的第二种函数发布方法的流程示意图;

图5为本发明实施例提供的第三种函数发布方法的流程示意图;

图6为本发明实施例提供的第四种函数发布方法的流程示意图;

图7为本发明实施例提供的函数发布装置的结构示意图;

图8为本发明实施例提供的第五种函数发布方法的流程示意图;

图9为本发明实施例函数服务容器的功能结构示意图。

具体实施方式

以下结合说明书附图及具体实施例对本发明的技术方案做进一步的详细阐述。

本发明实施例提供的函数发布方法,基于容器技术实现目标函数的快速部署发布。

如图1所示,本发明实施例的一种系统平台架构,包括:

代码仓库,用于存储函数代码;

数据库;

容器镜像仓库,用于存储至少一种代码语言对应的运行环境,其中,所述运行环境包括镜像文件;

云平台,分别与所述代码仓库、数据库和容器镜像仓库连接,用于基于接收的待发布的目标函数的函数发布请求,将所述目标函数的函数代码上传至所述代码仓库;将所述函数发布请求携带的发布信息上传至所述数据库;以及,根据所述目标函数的运行环境的镜像文件,启动函数服务容器,发布所述目标函数。

这里,Serverless平台的平台架构中,包括代码管理模块、函数管控模块、网关服务模块等。同时,Serverless平台与代码仓库、数据库、容器镜像仓库对接。其中,容器镜像仓库用于存储预先开发好的多个语言的镜像文件,包括但不限于python镜像文件、nodejs镜像文件、golang镜像文件和java镜像文件,容器镜像仓库通常可由registry或harbor搭建;数据库由开源数据库MYSQL提供,用于存储代码相关配置,以及函数发布信息;函数运行集群通常由kubernetes搭建,并部署knative提供底层的Serverless原生服务;此外,统一服务网关可由gloo部署搭建,用于将访问目标函数的触发事件转发到指定的函数服务。

在一些实施例中,所述函数服务容器为一种服务承载容器。

在一些实施例中,所述函数服务容器为:加载有所述镜像文件的所述服务承载容器。

在一些实施例中,所述云平台为Serverless平台。

在一些实施例中,所述镜像文件,为从容器镜像仓库获取的所述代码语言对应的源镜像,所述源镜像包括所述代码语言对应的开发工具包。

如图2所示,本发明实施例的一种函数发布方法,包括:

步骤S101:接收函数发布请求;

步骤S102:根据所述函数发布请求,确定待发布的目标函数的运行环境;

步骤S104:根据所述目标函数的运行环境的镜像文件,启动函数服务容器;

步骤S107:基于所述函数服务容器继续发布所述目标函数。

在本实施例中,在云平台进行目标函数的开发,例如,编写目标函数的函数代码或更新目标函数的函数代码,开发完成后,无需直接与代码仓库交互,而是由Serverless平台的代码管理模块将函数代码上传到代码仓库。

在本实施例中,以Serverless平台为例进行具体说明。Serverless平台接收到函数发布请求后,Serverless平台中的代码管理模块解析函数发布请求中携带的发布信息,发布信息包括函数代码文件或压缩包、上传的代码仓库地址、语言信息、函数入口信息、函数运行时信息、代码语言版本信息、函数名称、函数调用入口和/或函数上下文信息等,并将函数代码上传到函数发布请求指定的代码仓库中,以及将目标函数的相关元数据,如函数入口文件信息、函数入口名称、函数运行时信息等保存到数据库中。

在本实施例中,目标函数的运行环境包括目标函数运行所需要的完整的运行依赖环境,以不同语言编码的目标函数对应不同的运行环境。例如,以python编码的目标函数采用python相应的运行环境,以nodejs编码的目标函数采用nodejs相应的运行环境,以golang编码的目标函数采用golang相应的运行环境,以java编码的目标函数采用java相应的运行环境。

在本实施例中,运行环境包括镜像文件,在任何一台机器上,只需要解压打包好的镜像文件,即可将目标函数所需要的完整的运行依赖环境重现出来。

镜像文件预先存储在镜像仓库中,例如,镜像仓库中预先存储有与python对应的python镜像文件、与nodejs对应的nodejs镜像文件、与golang对应的golang镜像文件和与java对应的java镜像文件。

这里,如图3所示,对于不同的语言运行环境进行具体描述:

针对python语言环境,由于python是一种解释性语言,代码无需编译即可运行,为了提高运行速度,在制作镜像文件的时候,首先将基础服务的代码server.py编译成server.pyc文件;镜像文件制作的基础镜像为docker社区的python源镜像,其中包括的常用的python库以及pip工具包。在目标函数运行时,首先通过python server.pyc启动基础服务。在基础服务中,通过MOD_NAME=index.py和FUNC_HANDLER=handler环境变量指定函数调用入口,基础服务中通过imp.load_source动态加载目标函数index.py,并通过getattr方法获取目标函数调用入口handler实现对目标函数的热加载。

针对nodejs语言环境,由于nodejs是一种解释性语言,代码同样无需编译即可运行,为了提高运行速度,在制作镜像文件的时候,首先将基础服务代码server.js编译成可执行文件server。且制作镜像文件时,选取docker社区开源的nodejs镜像作为基础镜像,该镜像中包含了nodejs常用的开发工具包以及npm工具。在目标函数运行时,直接通过执行server文件启动基础服务,在基础服务中,通过MOD_NAME=index.js和FUNC_HANDLER=handler环境变量指定函数调用入口,基础服务中通过mod=require(“index.js”)的方式加载目标函数,并通过mod[FUNC_HANDLER]的方式对目标函数进行热加载。针对golang语言环境,由于golang是一种编译性语言,无法直接运行代码。因此,在函数代码开发完成后,需要预先将函数代码index.go编译成插件index.so文件上传到Serverless平台。制作镜像文件时,选取docker社区开源的golang镜像作为基础镜像,该镜像中包含了golang常用的开发工具包。容器启动时,首先拉取目标函数插件index.so文件,并和基础服务server.go文件进行联合编译,编译成可执行文件server。最后通过执行server文件的方式启动函数服务。其中,server.go中,通过plug=plugin.Open(“index.so”)的方式实现目标函数的加载,且通过plug.Lookup(FUNC_HANDLER)的方式实现目标函数入口的调用。

针对java语言环境,由于java是一种编译性语言,无法执行运行代码。因此,在函数代码开发完成后,需要预先将函数代码index.java编译成index.jar包,上传到Serverless平台。制作镜像文件时,选取docker社区开源的openjdk镜像作为基础镜像,该镜像中包含了java程序基础的工具包。同时需要预先将基础服务server.java编译成jar包预置到镜像中指定的执行路径中。在容器启动时,通过MOD_NAME=index.jar和FUNC_HANDLER=handler来指定函数的调用入口,基础服务中通过loadJar(“index.jar”)动态加载目标函数文件,且通过Class.forName动态加载目标函数的调用入口handler。

具体地,在函数代码上传成功后,由Serverless平台中的函数管控模块确定目标函数的运行环境,具体过程如下:

首先,从数据库中读取发布信息,该发布信息可包括语言信息、函数名称、函数调用入口、函数上下文信息。

然后,根据语言信息,从数据库预置镜像映射表中解析出目标函数运行时所需的镜像文件;根据函数调用入口和上下文信息,解析出发布目标函数所需的硬件配置、环境变量等信息。

在本实施例中,在确定待发布的目标函数的运行环境后,根据目标函数的运行环境的镜像文件,启动函数服务容器。

例如,将所有的函数发布信息封装成函数部署文件,指定函数服务容器启动时拉取的镜像文件,封装完成函数部署文件后,函数管控模块继续调用底层部署集群,通过kubernetes和knative的API接口下发函数部署文件,底层部署集群接收到函数部署文件后,通过运行函数服务容器对目标函数进行发布。

本发明实施例的函数发布方法以容器技术为载体,基于镜像文件自动启动容器服务,实现目标函数在容器中快速部署发布。而且,该函数发布方法还可打包成容器镜像,一键自动化部署,也可基于容器集群进行大规模部署。同时,容器镜像没有环境依赖,可在任意环境部署运行。

本发明实施例预置的镜像文件预装了不同代码语言的函数构建、发布的所有依赖,并预先实现了Serverless平台通用的功能模块,启动函数服务容器后,在函数服务容器中自动拉取目标函数的函数代码、加载函数代码,并发布目标函数,而无需编写完整的程序,也无需安装程序编译运行环境,即可实现函数的秒级发布。

在一些实施例中,如图4所示,上述步骤S104:根据所述目标函数的运行环境的镜像文件,启动函数服务容器,包括:

步骤S1041:创建服务承载容器;

步骤S1042:将所述镜像文件,添加到所述服务承载容器内得到启动后的所述函数服务容器。

本实施例中,服务承载容器用于在启动函数服务容器之前完成函数服务容器所需的预置条件。Serverless平台接收到函数发布请求时,触发服务启动流程,根据函数部署文件,创建服务承载容器。如图9所述,服务承载容器包括:预启动单元、函数代码加载单元、基础服务启动单元、函数热加载单元。

其中,预启动单元用于提供环境检测功能。在Serverless平台启动函数服务容器时,进行函数服务容器内部的环境检测及函数服务容器基础环境的自检,例如,网络配置检查、网卡连通状态、cpu内存健康状态和/或环境变量解析等。环境变量解析主要解析出函数运行所需的关键环境变量,例如,函数代码仓库地址、函数代码仓库分支、函数启动文件名、函数调用入口、函数入口名称、函数运行时上下文等。

函数代码加载单元用于提供代码拉取功能。在函数服务容器预启动后,首先对代码仓库信息进行校验,确认代码仓库中的函数代码正常后,根据环境变量中的代码仓库地址,自动从指定代码仓库中拉取目标函数的函数代码到指定文件夹中。

基础服务单元用于提供函数发布基础服务,预置在镜像文件的目标执行路径中。当目标函数代码被拉取后,根据不同的代码语言,自动启动基础服务,基础服务通过http的方式对外提供服务。

例如,在启动函数服务容器时,在函数代码成功拉取后,基础服务单元根据不用代码语言的启动特性,启动基础服务,这里,基础服务通过web实现,可接受http请求。

基础服务启动后,根据环境变量中配置好的函数调用入口,根据当前函数服务容器环境预设的语言版本对函数代码进行热加载。具体的加载根据流程语言版本而定,这里,函数服务容器环境预设的语言版本包括python语言、nodejs语言、golang语言、java语言等。

具体地,根据不同的语言环境,基础服务启动方式不同。例如,针对python语言,基础服务预先编译成pyc文件,通过python*.pyc命令启动基础服务,基础服务中通过imp.load_source()方法动态加载目标函数;针对nodejs语言,先将基础服务预先编译成可执行文件,通过node server命令运行服务,基础服务中通过require方式动态加载目标函数;针对golang语言,需要将函数代码和依赖预先打包为插件的形式,上传到Serverless平台,基础服务加载函数插件,联合编译成可执行文件,最终执行服务;针对java语言,需要将函数代码和依赖打包成jar包,基础服务中动态加载函数jar包。

在一些实施例中,在启动函数服务容器时,基础服务可自动加载函数代码,并对函数代码的语法进行检测,如果函数代码编写错误,可通过http返回错误信息。

创建服务承载容器后,将镜像文件,添加到服务承载容器内得到启动后的函数服务容器。

具体地,从容器镜像仓库拉取的相应的镜像文件,添加到服务承载容器内得到启动后的函数服务容器。

在一些实施例中,如图5所示,上述步骤S102:根据所述函数发布请求,确定待发布的目标函数的运行环境,包括:

步骤S102′:根据所述发布请求携带的发布信息,确定所述目标函数的运行环境对应的环境变量的值;

所述方法还包括:

步骤S103:将所述环境变量的值,赋值给所述函数服务容器内的所述镜像文件对应的所述环境变量。

在本实施例中,Serverless平台中函数管控模块获取函数发布请求创建函数服务容器,函数服务容器创建时,从数据库中获取环境变量的值,如目标函数对应的代码仓库地址、函数调用入口、函数上下文信息等,并将这些信息的值赋值给函数服务容器的环境变量。

在一些实施例中,将发布信息中的参数封装为部署文件,根据部署文件的参数的值,赋值给所述函数服务容器内的所述镜像文件对应的所述环境变量。

具体地,Serverless平台接受函数发布请求,并从函数发布请求中解析出发布信息,将发布信息中的各项参数封装部署文件,部署文件中根据该函数发布的指定语言版本,指定平台预设好的镜像文件,并通过部署文件启动函数服务。

在一些实施例中,如图6所示,所述方法还包括:

步骤S105:根据所述函数发布请求携带的发布信息,确定所述目标函数的函数代码的存储地址;

步骤S106:从所述存储地址拉取所述函数代码,其中,所述函数代码,用于添加到所述函数服务容器中。

在本实施例中,接收到的函数发布请求携带的发布信息包括代码仓库地址,根据该代码仓库地址,这里,代码仓库地址即为函数代码的存储地址;在函数服务容器预启动后,从指定代码仓库中拉取目标函数的函数代码到函数服务容器中。

在一些实施例中,所述存储地址存储在所述目标函数的部署文件中。

这里,将代码仓库地址作为环境变量(存储地址)封装在部署文件中。在函数服务容器预启动后,从部署文件中解析获得该环境变量的值。

在一些实施例中,上述步骤S102:根据所述函数发布请求,确定待发布的目标函数的运行环境,包括:

根据所述函数发布请求所指定的代码语言的语言信息,确定所述目标函数的运行环境,所述语言信息至少包括:语言类型。

这里,容器镜像仓库存储有预先开发好的多个语言的镜像文件,根据函数发布请求所指定的代码语言的语言类型,确定对应的目标函数的运行环境的镜像文件,例如,语言类型为python语言,则确定运行环境采用python镜像文件,语言类型为nodejs语言,则确定运行环境采用nodejs镜像文件,语言类型为golang语言,则确定运行环境采用golang镜像文件;语言类型为java语言,则确定运行环境采用java镜像文件。

在一些实施例中,所述语言信息还包括:版本信息。

这里,在容器镜像仓库中,针对每一种语言类型,至少对应存储有一个版本信息的镜像文件。例如,针对java语言,在容器镜像仓库中存储有JDK 1.0版本java镜像文件、J2SE1.2版本java镜像文件和Java SE 10版本java镜像文件。当然,根据实际应用的需要,在容器镜像仓库中可预先存储所需语言类型的指定版本的镜像文件。

在一些实施例中,基础服务单元提供的函数发布基础服务,还支持获取context上下文环境、日志查询、容错机制和函数调用监控等功能,以更好地与Serverless平台对接。

具体地,基础服务支持通过context获取函数执行环境的上下文信息,例如,函数名称、语言版本、配置内存、日志库等。这里,可通过context获取函数运行的上下文信息,例如,通过context.getFunctionName()获取函数名称;通过context.getFunctionMemory()获取运行内存配置;通过context.getLogger()获取日志库等。

基础服务还支持日志查询功能。通常,基于在目标函数中进行的相关控制台输入输出操作,以及日志打印操作,所输出的信息被统一封装成指定的格式输出,编译和Serverless平台的日志模块对接,从而可以在Serverless平台的日志查询中,检索到函数的调用和调试日志。这里,基础服务对系统的输出输出进行拦截,并缓存到指定内存中,并通过统一的logger模块将控制台输出,如print的内容,通过制定格式输出到日志输出中。

基础服务还支持容错机制。编写完成的目标函数通常存在着代码编写错误,常见的包括语法错误、和变量声明错误等,基础服务开发容错机制,当检测到目标函数代码错误的时候,需要捕捉常用错误类型,当触发目标函数执行的时候,通过http方式返回代码错误。这里,针对目标函数代码中编写的问题,如语法错误等,在加载目标函数的过程中不会报错中断,而是会直接捕获,并通过函数调用返回的方式告诉客户端。

基础服务还支持函数调用监控功能。通常在目标函数调用的过程中,调用往往是一瞬间的操作,监控平台无法精确的获取当前函数调用所消耗的硬件资源,如CPU内存消耗等。基础服务通过单独的内存监控进程对函数调用进行监控:当目标函数计算超出了指定的内存配置时,主动中断目标函数运行并进行提示;同时针对一些耗时过长的函数调用,提供超时控制功能,防止目标函数调用时间过长,大量耗费系统资源,防止内存泄露。

在一些实施例中,发布后的目标函数会获得唯一的内部服务地址,函数管控模块将函数内部服务地址注册到集群的统一网关服务中。通过访问集群的统一网关,并通过制定的目标函数标志,触发目标函数服务执行。当一段时间没有事件触发目标函数,Serverless平台会停掉函数服务容器;一旦有事件触发目标函数,Serverless平台会重新启动函数服务容器。

在本实施例中,Serverless平台可基于kubernetes和knative实现底层容器的编排部署,统一网关入口可基于gloo实现,并可根据请求量动态的进行后端容器实例的扩缩容。

本发明实施例还提供一种函数发布装置10,如图7所示,包括:

接收单元110,用于接收函数发布请求;

确定单元120,用于根据所述函数发布请求,确定待发布的目标函数的运行环境;

启动单元130,用于根据所述目标函数的运行环境的镜像文件,启动函数服务容器;

发布单元140,用于基于所述函数服务容器继续发布所述目标函数。

在一些实施例中,所述启动单元130,包括:

第一单元,用于创建服务承载容器;

第二单元,用于将所述镜像文件,添加到所述服务承载容器内得到启动后的所述函数服务容器。

在一些实施例中,所述确定单元120,包括:

第三单元,用于根据所述发布请求携带的发布信息,确定所述目标函数的运行环境对应的环境变量的值;

在一些实施例中,所述函数发布装置10还包括:

第四单元,用于将所述环境变量的值,赋值给所述函数服务容器内的所述镜像文件对应的所述环境变量。

在一些实施例中,所述函数发布装置10还包括:

第五单元,用于根据所述函数发布请求携带的发布信息,确定所述目标函数的函数代码的存储地址;

第六单元,用于从所述存储地址拉取所述函数代码,其中,所述函数代码,用于添加到所述函数服务容器中。

在一些实施例中,所述存储地址存储在所述目标函数的部署文件中。

在一些实施例中,所述确定单元120,包括:

第七单元,用于根据所述函数发布请求所指定的代码语言的语言信息,确定所述目标函数的运行环境,所述语言信息至少包括:语言类型。

在一些实施例中,所述语言信息还包括:版本信息。

本发明实施例还提供一种平台,该平台包括:处理器、存储器和通信总线;

所述通信总线,用于实现所述处理器和所述存储器之间的通信连接;

所述处理器用于执行所述存储器中存储的函数计算程序,以实现前述一个或多个技术方案提供的函数发布方法。

本发明实施例还提供一种计算机存储介质,该计算机存储介质存储有计算机可执行指令;所述计算机可执行指令被处理器执行后,能够实现前述一个或多个技术方案提供的函数发布方法。

所述计算机存储介质可为:移动存储设备、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质等存储介质,可选为非瞬间存储介质。

以下,以一个具体示例对本发明实施例函数发布方法及装置进行说明:

如图1所示,函数发布装置包括:Serverless平台和多语言函数镜像文件,其中Serverless平台包括代码管理模块、函数控制模块、网关服务模块;其中容器镜像文件包括python镜像文件、nodejs镜像文件、golang镜像文件、java镜像文件。

本发明实施例提供的函数发布方法,适用于典型的Serverless平台,其平台架构如图1所示。本发明实施例中的Serverless平台,包括了代码管理模块、函数管控模块、网关服务模块等,同时,Serverless平台对接了代码仓库、SQL数据库、容器镜像仓库。

其中,代码仓库通常可由gitlab、github等仓库搭建,用于存储函数代码。用户无需直接与代码仓库交互,而是将开发的代码提交到Serverless平台,由Serverless平台的代码管理模块将函数代码上传到代码仓库;数据库可由开源数据库MYSQL提供,用于存储代码相关配置,以及函数发布信息;容器镜像仓库用于预先存储开发好的多语言容器镜像文件,包括python镜像文件、nodejs镜像文件、golang镜像文件、java镜像文件,镜像仓库通常可由registry或harbor搭建。同时函数运行集群通常有kubernetes搭建,并部署knative提供底层的Serverless原生服务。此外,图中所示统一服务网关,可由gloo部署搭建,用于将访问函数的触发事件转发到指定的函数服务。

基于上述系统架构图,图8展示了本发明实施例所提出的一种基于Serverless平台的函数发布方法。具体包括以下步骤:

在Serverless平台进行目标函数开发,开发完成后,通过Serverless平台上传函数代码。

Serverless平台中的代码管理模块接受函数发布请求,解析发布请求中的代码语言版本信息、函数名称、函数调用入口、函数上下文信息。首先将函数代码存储到代码仓库中,并将目标函数在代码仓库中的信息存储到数据库中。

代码上传成功后,由Serverless平台中的函数管控模块进行目标函数发布。首先从数据库中读取函数发布信息,包括函数语言版本、函数名称、函数调用入口、函数上下文信息。

函数管控模块根据函数语言版本,从数据库预置镜像对照表中解析出函数运行时所需的基础镜像;根据函数名称确定函数在代码仓库中的拉取地址;根据函数调用入口和上下文信息,解析出发布函数所需的硬件配置、环境变量等信息。最后将所有的函数发布信息封装成函数部署文件。

封装完成函数部署文件后,函数管控模块继续调用底层部署集群,通过kubernetes和knative的API接口下发函数部署文件。底层部署集群接收到函数发布文件制定后,通过运行容器对函数进行发布。

发布后的目标函数会获得唯一的内部服务地址,函数管控模块将函数内部服务地址注册到集群的统一网关服务中,通过访问集群的统一网关,并通过制定的函数标志,触发函数服务执行。当一段时间没有事件触发函数,Serverless平台会停掉函数服务容器。一旦有事件触发函数,Serverless平台会重新启动函数服务容器。

函数服务容器是函数计算的核心装置,如图9所示,主要包括了以下单元模块,预启动单元、函数代码加载单元、基础服务启动单元、函数热加载单元。

其中,预启动单元,在Serverless平台启动容器时,首先进行容器内部的环境监测、包括网络配置检查、环境变量解析等。主要解析出函数运行所需的关键环境变量,包括函数代码仓库地址、函数调用入口、函数运行时上下文等。

函数代码加载单元,为预先开发的代码拉取功能,在容器预启动后,根据环境变量中的函数代码仓库地址,将目标函数代码拉取到指定目录。并对代码格式进行校验。

基础服务单元为装置预先开发好的函数计算基础服务,根据不同的代码语言开发,预置到容器镜像的目标执行路径中。当目标函数代码被拉取后,自动启动基础服务,基础服务通过http的方式对外提供服务。

基础服务启动后,首先根据环境变量中配置好的目标函数调用入口,根据当前容器环境预设的语言版本,通过特定的方式实现对目标函数代码的热加载。具体的加载流程语言版本而定。

如图3所示,为函数发布方法中涉及的不同语言预置镜像的设计方法,下面针对不同的语言环境进行具体描述:

针对python环境,由于python是一种解释性语言,代码无需编译即可运行,为了提高运行速度,在制作镜像的时候,首先将基础服务的代码server.py编译成server.pyc文件。镜像制作的基础镜像为docker社区的python源镜像,其中包括的常用的python库以及pip工具包。函数运行时,首先通过python server.pyc启动基础服务。在基础服务中,通过MOD_NAME=index.py和FUNC_HANDLER=handler环境变量指定函数调用入口,基础服务中通过imp.load_source动态加载目标函数文件index.py,并通过getattr方法获取目标函数调用入口handler实现对目标函数的热加载。

针对nodejs环境,由于nodejs是一种解释性语言,代码同样无需编译即可运行,为了提高运行速度,在制作镜像的时候,首先将基础服务代码server.js编译成可执行文件server。且制作镜像时,选取docker社区开源的nodejs镜像作为基础镜像,该镜像中包含了nodejs常用的开发工具包以及npm工具。函数运行时,直接通过执行server文件启动基础服务,在基础服务中,通过MOD_NAME=index.js和FUNC_HANDLER=handler环境变量指定函数调用入口,基础服务中通过mod=require(“index.js”)的方式加载目标函数文件,并通过mod[FUNC_HANDLER]的方式对函数进行热加载。

针对golang环境,由于golang是一种编译性语言,无法直接运行代码。因此,在函数代码开发完成后,需要预先将函数代码index.go编译成插件index.so文件上传到Serverless平台。制作镜像时,选取docker社区开源的golang镜像作为基础镜像,该镜像中包含了golang常用的开发工具包。容器启动时,首先拉取目标函数插件index.so文件,并和基础服务server.go文件进行联合编译,编译成可执行文件server。最后通过执行server文件的方式启动函数服务。其中,server.go中,通过plug=plugin.Open(“index.so”)的方式实现目标函数文件的加载,且通过plug.Lookup(FUNC_HANDLER)的方式实现目标函数入口的调用。

针对java环境,由于java是一种编译性语言,无法执行运行代码。因此,在函数代码开发完成后,需要预先将函数代码index.java编译成index.jar包,上传到Serverless平台。制作镜像时,选取docker社区开源的openjdk镜像作为基础镜像,该镜像中包含了java程序基础的工具包。同时需要预先将基础服务server.java编译成jar包预置到镜像中指定的执行路径中。在容器启动时,通过MOD_NAME=index.jar和FUNC_HANDLER=handler来指定函数的调用入口,基础服务中通过loadJar(“index.jar”)动态加载目标函数文件,且通过Class.forName动态加载目标函数的调用入口handler。

在本发明实施例中,函数计算装置中的基础服务通过http服务的方式提供外部访问,并将访问流量通过函数调用的方式转到目标函数中。最后将目标函数运行接口通过http返回给调用方。

通常,在Serverless平台中,函数发布不仅仅是简单的目标函数调用。基础服务需要具备一系列附加功能,才能更好的与Serverless平台进行对接。主要包括了如下功能:

通常,在开发函数时,镜像需要获取到当前函数运行的上下文信息,主要包括当前函数名、运行内存配置、调用时间、日志库等功能。因此基础服务需要提供context上下文环境,在函数中可直接通过context获取上述信息,如通过context.getFunctionName()获取函数名称;通过context.getFunctionMemory()获取函数配置内存;通过context.getLogger()获取日志库等。

在函数中进行的相关控制台输入输出操作,以及日志打印操作。所输出的信息需要被统一封装成指定的格式输出。编译和Serverless平台的日志模块对接,可以在Serverless平台的日志查询中,检索到函数的调用和调试日志。因此基础服务需要对容器环境的输出输出进行拦截,并缓存到指定内存中,并通过统一的logger模块将控制台输出,如print的内容,通过制定格式输出到日志输出中。

通常,编写的函数总是存在着代码编写错误,常见的包括语法错误、和变量声明错误等。当目标函数编写错误的时候,不能影响主服务的运行,因此基础服务需要额外开发容错机制,当检测到目标函数代码错误的时候,需要捕捉常用错误类型。当触发函数执行的时候,通过http方式返回代码错误。

通常在函数调用的过程中,调用往往是一瞬间的操作,目前的监控平台无法精确的获取当前函数调用所消耗的硬件资源,如CPU内存消耗等。因此基础服务需要通过单独的内存监控进程对函数调用进行监控。当函数计算超出了指定的内存配置时,主动中断函数运行,并进行提示。同时针对,一些耗时过长的函数调用,需要提供超时控制功能,防止函数调用时间过长,大量耗费系统资源。

在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些端口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。

上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元,即可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。

另外,在本发明各实施例中的各功能单元可以全部集成在一个处理模块中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号