函数计算CFC

    使用 CFC HTTP 触发器托管 API

    概述

    在我们进行Web API的相关开发过程中,偶尔需要对系统进行 API 的增加或者迁移,在系统逻辑较为复杂的情况下,进行 API 的扩充或者迁移往往工作量较大。此时,使用 CFC 以及百度云 TableStorage 则可以简单地实现 API 的托管,从而减少系统的负载,同时增加接口的可移植性。

    适用场景

    • Web API托管
    • 插件式 API

    方案优势

    • 托管 API 至CFC,可节约资源
    • 增加 API的可移植性
    • 减少 API 之间的耦合度

    方案流程

    一、创建 Table

    1.1 开通百度云 TableStorage 服务

    若您还未开通百度云 TableStorage 服务,则可以通过【百度云控制台】>【数据库】>【TableStorage】开通相关服务。

    1.2 创建实例

    开通 TableStorage 服务后,您可以由控制台进入 TableStorage 中,并且创建对应的实例。如图所示。更多实例相关操作详情可参考TableStorage实例操作

    image.png

    1.3 创建表

    创建 TableStorage 实例后,您可以进入对应实例创建对应表。详细如下图所示。详细的创建操作可参考TableStorage表操作

    image.png

    至此,TableStorage 已经准备就绪。

    二、创建 CFC 函数

    2.1 开通百度云 CFC 服务

    若您还未开通百度云 TableStorage 服务,则可以通过【百度云控制台】>【计算】>【函数计算】开通相关服务。

    2.2 创建函数

    由于暂时 TableStorage 服务仅支持广州、保定地区。故需要您手动选择 CFC 广州地区,并以CFC_TableStorag_API为蓝图创建函数。如下所示:

    image.png

    2.3 部署相关代码

    根据蓝图中代码相关提示信息补全对应实例名称、表名称以及相关字段名称等。并根据 API 需要修改其返回格式。

    三、创建 HTTP 触发器进行 API 托管

    3.1 创建 HTTP 触发器

    在对应函数中创建 HTTP 触发器,并根据自己需要填写路径以及 HTTP 方法。具体创建流程可参考HTTP触发器开发参考

    3.2 配置函数路径

    根据蓝图代码注释配置相关的函数route信息。

    四、简单实践

    4.1 场景

    若需要托管一个成绩查询 API 于 CFC 函数,其中学生成绩表格如下所示:

    姓名 语文 数学 英语 物理 化学 生物
    小明 123 123 123 123 123 123

    则对应的 TableStorage 表格如下所示:

    image.png

    4.2 API 设计

    API 设计如下

    # 获取对应学生成绩单
    GET /students?instance={instance_name}&table={table_name}&name={name}
    # 上传/修改学生成绩单
    POST/PUT /students
    {
        "instance":"instance_name",
        "table": "table_name",
        "cells": {
            "chinese":"100",
            "math":"100",
            "english":"100",
            "physics":"100",
            "chemistry":"100",
            "biology":"100"
        }
        
    # 删除学生信息
    DELETE /students?instance={instance_name}&table={table_name}&name={name}

    则对应方法如下所示:

    @app.route('/students',method='GET')
    def get_row():
        """
        @param: request: bottle request
        @return: http return
    
        本方法用于从 TableStorage 中获取数据
        """
        instance = bytes(request.query.name, encoding='utf8')
        table = bytes(request.query.name, encoding='utf8')
        name = bytes(request.query.name, encoding='utf8')
    
        bts = init_bts_client()
        query_row_arg = QueryRowArgs()
        query_row_arg.rowkey = name
        try:
            res = bts.get_row(instance, table, query_row_arg)
            if res is None:
                return HTTPResponse(body={'error': 'resource not found'}, status=404)
            else:
                return HTTPResponse(body={'body':str(res.result[0])},status_code=200)
        except Exception as exception:
            return HTTPResponse(body={'error':exception}, status=400)
    
    
    @app.route('/students', method=['POST', 'PUT'])
    def put_row():
        """
        @param: bottle request
        @return: http response
    
        本方法用于将输入数据存储于 TableStorage 中
        """
        bts = init_bts_client()
        body = request.json
        instance = bytes(body['instance'],encoding='utf8')
        table = bytes(body['table'],encoding='utf8')
        name = bytes(body['name'],encoding='utf8')
        c = body['cells']
        cells = []
        for key, value in c.items():
            cells.append(Cell(key, value).__dict__)
    
        row = Row()
        row.rowkey = name
        row.cells = cells
        try:
            res = bts.put_row(instance, table, row)
            return HTTPResponse(status_code=200)
        except Exception as exception:
            return HTTPResponse(status_code=400, body={'error': exception})
    
    
    @app.route('/students', method='DELETE')
    def delete_row():
        """
        @param: bottle request
        @return: http response
    
        本方法用于从百度云TableStroage中删除对应数据
        """
        bts = init_bts_client()
        instance = bytes(request.query.instance, encoding="utf8")
        table = bytes(request.query.table, encoding="utf8")
        name = bytes(request.query.name, encoding="utf8")
        query_row_args = QueryRowArgs()
        query_row_args.rowkey = name
    
        try:
            bts.delete_row(instance, table, query_row_args)
            return HTTPResponse(status_code=204)
        except Exception as e:
            return HTTPResponse(status_code=400, body={'error': e})

    同时,在函数界面创建 HTTP 触发器,路径为/students,方法为 GET、POST、PUT、DELETE

    4.3 实践

    创建完毕触发器,部署完毕方法后,可以简单测试对应 API。

    原始数据如下所示:

    image.png

    • 上传成绩: 使用cURL请求上传成绩,如下所示:
    curl --location --request POST 'https://dn99xpwe8yjgx.cfc-execute.gz.baidubce.com/students' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "instance": "test_cfc",
        "table": "test_cfc",
        "name": "xiaoming",
        "cells": {
            "chemistry": "100",
            "chinese": "100",
            "math": "100",
            "english": "100",
            "physics": "100",
            "biology": "100"
        }
    }'

    执行完毕后, TableStorage 表格数据如下所示,如图所示,数据已经被写入表格中。

    image.png

    • 查询成绩: 使用cURL查询成绩,如下所示:
    curl --location --request GET 'https://dn99xpwe8yjgx.cfc-execute.gz.baidubce.com/students?instance=test_cfc&table=test_cfc&name=xiaoming' \
    --header 'Content-Type: application/json'

    resonse如下所示:

    {"body": "{rowkey:u'xiaoming',cells:[{column:u'biology',value:u'100',timestamp:1584633381567}, {column:u'chemistry',value:u'100',timestamp:1584633381567}, {column:u'chinese',value:u'100',timestamp:1584633381567}, {column:u'english',value:u'100',timestamp:1584633381567}, {column:u'math',value:u'100',timestamp:1584633381567}, {column:u'physics',value:u'100',timestamp:1584633381567}]}"}
    • 删除成绩: 使用cURL删除某一学生成绩,如下所示:
    curl --location --request DELETE 'https://dn99xpwe8yjgx.cfc-execute.gz.baidubce.com/students?instance=test_cfc&table=test_cfc&name=xiaoming' \
    --header 'Content-Type: application/json'

    执行完毕后,相关数据在 TableStorage 中已经被删除。如图所示:

    image.png

    总结

    使用 CFC HTTP 触发器以及 TableStorage 数据库,可以轻松地将 API 托管至云端实现插件化的 API,一方面可以节省计算机资源,另一方面则可以为系统升级、迁移等操作提供便利。

    上一篇
    使用 Terraform 快速搭建图像处理应用
    下一篇
    API参考