在原有设计中,利用了Python Flask供应WEB界面,后台利用Celery异步的将用户要求发送至钉钉中,之后采取轮询办法监控审批工单状态,当工单完成审批后,将天生好的License发送至客户供应的邮箱中。
实现的效果:
这种办法虽然可以知足需求,但是在利用过程中也创造有如下痛点:1、由于对付可用性哀求比较高,以是将整套运用以容器化办法支配在云主机上,程序高可用性依赖于底层的平台,基于本钱考虑并没有在多可用区进行支配。2、当业务变革时,须要专人将容器从本地容器库上传后进行更新,更新速率慢,敏捷性低。3、须要专人对操作系统层进行掩护,并且由于该云主机还运行了其他程序,以是管控上也存在安全风险。

基于以上涌现的问题,决定对原有二维码程序进行重构,并重新支配在阿里云函数打算做事上。1、第一阶段的改造紧张是将二维码扫描程序移植到函数打算做事中。2、第二阶段的改造紧张是将发送二维码程序改造为函数打算做事,利用钉钉流程接口中的Callback方法调用该接口,在审批结束后触发发送License流程。
2、函数打算做事——无做事,零运维最早打仗Serverless的雏形是在2011年开拓Cloud Foundry项目时,当时留下一个非常深的印象便是把写好的运用直接上传就完成了支配、扩展等。但是当时Cloud Foundry有一个非常大的局限性,受限于几种开拓措辞和框架。记得当时的Cloud Foundry只支持Node.js、Python、Java、PHP、Ruby on Rails等,分开了这个范围则就无法支持,以是当时我实在对这种形态的运用处景存在很大的疑问。这种困惑直到2013年Docker的涌现而逐步解开,Docker的涌现让开发措辞、框架不再是问题,奥妙的办理了Cloud Foundry上述局限性。但是Docker毕竟只是一种工具形态,还不能称得上是平台,紧接着k8s的涌现填补了这一空缺,使得Docker从游击队变成了正规军。在这个发展过程中我们不丢脸出,软件领域发展涌现了重大变革,从做事器为王逐渐演进到运用为王的阶段。如果说虚拟化改变了全体物理机的格局,那么无做事化的涌现则改变了全体软件开拓行业。由于网上各种文档太多了,这里就不对Serverless基本观点进行先容了,借用一张图解释下。其余还有一点,我们从这里面看到IT行业里的某些岗位,注定要消逝的,比如传统运维。
3、运用架构全体架构上,分为两个函数打算做事完成:
二维码前端:紧张用于显示页面,并承担HTTP要求转发代理的角色,将要求转发至二维码后端,发给钉钉,采取HTTP触发器,许可公网访问。二维码后端:用于将用户要求发送给钉钉,该部分做事仍旧采取HTTP触发器,不同于前端,该做事是不许可公网直接访问的,但是须要配置NAT网关,通过网关访问钉钉,实现固定IP访问钉钉的效果。从逻辑上讲,全体运用并不繁芜,但是在实际利用时碰着最大的问题来自钉钉白名单。由于函数做事对外连接的IP并不固定,以是无法在钉钉中添加,那么就哀求函数做事对外连接的IP地址一定要固定。社区中供应的方法紧张分为:
ECI(运行Nginx充当Proxy),上风是便宜,劣势是高可用性须要自己掩护NAT网关,上风是高可用性,劣势是比ECI贵4、构建过程由于篇幅缘故原由,这里只先容关键步骤。
4.1 构建模板为了后续管理和扩展方便,选用了阿里云函数打算中利用flask-web模板进行构建,同时可以将前端静态文件模板存放于项眼前(出于统一管理的须要,也可以存放于阿里云的OSS中,作为静态网站发布)。
前端我们利用flask-web作为模板创建函数,后端我们直接采取最大略的HTTP函数。
函数入口配置,及触发器配置:
做事配置,包含公网访问权限,专有网络配置,日志配置,权限配置。
前端做事须要公网访问权限,不须要专有网络配置,须要的权限为:AliyunLogFullAccess。后端做事不须要公网访问权限,但是须要配置好的NAT映射的专有网络,由于函数做事在北京2区中在cn-beijing-c和cn-beijing-f,以是在新建交流机时须要利用这两个区。还须要选择安全组,由于出方向并没有明确禁止,以是不须要特殊的安全组规则设定。须要的权限为:AliyunLogFullAccess/AliyunECSNetworkInterfaceManagementAccess。配置好后,通过导出功能,分别下载前端和后端代码和配置,在本地进行开拓调试。
4.2 前端开拓我们的前端采取Vue.js进行开拓,在main.py同级新建templates目录。Vue编译好的静态文件可以放入该目录中,后续Flask会加载该文件作为入口文件。
├── templates│ ├── index.html│ ├── static├── main.py
# main.py samplefrom flask import render_templateLICENSE_URL = "https://[x](https://.cn-beijing-internal.fc.aliyuncs.com/2016-08-15/proxy/QR_code/apply_license/license)x[x](https://xx.cn-beijing-internal.fc.aliyuncs.com/2016-08-15/proxy/QR_code/apply_license/license)x[x](https://xxxx.cn-beijing-internal.fc.aliyuncs.com/2016-08-15/proxy/QR_code/apply_license/license)x[x](https://xxxxxx.cn-beijing-internal.fc.aliyuncs.com/2016-08-15/proxy/QR_code/apply_license/license).cn-beijing-internal.fc.aliyuncs.com/2016-08-15/proxy/QR_code/apply_license/license"@app.route('/qr_code', methods=['GET'])def index(): return render_template('index.html') @app.route('/qr_code/license', methods=['POST']) def create(): payload = request.json resp = requests.post(LICENSE_URL, json=payload, headers=DEFAULT_HEADERS) return make_response(resp.text, resp.status_code)
4.3 后端开拓
后真个开拓较为大略,实现一个函数支持POST要求,将转发的结果发送至钉钉即可。
4.4 本地调试阿里云在本地开拓时供应了fun运用支配和开拓工具,详细利用方法见:https://help.aliyun.com/document_detail/64204.html。
安装funnpm config set registry [https://registry.npm.taobao.org](https://registry.npm.taobao.org/) --globalnpm config set disturl [https://npm.taobao.org/dist](https://npm.taobao.org/dist) --globalnpm install @alicloud/fun -g
配置fun
fun config(venv) [root@ray-dev test_func]# fun config? Aliyun Account ID xxxxxxxx? Aliyun Access Key ID r5Qd? Aliyun Access Key Secret kCCi? Default region name cn-beijing? The timeout in seconds for each SDK client invoking 10? The maximum number of retries for each SDK client 3? Allow to anonymously report usage statistics to improve the tool over time? Yes
Http Trigger本地运行
fun local start
支配
fun deploy
4.5 配置域名解析
支配完成后有一点须要特殊把稳,必须要绑定域名,并且设定必要的路由。如果在没有绑定域名的情形下,做事端会为 response header中逼迫添加 content-disposition: attachment字段,此字段会使得返回结果在浏览器中以附件的办法打开。(https://www.alibabacloud.com/help/zh/doc-detail/56103.htm)
5、总结灵巧利用函数打算对开拓本钱和运行本钱具有“双降”的效果函数打算除了Http Trigger外,还包含了Event Trigger。Event Trigger中包含了连接各个做事之间的浸染,在一些做事衔接上的浸染越来越明显函数打算在线开拓时比较麻烦,并且查看日志未便利,以是只管即便在本地开拓好在上传的办法