传统Web框架迁移

本文涉及的产品
简介: 与其说Serverless架构是一个新的概念/架构,倒不如说他是一个全新的思路,一种新的编程范式,在这种新的架构下,或者说新的编程范式下,使用全新的思路来做Serverless应用是再好不过的了,但是实际上并不是这样的,原生的Serverless开发框架是非常少的,以Web框架为例,目前的主流的Web框架“均不支持Serverless模式部署”,一方面是我们要尝试接触Serverless,一方面又没办法完全放弃传统框架,所以将传统框架如果更简单、更快速、更科学的部署到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,我们还可以考虑使用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为例,通过Serverless Devs的一行指令部署一个框架项目:

s init bottle && cd bottle && s deploy

部署结果:

根据返回的网址,可以看到:

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

  • 编程语言化的Runtime:只需要写好函数入口即可
  • Custom Runtime:只需要写好Bootstrap即可
  • Custom Container:直接按照规范上传镜像文件即可

部署途径也是多种多样的:

  • 直接在控制台创建函数部署;
  • 应用中心处创建Web应用;
  • 开发者工具直接部署;

其他方案

相对于阿里云的HTTP函数以及HTTP触发器而言,AWS,华为云,腾讯云等FaaS平台则需要借助API网关以及一个转换层来实现传统框架部署到FaaS平台的过程。

以Python Web框架为例,在通常情况下,我们使用Flask等框架实际上要通过web_server,进入到下一个环节,而云函数更多是一个函数,本不需要启动web server,所以我们就可以直接调用wsgi_app这个方法:

其中这里的environ就是我们需要对event/context等进行处理后的对象,也就是我们所说的转换层要做的工作;start_response可以认为是我们的一种特殊的数据结构,例如我们的response结构形态等。以Flask项目为例,这个转换层实际上是:

import sys

import json

from urllib.parse import urlencode

from flask import Flask

try:

   from cStringIO import StringIO

except ImportError:

   try:

       from StringIO import StringIO

   except ImportError:

       from io import StringIO

from werkzeug.wrappers import BaseRequest

def make_environ(event):

   environ = {}

   for hdr_name, hdr_value in event['headers'].items():

       hdr_name = hdr_name.replace('-', '_').upper()

       if hdr_name in ['CONTENT_TYPE', 'CONTENT_LENGTH']:

           environ[hdr_name] = hdr_value

           continue

       http_hdr_name = 'HTTP_%s' % hdr_name

       environ[http_hdr_name] = hdr_value

   apigateway_qs = event['queryStringParameters']

   request_qs = event['queryString']

   qs = apigateway_qs.copy()

   qs.update(request_qs)

   body = ''

   if 'body' in event:

       body = event['body']

   environ['REQUEST_METHOD'] = event['httpMethod']

   environ['PATH_INFO'] = event['path']

   environ['QUERY_STRING'] = urlencode(qs) if qs else ''

   environ['REMOTE_ADDR'] = 80

   environ['HOST'] = event['headers']['host']

   environ['SCRIPT_NAME'] = ''

   environ['SERVER_PORT'] = 80

   environ['SERVER_PROTOCOL'] = 'HTTP/1.1'

   environ['CONTENT_LENGTH'] = str(len(body))

   environ['wsgi.url_scheme'] = ''

   environ['wsgi.input'] = StringIO(body)

   environ['wsgi.version'] = (1, 0)

   environ['wsgi.errors'] = sys.stderr

   environ['wsgi.multithread'] = False

   environ['wsgi.run_once'] = True

   environ['wsgi.multiprocess'] = False

   BaseRequest(environ)

   return environ

class LambdaResponse(object):

   def __init__(self):

       self.status = None

       self.response_headers = None

   def start_response(self, status, response_headers, exc_info=None):

       self.status = int(status[:3])

       self.response_headers = dict(response_headers)

class FlaskLambda(Flask):

   def __call__(self, event, context):

       if 'httpMethod' not in event:

           return super(FlaskLambda, self).__call__(event, context)

       response = LambdaResponse()

       body = next(self.wsgi_app(

           make_environ(event),

           response.start_response

       ))

       return {

           'statusCode': response.status,

           'headers': response.response_headers,

           'body': body

       }

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

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
28天前
|
缓存 自然语言处理 数据库
构建高效Python Web应用:异步编程与Tornado框架
【5月更文挑战第30天】在追求高性能Web应用开发的时代,异步编程已成为提升响应速度和处理并发请求的关键手段。本文将深入探讨Python世界中的异步编程技术,特别是Tornado框架如何利用非阻塞I/O和事件循环机制来优化Web服务的性能。我们将剖析Tornado的核心组件,并通过实例演示如何构建一个高效的Web服务。
|
9天前
|
关系型数据库 MySQL 数据库
如何使用Python的Flask框架来构建一个简单的Web应用
如何使用Python的Flask框架来构建一个简单的Web应用
21 0
|
1天前
|
JavaScript 前端开发 开发者
Angular框架:企业级Web应用的强大后盾
Angular,谷歌支持的JavaScript框架,因其组件化架构、双向数据绑定、依赖注入和路由系统,成为企业级Web开发首选。组件化促进代码重用,如`AppComponent`示例。双向数据绑定简化DOM操作,减少手动工作。依赖注入通过示例展示易管理依赖,提升测试性。路由则支持SPA开发,平滑页面过渡。Angular的特性增强了开发效率和应用质量,使其在Web开发领域保持领先地位。【6月更文挑战第25天】
10 2
|
2天前
|
前端开发 数据库 开发者
构建高效后端:Django框架在Web开发中的深度解析
**Django框架深度解析摘要** Django,Python的高级Web框架,以其快速开发和简洁设计备受青睐。核心特性包括Model-Template-View架构、ORM、模板引擎和URL路由。通过创建博客应用示例,展示从初始化项目、定义模型、创建视图和URL配置到使用模板的流程,体现Django如何简化开发,提高效率。其强大功能如用户认证、表单处理等,使Django成为复杂Web应用开发的首选。学习Django,提升Web开发效率。【6月更文挑战第24天】
30 1
|
15天前
|
前端开发 JavaScript 测试技术
web前端语言框架:探索现代前端开发的核心架构
web前端语言框架:探索现代前端开发的核心架构
20 4
|
17天前
|
运维 Serverless API
Serverless 应用引擎产品使用合集之如何实现一键迁移Web框架
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1天前
|
前端开发 JavaScript Python
Python之Tornado web 框架详解
Python之Tornado web 框架详解
|
4天前
|
Java API 调度
Web后端Javaee企业级开发之定时任务 Springboot整合任务框架Quartz和Task详解
Web后端Javaee企业级开发之定时任务 Springboot整合任务框架Quartz和Task详解
9 0
|
10天前
|
前端开发 JavaScript 安全
Web前端开发中的三大主流框架
Web前端开发中的三大主流框架
|
21天前
|
前端开发 Python
了解Web框架
了解Web框架