当前位置: 首页 > 后端技术 > Python

如何将传统的Web框架迁移和部署到Serverless架构?

时间:2023-03-26 14:55:53 Python

与其说Serverless架构是一个新概念,不如说它是一种新的思维方式,一种新的编程范式。但是,原生的无服务器开发框架非常少。以web框架为例,目前主流的web框架“不支持serverless模式部署”,所以我们一方面要尝试接触serverless,另一方面又没有办法完全摒弃传统框架,那么如何让传统框架更简单、更快速、更科学地部署到Serverless架构是一个值得探讨的问题。请求集成方案请求集成方案其实就是将真正的API网关请求直接传递给FaaS平台,中间不加任何转换逻辑。以阿里云函数计算的HTTP功能为例,当你要部署传统框架(如Django、Flask、Express、Next.js等)时,当涉及到伸缩性等红利时,感谢阿里云函数Compute的HTTP函数和HTTP触发器,用户不仅可以快速方便地将框架部署到阿里云函数计算平台,还可以获得与传统开发相同的体验。例如,使用Python的Bottle框架开发一个Bottle项目:#index.pyimportbottle@bottle.route('/hello/')defindex(name):return"Helloworld"if__name__=='__main__':bottle.run(host='localhost',port=8080,debug=True)后,可以直接在本地调试。当你要将项目部署到阿里云函数计算平台时,只需要添加一个default_app对象:app=bottle.default_app()整个项目的代码如下:#index.pyimportbottle@bottle.route('/hello/')defindex(name):return"Helloworld"app=bottle.default_app()if__name__=='__main__':bottle.run(host='localhost',port=8080,debug=True)如果在阿里云函数计算平台创建函数,入口函数设置为index.app。除了Bottle框架外,其他web框架的操作方法类似,以Flask为例:#index.pyfromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello_world():return'Hello,World!'if__name__=='__main__':app.run(host="0.0.0.0",port=int("8001"))创建函数时,将入口函数设置为index.app即可确保Flask项目在函数计算平台上运行。当然,除了使用已有的语言Runtime(指特定语言的运行时,如Python3运行时,Node.js12运行时),我们还可以考虑使用CustomRuntime和CustomContainer来实现,比如经过一个Web项目完成后,可以写一个Bootstrap文件(在Bootstrap文件中写一些启动命令)。比如启动一个Express项目,准备好Express项目后,可以直接创建一个Bootstrap文件,在文件中配置启动命令:#!/usr/bin/envbashexportPORT=9000npmrunstar阿里云函数计算也提供了更简单的web框架迁移方案。如图所示为阿里云函数计算页面传统Web框架迁移功能示例。阿里云函数计算页面传统Web框架迁移功能选择对应的环境后,只需上传代码并进行简单配置,即可将传统Web框架迁移至阿里云函数计算平台。如果通过开发者工具部署,以ServerlessDevs为例,先创建index.py:#-*-coding:utf-8-*-frombottleimportroute,run@route('/')defhello():return“你好世界!”run(host='0.0.0.0',debug=False,port=9000)然后编写资源和行为描述文件:edition:1.0.0name:framework#Projectnameaccess:"default"#SecretKeyaliasservices:framework:#业务名称/模块名称component:fc#Componentnameactions:pre-deploy:#Runbeforedeployment-run:pip3install-rrequirements.txt-t.#命令行运行路径:./code#命令行运行路径props:#组件属性取值区域:cn-beijingservice:name:web-frameworkdescription:'ServerlessDevsWebFramework服务'功能:名称:瓶描述:'无服务器开发Web框架瓶功能'codeUri:'./code'运行时:python3处理程序:index.app超时:60触发器:-名称:httpTrigger类型:http配置:authType:匿名methods:-GETcustomDomains:-domainName:autoprotocol:HTTProuteConfigs:-path:'/*'同时提供对应的Bootstrap文件,即启动文件:#!/bin/bashpython3index.py之后完成后,执行deploy命令进行部署:sdeploy部署结果如图。无服务器开发人员部署Bottle框架。根据返回的URL可以看到部署结果的预览,如下图。ServerlessDevs部署结果预览通过ServerlessDevs开发者工具,我们不仅可以简单部署传统Web框架,还可以在Serverless架构下快速初始化传统Web框架。以Express项目为例,只需要通过ServerlessDevs开发者工具执行如下代码,即可初始化Express.js项目。sinitstart-express的初始化过程如图所示。此时,你只需要进入项目,执行以下代码即可快速部署项目。sdeploy通过ServerlessDevs初始化Express项目部署结果如图。打开系统分配的地址,可以看到通过ServerlessDevs开发者工具初始化的Express项目。效果如下图所示。Express项目完成效果演示当然,目前的ServerlessDevs开发者工具不仅支持Express项目的快速初始化(见表格),还支持包括Django、Flask在内的数十种传统框架的快速创建和部署和SpringBoot。Table--ServerlessDevs支持快速创建和部署传统框架语言Node.jsPythonPHPJava其他支持的框架 Express.js Flask ThinkPHP SpringBoot Vue.js Egg.jsFastAPI Laravel React.js Nuxt.js Django Zblog Docusaurus Next.js Tornado♂Wordpress?Hex.js Web.py Discuz Vuepress Thinkjs♂Pyramid Metinfo Koa.js Bottle♂WhatsnsEConnect?Hapi Typecho综上所述,通过阿里云函数计算部署和迁移传统的Web框架非常方便,而且得益于HTTP函数和HTTP触发器,整个过程的侵入性非常低。当然,在阿里云上部署传统的Web框架有很多选择。ProgrammingLanguageRuntime:只需要编写函数入口即可。自定义运行时:只需编写Bootstrap。自定义容器:直接按照规范上传图片文件即可。也有多种部署方式,如下。直接在控制台中创建函数。在应用中心创建一个Web应用。利用开发人员工具。其他解决方案与阿里云的HTTP函数和HTTP触发器相比,其他FaaS平台需要使用API??网关和转换层来实现传统Web框架向FaaS平台的部署。如图所示,以PythonWeb框架为例,一般情况下,在使用Flask等框架时,其实需要经过WebServer才能进入下一个环节,而云函数就是这样一个函数不需要启动WebServer,直接调用wsgi_app方法即可。传统WSGIWebServer工作原理举例这里的environ是处理完event/context后的对象,也就是所谓的转换层要做的工作;start_response可以看作是一种特殊的数据结构,比如response结构形式。当然,转换工作在某些情况下还是比较麻烦的,所以很多时候我们可以使用常用的开发者工具来部署传统的Web框架,比如开源的开发者工具ServerlessDevs、ServerlessFramework等。