简介: 与其说 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 支持快速创建和部署的传统框架

综上所述,通过阿里云函数计算进行传统 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 产品经理
田初东,蚂蚁集团算法工程师
卢萌凯,阿里云 Serverless 高级解决方案架构师
王仁达,阿里云 Serverless 工具链技术负责人

点击此处,直达阿里云函数计算 FC!

本文为阿里云原创内容,未经允许不得转载。

传统 Web 框架部署与迁移的更多相关文章

  1. 从使用传统Web框架到切换到Spring Boot后的总结

    1.前言 其实我接触 Spring Boot 的时间并不长,所以还算一个初学者,这篇文章也算是我对 Spring Boot 学习以及使用过程中的复盘,如果文章出现描述错误或表达不清晰的地方,欢迎大家在 ...

  2. gogin web框架部署学习

    首先去git上面找了一个gin框架拿来学习gin web开发: flipped-aurora/gin-vue-admin: 基于vite+vue3+gin搭建的开发基础平台(已完成setup语法糖版本 ...

  3. [转载] 新兵训练营系列课程——平台服务部署及Web框架

    原文: http://weibo.com/p/1001643875679132642345 大纲 微博平台主要负责微博基础功能.接下来将会介绍 平台的作用,以及服务提供的形式 平台Web服务的部署 平 ...

  4. Ubuntu16.04采用FastCGI方式部署Flask web框架

    1    部署nginx 1.1    安装nginx服务 root@desktop:~# apt-get install nginx -y 1.2    验证nginx服务是否启动 root@des ...

  5. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  6. Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...

  7. Go语言使用场景 | go语言与其它开源语言比较 | Go WEB框架选型

    一.Go语言使用场景 1. 关于go语言 2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新 ...

  8. Python超级明星WEB框架Flask

    Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug和模 ...

  9. 构建现代Web应用时究竟是选择传统web应用还是SPA

    在大前端盛行的今天,似乎前后端分离的开发模式才是大势所趋,而SPA的概念更是应运而生.现在随便构建一个web应用程序如果你不是使用SPA的话,就会感觉有点low,但是真的是这样吗?今天这篇文章我们就来 ...

  10. 教程:Visual Studio 中的 Django Web 框架入门

    教程:Visual Studio 中的 Django Web 框架入门 Django 是高级 Python 框架,用于快速.安全及可扩展的 Web 开发. 本教程将在 Visual Studio 提供 ...

随机推荐

  1. FastWiki v0.1.0发布!新增超多功能

    FastWiki 发布 v0.1.0 https://github.com/239573049/fast-wiki/releases/tag/v0.1.0 更新日志 兼容OpenAI接口格式 删除Bl ...

  2. day01-2-@RequestMapping和Rest

    @RequestMapping和Rest 1.@RequestMapping 1.1基本使用 @RequestMapping注解可以指定 控制器(处理器) 的某个方法的请求url 1.2@Reques ...

  3. Python 潮流周刊第 42 期(摘要)+ 赠书《流畅的Python》6本

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  4. 在LabVIEW中编程运行可执行程序

    以下文字来自于 https://knowledge.ni.com/KnowledgeArticleDetails?id=kA03q000000YGhVCAW&l=en-US 翻译来自于Chat ...

  5. 记录--原生 canvas 如何实现大屏?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 可视化大屏该如何做?有可能一天完成吗?废话不多说,直接看效果,线上 Demo 地址 lxfu1.github.io/large-sc ...

  6. 你的DDPG/RDPG为何不收敛?

    园子好多年没有更过了,草长了不少.上次更还是读博之前,这次再更已是博士毕业2年有余,真是令人唏嘘.盗链我博客的人又见长,身边的师弟也问我挖的几个系列坑什么时候添上.这些着实令我欣喜,看来我写的东西也是 ...

  7. 重返ubuntu世界

    一直对"重返"两个字充满了情怀感,因为会想起小时候看的一本龙珠同人的标题,它就唤作<重回龙珠世界>.最近这五年基本都是在MacOS下工作和学习的,也习惯用MacOS.就 ...

  8. Rust使用Sauron实现Web界面交互

    目录 简介 架构 Application 和组件 简单入门示例 先决条件 创建新项目 编译库文件 引用库文件 运行项目 界面交互示例 创建项目 编译库文件 引用库文件 引用库文件 运行项目 参考资料 ...

  9. 为什么SOTA网络在你的数据集上不行?来看看Imagnet结果的迁移能力研究

     论文通过实验证明,ImageNet上的模型并不总能泛化到其他数据集中,甚至可能是相反的,而模型的深度和宽度也会影响迁移的效果.  如果需要参考,可选择类别数与当前任务相似的数据集上的模型性能.论文通 ...

  10. C++类型双关

    Σ(っ °Д °;)っ #include<iostream> struct Entity { int x, y; int* GetPtr() { return &x; } /*En ...