开发者社区> Serverless小助手> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

如何将传统 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框架迁移功能示例。

image

阿里云函数计算页面传统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

部署结果如图所示。

image

Serverless Devs部署Bottle框架过程

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

image

Serverless Devs部署结果预览

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

s init start-express

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

s deploy

image

通过Serverless Devs初始化Express项目

部署结果如图所示。

image

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

image

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方法。

image

传统WSGI Web Server工作原理示例

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

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


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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《人人都玩开心网:Ext JS+Android+SSH整合开发Web与移动SNS》销售排名第4,发篇ExtJS的文章(拖放树结点)庆祝下
    《人人都玩开心网:Ext JS+Android+SSH整合开发Web与移动SNS》一书上架短短几天,就进入了互动网计算机类销售总排名第4的好成绩(见下图)。
1088 0
Web Services开发——RESTEasy 2.0
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/5756609 Web Services开发——RESTEasy 2.0 原创:chszs版权所有 RESTEasy是JBoss(RedHat)公司的开源Web Services开发框架,基于Java、基于REST架构,是JAX-RS规范的最佳实现之一。
799 0
WEB开发面试题
1.HTML的全称:   2.HTML的结构:   3.常用标签:                   4.CSS的全称: 5.
771 0
Web 开发与设计语言大盘点
在这个 Web 的时代,与 Web 相关的开发技术持续热门,从前端到后端,从标记语言到开发语言,各种技术交相辉映,沉沉浮浮,作为开发者,尤其是初级开发者,如何选择几门适合自己的开发语言尤为重要。本文是对所有 Web 相关开发语言的一次盘点,并指出其中最有前途的开发与设计语言。
1089 0
Web 开发与设计之 Google 兵器谱
Google 的使命是 Web,在 Google 眼中,未来的一切应用都将 Web 化,一直以来,Google 为 Web 开发与设计者推出了大量免费工具,让他们更好地创建,维护,改善他们的 Web 站点,这些工具包含了开发,分析,维护,修补等等用途,本文将介绍15款这样的工具。
1003 0
艾伟_转载:VS 2010 和 .NET 4.0 系列之《代码优化的Web开发Profile》篇
本系列文章导航 VS 2010 和 .NET 4.0 系列之《ASP.NET 4 中的SEO改进 》篇 VS 2010 和 .NET 4.0 系列之《干净的Web.Config文件 》篇 VS 2010 和 .
1101 0
艾伟_转载:ASP.NET开发中关于Web标准的几点建议
  Visual Studio.NET从2003到现在的2008,一路走来慢慢强大……从以前的vs2003能自动改乱你的html代码到现在在vs2008中都能直接对html代码进行w3c标准验证并提示了,非常不易。
810 0
一起谈.NET技术,VS 2010 和 .NET 4.0 系列之《代码优化的Web开发Profile》篇
本系列文章导航 VS 2010 和 .NET 4.0 系列之《ASP.NET 4 中的SEO改进 》篇 VS 2010 和 .NET 4.0 系列之《干净的Web.Config文件 》篇 VS 2010 和 .
961 0
mobl:针对移动Web开发的DSL
  简介   现在,针对移动设备像智能手机和平板电脑的应用开发很流行。Apple公司的AppStore(针对iPhone、iPod和iPad)拥有超过350,000种应用,而Android的marketplace也快速追赶上来,现在已经拥有超过200,000种应用。
977 0
LAMP仍然是Web开发最流行的选择吗?
LearnComputer网站上曾发表过一篇文章《Is LAMP Still a Popular Choice for Web Development?》,分析了新Web开发平台不断出现,犹如一个个闪亮的明星,不断吸引着Web开发人员的眼球。
1234 0
+关注
Serverless小助手
遨游在技术的海洋~
文章
问答
来源圈子
更多
专注 Serverless、微服务、函数计算、Serverless 应用引擎、云原生技术
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
云开发Serverless架构服务
立即下载
Serverless 下函数应用架构升级
立即下载
容器与Serverless架构实践
立即下载