阿里云函数计算服务 (FunctionCompute,FC) 是一个事件驱动的全托管计算服务. 通过函数计算与云端各个服务的广泛集成, 开发者只需要编写函数代码, 就能够快速地开发出弹性高可用的后端系统. 接下来我们使用 FC, 来快速实现一个图片转换服务, 并把这个图片转换服务作为支付宝小程序的后端.
支付宝小程序 demo 前端效果图:
资源下载及准备工作
示例代码附件 [必须]
支付宝小程序开发工具下载 [非必须]
函数计算 FC 快捷入口
对象存储 OSS 快捷入口
日志服务 Log Service 快捷入口
简明架构图
函数入口
普通函数入口
- def my_handler(event, context):
- return 'hello world'
函数名
my_handler 需要与创建函数时的 "Handler" 字段相对应: 例如创建函数时指定的 Handler 为 main.my_handler, 那么函数计算会去加载 main.py 中定义的 my_handler 函数
event 参数
event 参数是用户调用函数时传入的数据, 其类型是 str
context 参数
context 参数中包含一些函数的运行时信息(例如 request id / 临时 AK 等). 其类型是 FCContext, 具体结构和使用在下面的使用 context 介绍
返回值
函数的返回值会作为调用函数的结果返回给用户, 它可以是任意类型: 对于简单类型会函数计算会把它转换成 str 返回, 对于复杂类型会把它转换成 JSON 字符串返回
HTTP 触发器的函数入口
- HELLO_WORLD = b"Hello world!\n"
- def handler(environ, start_response):
- context = environ['fc.context']
- status = '200 OK'
- response_headers = [('Content-type', 'text/plain')]
- start_response(status, response_headers)
- return [HELLO_WORLD]
environ : environ 参数是一个 python 字典, 里面存放了所有和客户端相关的信息, 具体详情参考 environ 参数, 函数计算增加了两个自定义的 key, 分别是 fc.context 和 fc.request_uri
fc.context : 和普通函数入口的 context 意义一样
fc.request_uri : string 类型, request 的 url
需要注意的点: environ 中的 HTTP_Variables , 里面包含 request 中 header, 比如某个请求的 header 的为'x-Custom-key':'value' , 在 environ 中会表现为: environ['HTTP_X_CUSTOM_KEY']='value', 可以理解为, 对于 request header 中的 key,WSGI 做如下处理: key = "HTTP_" + k.upper().replace("-","_")
start_response : start_response 参数是一个可调用者(callable), 具体参考 the-start-response-callable , 这个是 FC runtime 提供的, 它接受两个必要的位置参数和一个可选参数.
更多详细介绍请参考函数入口和 python runtime
具体操作步骤
假定这次实验所有操作在华东 2 上海 region 完成, 所有实验相关的资源请从附件中下载
这里介绍两种部署函数的方法:
利用 fun 工具进行自动化部署
利用控制台进行可视化部署
准备工作
准备存储图片的 oss bucket
比如在华东 2 创建了一个名叫 xcx-demo 的 bucket
利用 fun 工具进行自动部署
Fun 是用于在阿里云上定义 serverless 应用的模型.
Serverless 应用是由事件触发功能组成的应用. 一个典型的 serverless 应用由一个或多个由诸如向 阿里云 OSS 上传对象, 在 阿里云 OTS 上执行数据操作以及 API 操作等事件触发的阿里云函数计算组成. 这些函数可以独立使用. 也可以利用其它资源, 例如阿里云 OTS 的表和 OSS 的 buckets. 最基本的 serverless 应用可以只有一个函数.
比如对于这个案例, 定义的 YAML 文件如下:
- ROSTemplateFormatVersion: '2015-09-01'
- Transform: 'Aliyun::Serverless-2018-04-03'
- Resources:
- sh-pro:
- Type: 'Aliyun::Serverless::Log'
- Properties:
- Description: 'image process log pro'
- fc-log:
- Type: 'Aliyun::Serverless::Log::Logstore'
- Properties:
- TTL: 362
- ShardCount: 1
- pydemo:
- Type: 'Aliyun::Serverless::Service'
- Properties:
- Description: 'fc xiaochengxu demo'
- Policies:
- - AliyunOSSFullAccess
- LogConfig:
- Project: 'sh-pro'
- Logstore: 'fc-log'
- upload:
- Type: 'Aliyun::Serverless::Function'
- Properties:
- Handler: upload.handler
- CodeUri: './'
- Description: 'http function for upload image'
- Runtime: python2.7
- Timeout: 60
- MemorySize: 256
- Events:
- http-trigger:
- Type: HTTP
- Properties:
- AuthType: ANONYMOUS
- Methods: ['POST']
- proc:
- Type: 'Aliyun::Serverless::Function'
- Properties:
- Handler: proc.handler
- CodeUri: './'
- Description: 'http function for process image'
- Runtime: python2.7
- Timeout: 60
- MemorySize: 256
- Events:
- http-trigger:
- Type: HTTP
- Properties:
- AuthType: ANONYMOUS
- Methods: ['GET']
上面的定义的 YAML 文件要做以下几件事情:
创建日志资源: logproject:sh-pro, logstore: fc-log
创建 service:xcxdemo 以及 function: upload 和 proc, 函数添加了一个类型为 HTTP, 名叫 http-trigger 的 trigger
配置 service role 以及 logconfig, 其中 role 的权限为 AliyunOSSFullAccess 和函数执行日志写到 fc-log 的权限
具体操作
安装 Node.JS
安装 fun
NPM install @alicloud/fun -g
修改 template.YAML 中的 logproject 的名字和. env 中的相关配置, 执行命令 fun deploy
执行成功后, 应该可以看到如下资源被创建, 截图:
控制台 setup
创建函数, 并且配置 http trigger
在 上海 region 先创建好日志资源, 用于函数计算的日志收集
新建 service, 配置 service 一个具有访问 oss 权限的 role
点击授权
点击确定
创建一个函数, 并设置 Http trigger, 使用的代码包为附件中 server 目录下的 code.zip
测试函数
- curl https://1186202104331798.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/pydemo/upload/ -F "lena.png=@/Users/songluo/work/shworkshop/wp/lena.png" -v
- curl https://1186202104331798.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/pydemo/proc/rotate/10/lena.png>> 1.PNG
将函数作为支付宝小程序的后端
下载安装支付宝小程序 IDE
打开代码包中的 client, 将代码中的 url 替换成自己函数的 url
然后打开 调试器 和 模拟器
总结
函数计算有如下优势:
无需采购和管理服务器等基础设施
专注业务逻辑的开发
提供日志查询, 性能监控, 报警等功能快速排查故障
以事件驱动的方式触发应用响应用户请求
毫秒级别弹性伸缩, 快速实现底层扩容以应对峰值压力
按需付费. 只需为实际使用的计算资源付费, 适合有明显波峰波谷的用户访问场景
来源: https://yq.aliyun.com/articles/705697