阿里serverless函数计算HTTP触发器对接flask

先看啥是serverless

无服务器架构

假设您计划采购服务器开发一款短视频社交应用,那么您需要考虑很多的问题,例如:

  • 如何构建和运维一套弹性的稳定的视频处理后端服务?
  • 需要采购多少台服务器?
  • 服务器采用什么规格?
  • 如何配置网络和操作系统?
  • 如何部署环境?
  • 如何负载均衡?
  • 如何动态伸缩?
  • 如何升级配置?
  • 如何应对服务器宕机?
  • 如何应对用户请求峰值?
  • 如何应对系统监控报警?

这么多情况就是一个字——麻烦

服务的演化

阿里serverless函数计算HTTP触发器对接flask_第1张图片
serverless演化

当我们自己买机器搭建,就是物理机层。
之后我们可能买阿里云或者腾讯云的ECS服务器,就到了云计算层。这个时候我们已经不用考虑硬件方面的问题。但是还有运维方面的问题。
直到出现了serverless,我们只管写我们的代码,放上去。不需要考虑并发情况。不需要考虑cpu占用等等问题。他全解决了!美滋滋。
如果我们把搭建的服务比喻成开旅店:

服务 旅店
物理机 从盖大楼开始干
云计算 楼有了,从装修毛坯房开始干
容器 有公版的装修图(配置文件),可以安排别人把每个毛坯装修成一个样子
serverless 客人可直接拎包入住,你接待就行了

使用文档

阿里云serverless使用文档

Flask的部署

首先改代码

启动函数不再使用以下方式

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=15005, debug=False)

改为:

base_path=""
def handler(environ, start_response):
    parsed_tuple = urlparse(environ['fc.request_uri'])
    li = parsed_tuple.path.split('/')
    global base_path
    if not base_path:
        base_path = "/".join(li[0:5])
    context = environ['fc.context']
    environ['HTTP_HOST'] = '{}.{}.fc.aliyuncs.com'.format(context.account_id, context.region)
    environ['SCRIPT_NAME'] = base_path + '/'
    return app(environ, start_response)

假设你文件名为main.py,那么一会在填写触发函数的时候就写main.handler
因为他不是完全的python环境,所以还要安装包。
要将所有包装到本地文件夹,进入到项目目录下pip install -t . flask或者pip install -t . -r requirements.txt然后将整体放上去

阿里云新建服务

1、进入函数计算的控制台管理界面,点击新建服务

阿里serverless函数计算HTTP触发器对接flask_第2张图片
管理控制台

2、输入项目名、项目简介,点击 确定
3、在新建服务那个位置,现在已经变成了新建函数,点击 +!
4、选择语言,python3,选择空白模板。点击 选择
5、
阿里serverless函数计算HTTP触发器对接flask_第3张图片
触发器配置

这个图里所写的验证的问题,已经解决,我会在最下面写解决方法。

6、基础信息自己定、代码配置选文件夹上传

阿里serverless函数计算HTTP触发器对接flask_第4张图片
image.png

7、然后直接点下一步然后创建就完事了。

调试及后续

阿里serverless函数计算HTTP触发器对接flask_第5张图片
调试

浏览器访问问题

他这里给的那个链接不能直接用,浏览器打开之后是直接把那个页面下载下来了,如果响应是json类型,打开页面也是直接下载了xxx.json
解决方案就是自定义域名。

使用签名认证

他的文档里没有python的代码,是一个js的。而且写的一点也不走心。
这里https://github.com/aliyun/fc-python-sdk/blob/master/fc2/auth.py
有认证的代码。

使用签名认证(更新内容)

虽然他自带了验证的功能,但是不能用自己的request写了需要用阿里提供的包。

from email.utils import formatdate
import requests
import email
import fc2
client = fc2.Client(
endpoint='https://xxxx.cn-hangzhou.fc.aliyuncs.com',
accessKeyID='xxxx',
accessKeySecret='xxxxxx')
path="/2016-08-15/proxy/test/test123/"
#headers = client._build_common_headers('GET',unescape(path),{}, {});
header = client._build_common_headers('GET',path,customHeaders={}, unescaped_queries=None);
print (header)
c=client.do_http_request('GET', 'test', 'test123', '/')
print(c.text)

实现灰度发布

通过这个进行版本管理
https://help.aliyun.com/document_detail/96464.html?spm=a2c4g.11186623.6.676.3c13886fTYhCV0

连接数据库

刚开始用是无权调用数据库的。因为有一个ip的白名单。而它不在里面。
使用专用网络,你要弄一个vpc网络。
这边参考:https://help.aliyun.com/knowledge_detail/72959.html?spm=a2c4g.11186623.6.670.4eff29e9WiAOYx

日志系统

他这里类似于自带一个ELT 的功能,还要一个日志仓库。

代码是否正常启动,是否存在异常

对路由发送一个请求,如果有错误,就会把错误当响应一样返回。

费用调查

每日调用次数 函数的内存规格 函数执行一次的时间 每日函数调用费用 (单位:元)
五万 1G 0.2S 1.18元
  • 更多情况费用计算
    • 费用计算器:
      http://g.alicdn.com/aliyun-next/fc/1.1.69/price.html?spm=a2c4g.11186623.2.19.b4475819NPFCRK

阿里云serverless先说到这,因为有一些还没测,所以此篇博客日后再完善

亚马逊的serverless

可以使用Zappa部署
https://github.com/Miserlou/Zappa

你可能感兴趣的:(阿里serverless函数计算HTTP触发器对接flask)