写点什么

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

作者:Serverless Devs
  • 2022-12-09
    浙江
  • 本文字数:3015 字

    阅读完需:约 10 分钟

与其说 Serverless 架构是一个新的概念,不如说它是一种全新的思路,一种新的编程范式。


但是原生的 Serverless 开发框架却非常少。以 Web 框架为例,目前主流的 Web 框架“均不支持 Serverless 模式部署”,因此我们一方面要尝试接触 Serverless,一方面又没办法完全放弃传统框架,所以如何将传统框架更简单、更快速、更科学地部署到 Serverless 架构是一个值得探讨的问题。

请求集成方案

请求集成方案实际上就是把真实的 API 网关请求直接透传给 FaaS 平台,而不在中途增加任何转换逻辑。以阿里云函数计算的 HTTP 函数为例,当想要把传统框架(例如 Django、Flask、Express、Next.js 等)部署到阿里云函数计算平台,并且体验 Serverless 架构带来的按量付费、弹性伸缩等红利时,得益于阿里云函数计算的 HTTP 函数和 HTTP 触发器,使用者不仅可以快速、简单地将框架部署到阿里云函数计算平台,还可以获得和传统开发一样的体验。


例如以 Python 的 Bottle 框架开发一个 Bottle 项目:


# index.pyimport bottle
@bottle.route('/hello/<name>')def index(name): return "Hello world"
if __name__ == '__main__': bottle.run(host='localhost', port=8080, debug=True)
复制代码


之后,可以直接在本地进行调试。当想要把该项目部署到阿里云函数计算平台时,只需要增加一个 default_app 的对象即可:


app = bottle.default_app()
复制代码


整个项目的代码如下所示:


# index.pyimport bottle
@bottle.route('/hello/<name>')def index(name): return "Hello world"app = bottle.default_app()if __name__ == '__main__': bottle.run(host='localhost', port=8080, debug=True)
复制代码


若在阿里云函数计算平台创建函数,将入口函数设置为 index.app 即可。除了 Bottle 框架之外,其他 Web 框架的操作方法是类似的,再以 Flask 为例:


# index.pyfrom flask import Flaskapp = Flask(__name__)
@app.route('/')def hello_world(): return 'Hello, World!'
if __name__ == '__main__': app.run( host="0.0.0.0", port=int("8001"))
复制代码


在创建函数的时候设置入口函数为 index.app,就可以保证该 Flask 项目运行在函数计算平台上。


当然,除了使用已有的语言化 Runtime(指具体语言的运行时,例如 Python3 运行时、Node. js12 运行时),我们还可以考虑使用 Custom Runtime 和 Custom Container 来实现,例如,一个 Web 项目完成之后,可以编写一个 Bootstrap 文件(在 Bootstrap 文件中写一些启动命令)。


例如要启动一个 Express 项目,把 Express 项目准备完成之后,可以直接创建 Bootstrap 文件,并将启动命令配置到该文件中:


#!/usr/bin/env bashexport PORT=9000npm run star
复制代码


阿里云函数计算还提供了更简单的 Web 框架迁移方案。如图所示是阿里云函数计算页面传统 Web 框架迁移功能示例。



阿里云函数计算页面传统 Web 框架迁移功能


选择对应的环境之后,只需要上传代码,做好简单的配置,即可让传统的 Web 框架迁移至阿里云函数计算平台。


如果通过开发者工具进行部署,以 Serverless Devs 为例,首先创建 index.py:


# -*- coding: utf-8 -*-from bottle import route, run
@route('/')def hello(): return "Hello World!"
run(host='0.0.0.0', debug=False, port=9000)
复制代码


然后编写资源和行为描述文件:


edition: 1.0.0 name: framework                                                       #项目名称access: "default"                                                     #密钥别名
services: framework: #业务名称/模块名称 component: fc #组件名称 actions: pre-deploy: #在部署之前运行 - run: pip3 install -r requirements.txt -t . #要运行的命令行 path: ./code #命令行运行的路径 props: #组件的属性值 region: cn-beijing service: name: web-framework description: 'Serverless Devs Web Framework Service' function: name: bottle description: 'Serverless Devs Web Framework Bottle Function' codeUri: './code' runtime: python3 handler: index.app timeout: 60 triggers: - name: httpTrigger type: http config: authType: anonymous methods: - GET customDomains: - domainName: auto protocol: HTTP routeConfigs: - path: '/*'
复制代码


同时,提供对应的 Bootstrap 文件,即启动文件:


#!/bin/bashpython3 index.py
复制代码


完成之后,执行 deploy 指令进行部署:


s deploy
复制代码


部署结果如图所示。



Serverless Devs 部署 Bottle 框架过程


根据返回的网址,可以看到部署结果预览,如下图所示。



Serverless Devs 部署结果预览


通过 Serverless Devs 开发者工具,我们不仅可以简单地进行传统 Web 框架的部署,还可以快速在 Serverless 架构下进行传统 Web 框架的初始化。以 Express 项目为例,只需要通过 Serverless Devs 开发者工具执行如下代码即可进行 Express.js 项目的初始化。


s init start-express
复制代码


初始化的过程如图所示。此时,只需要进入该项目执行如下代码即可快速进行项目的部署。


s deploy
复制代码



通过 Serverless Devs 初始化 Express 项目


部署结果如图所示。



打开系统分配的地址,可以看到通过 Serverless Devs 开发者工具初始化的 Express 项目,效果展示如下图所示。



Express 项目完成效果展示


当然,目前 Serverless Devs 开发者工具不仅支持 Express 项目的快速初始化(见表),还支持包括 Django、Flask、SpringBoot 等数十个传统框架的快速创建与部署。


表格--Serverless Devs 支持快速创建和部署的传统框架



综上所述,通过阿里云函数计算进行传统 Web 框架的部署和迁移是很方便的,并且得益于 HTTP 函数与 HTTP 触发器,整个过程侵入性非常低。当然,将传统 Web 框架部署到阿里云上的可选方案也比较多。


  • 编程语言化的 Runtime:只需要写好函数入口即可。

  • Custom Runtime:只需要写好 Bootstrap 即可。

  • Custom Container:直接按照规范上传镜像文件即可。


部署途径也是多种多样的,具体如下。


  • 直接在控制台创建函数。

  • 在应用中心处创建 Web 应用。

  • 利用开发者工具。

其它方案

相对于阿里云的 HTTP 函数以及 HTTP 触发器,其它 FaaS 平台则需要借助 API 网关以及一个转换层来实现传统 Web 框架到 FaaS 平台的部署。


如图所示,以 Python Web 框架为例,在通常情况下,使用 Flask 等框架时实际上要通过 Web Server 才能进入下一个环节,而云函数是一个函数,本不需要启动 Web Server,所以可以直接调用 wsgi_app 方法。



传统 WSGI Web Server 工作原理示例


这里的 environ 就是对 event/context 等处理后的对象,也就是所说的转换层要做的工作;start_response 可以认为是一种特殊的数据结构,例如 response 结构形态等。


当然,转换工作在某些情况下还是比较麻烦的,所以很多时候我们可以借助常见的开发者工具进行传统 Web 框架的部署,例如借助开源的开发者工具 Serverless Devs、Serverless Framework 等。

用户头像

All in Serverless 2018-09-12 加入

更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。

评论

发布
暂无评论
如何将传统 Web 框架迁移部署到 Serverless 架构?_Python_Serverless Devs_InfoQ写作社区