概要
前面尝试了一些serverless相关的案例,都是直接使用的腾讯云原生的云函数来实现的,这一篇试试Serverless Framework这个框架,这个框架最大的好处在于支持多个主流的云平台,通过它来实现功能,可以避免云平台的锁定,这是云原生开发在开始技术选型时最关键的一项要求。
本文主要两个要点:
- Serverless Framework的安装和使用
- 框架和腾讯云函数关系的简单分析
Serverless Framework的安装和使用
腾讯云上有详细的安装文档: cloud.tencent.com/document/pr…
我的常用开发环境是windows10下的wsl环境,所以选择使用npm方式来安装:
npm install -g serverless
接下来准备用Python的Flask框架做一个最简单的demo,
- 首先创建一个新的python虚拟环境并激活:
virtualenv -p /usr/bin/python3 flask
source ~/python/flask/bin/active
- 安装Flask依赖包并生成对应的requirements文件, 注意这里依然要把依赖安装在项目文件夹下,否则依赖库不会打包上传到云服务上
pip install Flask -t .
pip freeze > requirements.txt
- 新建app.py文件,这里就是一个flask实现的一个接口:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/")
def index():
return "Hello Serverless!"
- 新建serverless.yaml文件,里面声明了函数名称和腾讯云相关的一些配置:
MyComponent:
component: "@serverless/tencent-flask"
inputs:
region: ap-guangzhou
functionName: flask-function
code: ./
functionConf:
timeout: 10
memorySize: 128
environment:
variables:
TEST: vale
vpcConfig:
subnetId: ''
vpcId: ''
apigatewayConf:
protocol: https
environment: release
- 打包上传执行:
sls --debug
执行这条命令就会完成项目的打包和部署流程,如果是第一次使用,中间会出现二维码,需要用微信扫描登录完成腾讯云服务的授权验证,完成后会输出api的访问路径:
service-fh27lh56-1256668370.gz.apigw.tencentcs.com/release/
可以直接访问:
框架是如何做到的
稍微探究一下框架到底做了些什么,登录腾讯云控制台,在云函数服务中,我们可以看到多了一个函数:
也就是之前我们在serverless.yaml文件中声明的函数名,我们打开这个函数的代码可以看到:
可以看到这里除了我们自己的app.py代码以及一堆的Flask依赖以外,多了一个api_service.py文件,并且这个文件被定义为函数的执行方法,而这个文件的内容如下:
import app # Replace with your actual application
import severless_wsgi
# If you need to send additional content types as text, add then directly
# to the whitelist:
#
# serverless_wsgi.TEXT_MIME_TYPES.append("application/custom+json")
def handler(event, context):
return severless_wsgi.handle_request(app.app, event, context)
将原函数收到的消息转发给自定义的wsgi执行器,这样就完成了云函数和Flask这样的wsgi框架的对接。
接下来打开腾讯的API网关控制台,同样会看到多了一个服务:
在这里服务中配置了api对应的后端服务是前面的云函数:
至此已经清楚了,在这里,Serverless Framework实际上帮我们完成了以下两件事件:
- 将传统的Flask应用代码打包成一个腾讯云函数,部署到云函数服务中
- 自动在腾讯云发API网关上新建一个API服务,并关联到第一步创建的云函数上
一点总结
可以看到,Serverless开发方式的主要做法就是通过一定的方式组合API网关,云函数,云数据库等等一系列的资源,来完成最终业务逻辑的实现,在各个云平台的原生方案中,开发人员需要去了解各个云服务的细节(比如云函数如何实现,如何调用),还需要了解如何组合这些资源(比如云函数如何访问数据库资源),才有可能真正的将Serverless落地到实际的场景中。
而Serverless Framework这样的框架,可以在很大程度上屏蔽这些细节,开发人员可以使用熟悉的方案专注于业务逻辑的实现,在云平台的部署可以交由框架来执行,这样就极大的降低了Serverless落地真实场景的门槛