基于无服务架构做的钉钉点餐工具。用来发布和记录公司每天免费晚餐的点餐情况
- 语言是Node.js
- 数据存储在阿里云OSS对象存储(每月有免费额度)
- 部署在阿里云的函数计算(每月有免费额度)
- 推送到钉钉机器人API
可以使用淘宝账号登录
- 创建一个
存储空间,即Bucket,就近选择一个区域,其它保留默认配置即可 - 访问OSS需要accessKeys。鼠标指向阿里云控制台右上角头像,就可以看到了。我们创建一对新的acessId和accessKey
- 参考
src/lib/config.sample.js的格式创建src/lib/config.js文件,填入OSS相关信息
- 安装依赖库
yarn
- 参考
.env.sample的格式创建.env文件,填入fun的配置信息- 这里的
ACCOUNT_ID是阿里云账号ID,可以参考这里 REGION最好和OSS在一起,具体取值也可以参考上面的文章,就是服务地址第一个点之前的部分,如cn-shanghai
- 这里的
- 部署(使用fun)
yarn run deploy
- 在钉钉群中添加
自定义机器人 - 把机器人的
webhook地址复制下来,粘贴到src/lib/config.js文件中
- 如果服务只提供GET、POST请求的话,登录阿里云函数计算,在
服务-函数页中找到刚刚上传的函数,点开函数切换到触发器Tab,就可以看到访问地址 - 如果要访问html的话,阿里云为防止滥用(上面那个域名没有备案),会在下发html时的header中强制带上
Content-Disposition: attachment的配置,在浏览器中就变成下载文件了。所以还需要配置自定义域名 - 购买一个域名,完成备案(必须在阿里云备案),然后配置一条CNAME解析规则为
<账号id>.<region>.fc.aliyuncs.com - 打开云函数的
自定义域名页面,创建一条域名,路径可以写/。如果这一步保存不成功,可以看下网络包,这个页面有bug,可能返回了错误但没有提示出来。 - 通过这个新域名就可以正常访问html服务了
- 另外也可以考虑把html文件放到github或coding等其它平台上,只在阿里云的云服务中提供ajax请求接口。这样就不用配置域名了,开发起来麻烦一点,但也算符合前后端分离了。
该项目在本地完整运行需要安装docker,再运行fun local invoke <function_name>
为方便调试,提供了普通的http入口
yarn
yarn run start控制台会打印调试用的入口地址
- 配置日志服务。现在无法查看线上的日志。在云函数中可以开通简单日志服务SLS,免费的
- 建一个新的目录或用webpack来打包上传,解决现在把devDependencies打包进去的问题(代码包上限50M)
- 把oss访问、钉钉访问、html服务、点餐服务拆到不同的函数或服务中去
官方文档。基本上所有知识都能在这里找到
应用阿里云里面的云函数中,应用是通过ROS一键编排建立起来的,支持查看总的统计数据,但是服务名和函数名不能改。我尝试修改了ROS编排脚本,创建成功后在应用中却并没有看到它。所以暂时不管了,反正服务里面也有统计数据服务一个服务可以中可以包含多个函数,一个函数可以配置http、定时等触发方式。为了开发方便,这里并不会为每一个http接口都创建一个函数(创建函数就得去写配置文件),而是通过express扩展http入口,让一个函数能够提供多个接口。这里可以在阿里云新建一个应用,选Webapp Todolist(基于Express),参考它的代码
当然从云函数的理念上来说,业务逻辑和基础能力一定是要拆分到不同的服务或函数中去的。自己要对业务逻辑和基础服务做好层级划分版本云函数发布了版本后,代码就不能再修改了,可以通过带版本号的URL去访问,具体规则在此环境云函数的执行环境中,可以通过process.env.FC_FUNC_CODE_PATH获取到代码所在路径
云函数的代码部署后就无法下载了,在线编辑只能看到template.yaml配置中Handler项所指的那个文件。因此需要自己找个代码仓库调试通过fun local invoke <function name>可以本地调试,但需要安装docker。阿里云有个Alibaba Cloud Toolkit插件,可以在IDE中管理云服务器,也可以运行云函数,但还是需要docker这个插件要加群获取,我是安装的PyCharm版,然后等它升级到新版的
- 全局安装fun
这里使用命令行创建的方式,而不是在网页上创建的方式。以后部署更新的时候用命令行比较方便
yarn global add @alicloud/fun
- 创建应用
选择
fun init -n serverless-demo
http-trigger-nodejs10模板 - 我们只是用免费额度做测试,所以需要修改根目录下的配置文件
template.yaml。主要就是改改服务和函数的名字,再降低一下配置。yaml配置文档。不懂的话可以去网页上创建一个新函数,配置好后,在服务页切换到服务配置Tab,然后选导出配置,拿它的配置来参考 - 在项目目录下建一个
.env文件,配置fun的部署参数- 这里的
ACCOUNT_ID是阿里云账号ID,可以参考这里 REGION最好和OSS在一起,具体取值也可以参考上面的文章,就是服务地址第一个点之前的部分,如cn-shanghaiACCESS_KEY_ID和ACCESS_KEY_SECRET使用子账号的。给子账号分配AliyunFCFullAccess(部署云函数)权限和AliyunOSSFullAccess(OSS访问)权限
- 这里的
fun默认打包CodeUri下的所有文件,通过funignore可以配置忽略名单。阿里云有些内置的依赖库,我们开发过程中的devDependencies依赖,都是不用上传的。这里可能需要写一下专门的打包上传流程。如果是非常简单的项目,也可以直接把项目打包成zip去网页上上传- HTTP触发器要对外暴露所以认证方式是
anonymous。需要防刷的话可以设置为function,每次访问都需要签名
其它参考资料 使用 Serverless 实现日志报警
阿里云的备案太麻烦了,还得先买个ECS,又不能用其它网站备案好的域名。所以也研究了一下腾讯的云函数
- 和阿里云的配置都差不多,也是通过一个
template.yaml文件来配置云函数 - 创建函数时不能创建触发器,而部分区域(如成都)是不支持API触发器的,所以一定要先确保能创建再搞其它的
- 必须在
网关API中有一个API,才能将其作为云函数的API触发器。虽然过程是一键式的,但腾讯云的网关API只有第一年有免费额度 - 云函数的公网流量没有免费额度
- 直接就有免费的运行日志可以看,不像阿里云必须对接到SLS上看
- 默认的相应方式是返回一个json对象(而不是html请求的response包体),由云函数封装下发。所以如果要返回HTML的话,则API触发器必须钩选
集成响应(可以自由设置回包的header等字段),否则会报403错误
国外的云函数发展的更早,如果要尝试的话可以选择亚马逊、微软或者谷歌的。更好的选择是直接使用框架 serverless