Serverless架构下的AI应用开发:入门、实战与性能优化
上QQ阅读APP看书,第一时间看更新

2.3.1 请求集成方案

请求集成方案实际上就是把真实的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(指具体语言的运行时,例如Python3运行时、Node. js12运行时),我们还可以考虑使用Custom Runtime和Custom Container来实现,例如,一个Web项目完成之后,可以编写一个Bootstrap文件(在Bootstrap文件中写一些启动命令)。例如要启动一个Express项目,把Express项目准备完成之后,可以直接创建Bootstrap文件,并将启动命令配置到该文件中:


#!/usr/bin/env bash
export PORT=9000
npm run star

阿里云函数计算还提供了更简单的Web框架迁移方案。图2-8所示是阿里云函数计算页面传统Web框架迁移功能示例。

图2-8 阿里云函数计算页面传统Web框架迁移功能

选择对应的环境之后,只需要上传代码,做好简单的配置,即可让传统的Web框架迁移至阿里云函数计算平台。

如果通过开发者工具进行部署,以Serverless Devs为例,首先创建index.py:


# -*- coding: utf-8 -*-
from bottle import route, run
@route('/')
def hello():
    return "Hello World!"
run(host='0.0.0.0', debug=False, port=9000)

然后编写资源和行为描述文件:


edition: 1.0.0
name: framework                                                 #项目名称
access: "default"                                               #密钥别名
services:
    framework:                                                  #业务名称/模块名称
        component: fc                                           #组件名称
        actions:
            pre-deploy:                                         #在部署之前运行
                - run: pip3 install -r requirements.txt -t .    #要运行的命令行
                    path: ./code                                #命令行运行的路径
        props:                                                  #组件的属性值
            region: cn-beijing
            service:
                name: web-framework
                description: 'Serverless Devs Web Framework Service'
            function:
                name: bottle
                description: 'Serverless Devs Web Framework Bottle Function'
                codeUri: './code'
                runtime: python3
                handler: index.app
                timeout: 60
            triggers:
                - name: httpTrigger
                    type: http
                    config:
                        authType: anonymous
                        methods:
                            - GET
            customDomains:
                - domainName: auto
                    protocol: HTTP
                    routeConfigs:
                        - path: '/*'

同时,提供对应的Bootstrap文件,即启动文件:


#!/bin/bash
python3 index.py

完成之后,执行deploy指令进行部署:


s deploy

部署结果如图2-9所示。

图2-9 Serverless Devs部署Bottle框架过程

根据返回的网址,可以看到部署结果预览,如图2-10所示。

图2-10 Serverless Devs部署结果预览

通过Serverless Devs开发者工具,我们不仅可以简单地进行传统Web框架的部署,还可以快速在Serverless架构下进行传统Web框架的初始化。以Express项目为例,只需要通过Serverless Devs开发者工具执行如下代码即可进行Express.js项目的初始化。


s init start-express

初始化的过程如图2-11所示。

此时,只需要进入该项目执行如下代码即可快速进行项目的部署。


s deploy

图2-11 通过Serverless Devs初始化Express项目

部署结果如图2-12所示。

图2-12 Express项目部署完成示意图

打开系统分配的地址,可以看到通过Serverless Devs开发者工具初始化的Express项目,效果展示如图2-13所示。

图2-13 Express项目完成效果展示

当然,目前Serverless Devs开发者工具不仅支持Express项目的快速初始化(见表2-1),还支持包括Django、Flask、SpringBoot等数十个传统框架的快速创建与部署。

表2-1 Serverless Devs支持快速创建和部署的传统框架

综上所述,通过阿里云函数计算进行传统Web框架的部署和迁移是很方便的,并且得益于HTTP函数与HTTP触发器,整个过程侵入性非常低。当然,将传统Web框架部署到阿里云上的可选方案也比较多。

·编程语言化的Runtime:只需要写好函数入口即可。

·Custom Runtime:只需要写好Bootstrap即可。

·Custom Container:直接按照规范上传镜像文件即可。

部署途径也是多种多样的,具体如下。

·直接在控制台创建函数。

·在应用中心处创建Web应用。

·利用开发者工具。