先看啥是serverless
无服务器架构
假设您计划采购服务器开发一款短视频社交应用,那么您需要考虑很多的问题,例如:
- 如何构建和运维一套弹性的稳定的视频处理后端服务?
- 需要采购多少台服务器?
- 服务器采用什么规格?
- 如何配置网络和操作系统?
- 如何部署环境?
- 如何负载均衡?
- 如何动态伸缩?
- 如何升级配置?
- 如何应对服务器宕机?
- 如何应对用户请求峰值?
- 如何应对系统监控报警?
这么多情况就是一个字——麻烦
服务的演化
serverless演化当我们自己买机器搭建,就是物理机层。
之后我们可能买阿里云或者腾讯云的ECS服务器,就到了云计算层。这个时候我们已经不用考虑硬件方面的问题。但是还有运维方面的问题。
直到出现了serverless,我们只管写我们的代码,放上去。不需要考虑并发情况。不需要考虑cpu占用等等问题。他全解决了!美滋滋。
如果我们把搭建的服务比喻成开旅店:
服务 | 旅店 |
---|---|
物理机 | 从盖大楼开始干 |
云计算 | 楼有了,从装修毛坯房开始干 |
容器 | 有公版的装修图(配置文件),可以安排别人把每个毛坯装修成一个样子 |
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、进入函数计算的控制台管理界面,点击新建服务
2、输入项目名、项目简介,点击
确定
3、在新建服务那个位置,现在已经变成了新建函数,点击
+
!4、选择语言,python3,选择空白模板。点击
选择
5、
触发器配置
这个图里所写的验证的问题,已经解决,我会在最下面写解决方法。
6、基础信息自己定、代码配置选文件夹上传
7、然后直接点下一步然后创建就完事了。
调试及后续
调试浏览器访问问题
他这里给的那个链接不能直接用,浏览器打开之后是直接把那个页面下载下来了,如果响应是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元 |
- 更多情况费用计算
阿里云serverless先说到这,因为有一些还没测,所以此篇博客日后再完善
亚马逊的serverless
可以使用Zappa部署
https://github.com/Miserlou/Zappa
网友评论