Serverless Framework初探

995 阅读3分钟

概要

前面尝试了一些serverless相关的案例,都是直接使用的腾讯云原生的云函数来实现的,这一篇试试Serverless Framework这个框架,这个框架最大的好处在于支持多个主流的云平台,通过它来实现功能,可以避免云平台的锁定,这是云原生开发在开始技术选型时最关键的一项要求。

本文主要两个要点:

  1. Serverless Framework的安装和使用
  2. 框架和腾讯云函数关系的简单分析

Serverless Framework的安装和使用

腾讯云上有详细的安装文档: cloud.tencent.com/document/pr…

我的常用开发环境是windows10下的wsl环境,所以选择使用npm方式来安装:

 npm install -g serverless

接下来准备用Python的Flask框架做一个最简单的demo,

  1. 首先创建一个新的python虚拟环境并激活:
virtualenv -p /usr/bin/python3 flask
source ~/python/flask/bin/active
  1. 安装Flask依赖包并生成对应的requirements文件, 注意这里依然要把依赖安装在项目文件夹下,否则依赖库不会打包上传到云服务上
pip install Flask -t .
pip freeze > requirements.txt
  1. 新建app.py文件,这里就是一个flask实现的一个接口:
from flask import Flask, jsonify
app = Flask(__name__)

@app.route("/")
def index():
    return "Hello Serverless!"
  1. 新建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
  1. 打包上传执行:
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实际上帮我们完成了以下两件事件:

  1. 将传统的Flask应用代码打包成一个腾讯云函数,部署到云函数服务中
  2. 自动在腾讯云发API网关上新建一个API服务,并关联到第一步创建的云函数上

一点总结

可以看到,Serverless开发方式的主要做法就是通过一定的方式组合API网关,云函数,云数据库等等一系列的资源,来完成最终业务逻辑的实现,在各个云平台的原生方案中,开发人员需要去了解各个云服务的细节(比如云函数如何实现,如何调用),还需要了解如何组合这些资源(比如云函数如何访问数据库资源),才有可能真正的将Serverless落地到实际的场景中。

而Serverless Framework这样的框架,可以在很大程度上屏蔽这些细节,开发人员可以使用熟悉的方案专注于业务逻辑的实现,在云平台的部署可以交由框架来执行,这样就极大的降低了Serverless落地真实场景的门槛