写点什么

Serverless 架构下传统框架迁移方案与策略

作者:刘宇
  • 2021 年 12 月 15 日
  • 本文字数:3082 字

    阅读完需:约 10 分钟

Serverless架构下传统框架迁移方案与策略

与其说 Serverless 架构是一个新的概念/架构,倒不如说他是一个全新的思路,一种新的编程范式,在这种新的架构下,或者说新的编程范式下,使用全新的思路来做 Serverless 应用是再好不过的了,但是实际上并不是这样的,原生的 Serverless 开发框架是非常少的,以 Web 框架为例,目前的主流的 Web 框架“均不支持 Serverless 模式部署”,一方面是要尝试接触 Serverless,一方面又没办法完全放弃传统框架,所以将传统框架如果更简单、更快速、更科学地部署到 Serverless 架构上就是一个值得探讨的问题。

传统框架迁移案例

请求集成方案实际上就是把真实的 API 网关请求,直接透传给 FaaS 平台,而不在中途增加任何转换逻辑,以阿里云函数计算的 HTTP 函数为例,当想要把传统框架(例如 Django,Flask,Express,Next.js 等)部署到阿里云函数计算平台上,并且体验 Serverless 带来的按量付费,弹性伸缩等红利时,得益于阿里云函数计算的 HTTP 函数和 HTTP 触发器,使用者不仅可以快速、简单地将框架部署到阿里云函数计算,更可以保持和传统开发一样的体验。以 Python 的 Bottle 框架为例,当开发一个 Bottle 项目之后:


# index.pypimport 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.pyimport 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.pyfrom flask import Flaskapp = 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 bashexport PORT=9000npm run star
复制代码

通过开发者工具快速迁移/部署

如果通过开发者工具进行传统框架的支持,可以直接通过 Serverless Devs 的命令,进行案例的项目的创建。目前 Serverless Devs 已经支持以下框架:


详情可以参考:https://github.com/devsapp/start-web-framework


以 Express 项目为例,可以在命令行工具执行:


s init start-express
复制代码


即可进行项目的初始化:


     _____                                 |  ___|                                | |____  ___ __  _ __ ___  ___ ___     |  __\ \/ / '_ \| '__/ _ \/ __/ __|    | |___>  <| |_) | | |  __/\__ \__ \    \____/_/\_\ .__/|_|  \___||___/___/              | |                                    |_|                                                              ? please select credential alias default
Welcome to the start-express application This application requires to open these services: FC : https://fc.console.aliyun.com/ Express development docs: https://www.expressjs.com.cn/4x/api.html
* 额外说明:s.yaml中声明了actions: 部署前执行:npm install --production 如果遇到npm命令找不到等问题,可以适当进行手动项目构建,并根据需要取消actions内容 * 项目初始化完成,您可以直接进入项目目录下,并使用 s deploy 进行项目部署

🏄‍ Thanks for using Serverless-Devs👉 You could [cd /Users/jiangyu/Desktop/fc-custom-lua-event/image-prediction-app/start-express] and enjoy your serverless journey!🧭️ If you need help for this example, you can use [s -h] after you enter folder.💞 Document ❤ Star:https://github.com/Serverless-Devs/Serverless-Devs
复制代码


完成之后,可以进入项目进行项目的部署:


$ s deploy

framework: region: cn-beijing service: name: web-framework function: name: express runtime: custom handler: index.handler memorySize: 128 timeout: 60 url: system_url: https://1583208943291465.cn-beijing.fc.aliyuncs.com/2016-08-15/proxy/web-framework/express/ custom_domain: - domain: http://express.web-framework.1583208943291465.cn-beijing.fc.devsapp.net triggers: - type: http name: httpTrigger
复制代码


此时可以通过浏览器打开页面:



此时,可以根据案例提供的bootstrap以及s.yaml进行参考,并将自身的项目部署/迁移到阿里云 Serverless 架构。其中bootstrap为:


#!/bin/bash
node index.js
复制代码


其中s.yaml为:


# ------------------------------------#   欢迎您使用阿里云函数计算 FC 组件进行项目开发#   组件仓库地址/帮助文档:https://github.com/devsapp/fc#   Yaml参考文档:https://github.com/devsapp/fc/blob/jiangyu-docs/docs/zh/yaml.md#   关于:#      - Serverless Devs和FC组件的关系、如何声明/部署多个函数、超过50M的代码包如何部署#      - 关于.fcignore使用方法、工具中.s目录是做什么、函数进行build操作之后如何处理build的产物#   等问题,可以参考文档:https://github.com/devsapp/fc/blob/jiangyu-docs/docs/zh/tips.md#   关于如何做CICD等问题,可以参考:https://github.com/Serverless-Devs/Serverless-Devs/blob/master/docs/zh/cicd.md#   有问题快来钉钉群问一下吧:33947367# ------------------------------------edition: 1.0.0          #  命令行YAML规范版本,遵循语义化版本(Semantic Versioning)规范name: framework         #  项目名称access: "default"       #  秘钥别名
services: framework: # 业务名称/模块名称 component: fc # 组件名称 actions: pre-deploy: # 在deploy之前运行 - run: npm install --production # 要运行的命令行 path: ./code # 命令行运行的路径 props: # 组件的属性值 region: cn-beijing service: name: web-framework description: 'Serverless Devs Web Framework Service' function: name: express description: 'Serverless Devs Web Framework Express Function' codeUri: './code' runtime: custom timeout: 60 caPort: 9000 triggers: - name: httpTrigger type: http config: authType: anonymous methods: - GET customDomains: - domainName: auto protocol: HTTP routeConfigs: - path: '/*'
复制代码


发布于: 4 小时前阅读数: 5
用户头像

刘宇

关注

阿里云Serverless云布道师 2020.01.04 加入

阿里云Serverless产品经理,国防科大在读博士,《Serverless架构》、《Serverless实践》、《人人都能学会的Serverless架构》等书籍作者,Serverless Devs发起人,Anycodes在线编程负责人。

评论

发布
暂无评论
Serverless架构下传统框架迁移方案与策略