与其说 Serverless 架构是一个新的概念/架构,倒不如说他是一个全新的思路,一种新的编程范式,在这种新的架构下,或者说新的编程范式下,使用全新的思路来做 Serverless 应用是再好不过的了,但是实际上并不是这样的,原生的 Serverless 开发框架是非常少的,以 Web 框架为例,目前的主流的 Web 框架“均不支持 Serverless 模式部署”,一方面是要尝试接触 Serverless,一方面又没办法完全放弃传统框架,所以将传统框架如果更简单、更快速、更科学地部署到 Serverless 架构上就是一个值得探讨的问题。
传统框架迁移案例
请求集成方案实际上就是把真实的 API 网关请求,直接透传给 FaaS 平台,而不在中途增加任何转换逻辑,以阿里云函数计算的 HTTP 函数为例,当想要把传统框架(例如 Django,Flask,Express,Next.js 等)部署到阿里云函数计算平台上,并且体验 Serverless 带来的按量付费,弹性伸缩等红利时,得益于阿里云函数计算的 HTTP 函数和 HTTP 触发器,使用者不仅可以快速、简单地将框架部署到阿里云函数计算,更可以保持和传统开发一样的体验。以 Python 的 Bottle 框架为例,当开发一个 Bottle 项目之后:
# index.pyp
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
复制代码
通过开发者工具快速迁移/部署
如果通过开发者工具进行传统框架的支持,可以直接通过 Serverless Devs 的命令,进行案例的项目的创建。目前 Serverless Devs 已经支持以下框架:
详情可以参考:https://github.com/devsapp/start-web-framework
以 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
为:
其中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: '/*'
复制代码
评论