如何将传统 Web 框架迁移部署到 Serverless 架构?
简介: 与其说 Serverless 架构是一个新的概念,不如说它是一种全新的思路,一种新的编程范式。
与其说 Serverless 架构是一个新的概念,不如说它是一种全新的思路,一种新的编程范式。
但是原生的 Serverless 开发框架却非常少。以Web框架为例,目前主流的Web框架“均不支持Serverless模式部署”,因此我们一方面要尝试接触Serverless,一方面又没办法完全放弃传统框架,所以如何将传统框架更简单、更快速、更科学地部署到Serverless架构是一个值得探讨的问题。
请求集成方案
请求集成方案实际上就是把真实的API网关请求直接透传给FaaS平台,而不在中途增加任何转换逻辑。以阿里云函数计算的HTTP函数为例,当想要把传统框架(例如Django、Flask、Express、Next.js等)部署到阿里云函数计算平台,并且体验Serverless架构带来的按量付费、弹性伸缩等红利时,得益于阿里云函数计算的HTTP函数和HTTP触发器,使用者不仅可以快速、简单地将框架部署到阿里云函数计算平台,还可以获得和传统开发一样的体验。
例如以Python的Bottle框架开发一个Bottle项目:
# index.py
import 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.py
import 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.py
from flask import Flask
app = 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 bash
export PORT=9000
npm 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/bash
python3 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支持快速创建和部署的传统框架
语言 |
Node.js |
Python |
PHP |
Java |
其他 |
所支持的框架 |
Express.js |
Flask |
Think PHP |
SpringBoot |
Vue.js |
Egg.js |
FastAPI |
Laravel |
React.js |
||
Nuxt.js |
Django |
Zblog |
Docusaurus |
||
Next.js |
Tornado |
Wordpress |
Hexo |
||
Nest.js |
Web.py |
Discuz |
Vuepress |
||
Thinkjs |
Pyramid |
Metinfo |
|||
Koa.js |
Bottle |
Whatsns |
|||
Connect |
Ecshop |
||||
Hapi |
Typecho |
综上所述,通过阿里云函数计算进行传统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等。
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。
原文链接:https://click.aliyun.com/m/1000361979/
本文为阿里云原创内容,未经允许不得转载。
如何将传统 Web 框架迁移部署到 Serverless 架构?的更多相关文章
- 从使用传统Web框架到切换到Spring Boot后的总结
1.前言 其实我接触 Spring Boot 的时间并不长,所以还算一个初学者,这篇文章也算是我对 Spring Boot 学习以及使用过程中的复盘,如果文章出现描述错误或表达不清晰的地方,欢迎大家在 ...
- [转载] 新兵训练营系列课程——平台服务部署及Web框架
原文: http://weibo.com/p/1001643875679132642345 大纲 微博平台主要负责微博基础功能.接下来将会介绍 平台的作用,以及服务提供的形式 平台Web服务的部署 平 ...
- Django 2.0 学习(15):Web框架
Web框架的本质 对于学习Python的同学,相信对Flask.Django.Web.py等不会陌生,这些都是Python语言的web框架.那么问题来了,web服务器是什么?它和web框架有什么关系? ...
- Ubuntu16.04采用FastCGI方式部署Flask web框架
1 部署nginx 1.1 安装nginx服务 root@desktop:~# apt-get install nginx -y 1.2 验证nginx服务是否启动 root@des ...
- python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...
- Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...
- Go语言使用场景 | go语言与其它开源语言比较 | Go WEB框架选型
一.Go语言使用场景 1. 关于go语言 2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新 ...
- Python超级明星WEB框架Flask
Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug和模 ...
- 构建现代Web应用时究竟是选择传统web应用还是SPA
在大前端盛行的今天,似乎前后端分离的开发模式才是大势所趋,而SPA的概念更是应运而生.现在随便构建一个web应用程序如果你不是使用SPA的话,就会感觉有点low,但是真的是这样吗?今天这篇文章我们就来 ...
- 教程:Visual Studio 中的 Django Web 框架入门
教程:Visual Studio 中的 Django Web 框架入门 Django 是高级 Python 框架,用于快速.安全及可扩展的 Web 开发. 本教程将在 Visual Studio 提供 ...
随机推荐
- stm32 串口DMA调试总结和反思
一 引言 最近在调试stm32的多串口.没想到居然遇到那么多的问题.这里做一个总结,还是非常有必要的. 二 问题 这里先弄清楚几个问题. 1 串口有必要使用DMA吗? DMA可以在串口高速的时候不占用 ...
- Web service是什么? (转载)
转载自 : Web service是什么?- 阮一峰的网络日志 作者: 阮一峰 日期: 2009年8月26日 我认为,下一代互联网软件将建立在Web service(也就是"云") ...
- js使用typeof与instanceof相结合编写一个判断常见变量类型的函数
/** * 常见类型判断 * @param {any} param */ function getParamType(param) { // 先判断是否能用typeof 直接判断 let types1 ...
- 01.Android之基础组件问题
目录介绍 1.0.0.1 说下Activity的生命周期?屏幕旋转时生命周期?异常条件会调用什么方法? 1.0.0.2 后台的Activity被系统回收怎么办?说一下onSaveInstanceSta ...
- vue3.0 demo代码记录
最近在研究vue3.0,这里给大家分享下找到的介绍, 以下内容转载于:https://blog.csdn.net/baidu_31108777/article/details/114880810?op ...
- 记录--对于$off,Exclude 和 Extract的一点理解
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.typescript 高阶类型 Exclude 和 Extract Exclude<T, U> TypeScript 2. ...
- read IEEE Standard for verilog(1)
IEEE Standard for Verilog Hardware Description Language 英语说明阅读,首先看导读.目录.摘要等内容. 摘要: 1 Abstract: The V ...
- #树状数组#洛谷 3531 [POI2012] LIT-Letters
题目 给出两个长度相同且由大写英文字母组成的字符串\(A\).\(B\),保证\(A\)和\(B\)中每种字母出现的次数相同. 现在每次可以交换\(A\)中相邻两个字符,求最少需要交换多少次可以使得\ ...
- Maven的build生命周期和常用plugin
目录 简介 lifecycle和Phases Phases和Goals 常用plugin介绍 maven-dependency-plugin maven-jar-plugin 总结 简介 Maven和 ...
- 【直播回顾】如何成为一名优秀的OpenHamrony贡献者?
5月18日晚上19点,战"码"先锋第一期直播<如何成为一名优秀的OpenHamrony 贡献者?>,在OpenHarmony社群内成功举行. 本期课程,由润和资深软件开 ...