传统Web框架迁移

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 与其说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等。

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
48 4
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
113 3
|
24天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
126 45
|
20天前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP是一种流行的服务器端脚本语言,自诞生以来在Web开发领域占据重要地位。从简单的网页脚本到支持面向对象编程的现代语言,PHP经历了多次重大更新。本文探讨PHP的现代演进历程,重点介绍其在Web开发中的应用及框架创新,如Laravel、Symfony等。这些框架不仅简化了开发流程,还提高了开发效率和安全性。
24 3
|
19天前
|
前端开发 JavaScript 开发工具
从框架到现代Web开发实践
从框架到现代Web开发实践
29 1
|
22天前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP 自发布以来一直在 Web 开发领域占据重要地位,历经多次重大更新,从简单的脚本语言进化为支持面向对象编程的现代语言。本文探讨 PHP 的演进历程,重点介绍其在 Web 开发中的应用及框架创新。自 PHP 5.3 引入命名空间后,PHP 迈向了面向对象编程时代;PHP 7 通过优化内核大幅提升性能;PHP 8 更是带来了属性、刚性类型等新特性。
25 3
|
25天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
36 2
|
2月前
|
前端开发 JavaScript UED
构建现代Web应用:使用React框架打造单页面应用
【10月更文挑战第9天】构建现代Web应用:使用React框架打造单页面应用
|
2月前
|
前端开发 JavaScript 开发者
探索现代Web前端技术:React框架入门
【10月更文挑战第9天】 探索现代Web前端技术:React框架入门
|
2月前
|
NoSQL Java 数据库连接
springBoot:整合其他框架&condition&切换web配置 (五)
本文档介绍了如何在Spring Boot项目中整合JUnit、Redis和MyBatis等框架,并提供了相应的依赖配置示例。同时,还展示了如何通过条件注解实现Bean的条件创建,以及如何切换Web服务器配置,从默认的Tomcat切换到Jetty。
下一篇
无影云桌面