Skip to content

lnkyan/serverless-order-dinner

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

serverless-order-dinner

基于无服务架构做的钉钉点餐工具。用来发布和记录公司每天免费晚餐的点餐情况

  • 语言是Node.js
  • 数据存储在阿里云OSS对象存储(每月有免费额度)
  • 部署在阿里云的函数计算(每月有免费额度)
  • 推送到钉钉机器人API

部署方法

一、注册阿里云账号

可以使用淘宝账号登录

二、配置OSS对象存储

  1. 创建一个存储空间,即Bucket,就近选择一个区域,其它保留默认配置即可
  2. 访问OSS需要accessKeys。鼠标指向阿里云控制台右上角头像,就可以看到了。我们创建一对新的acessId和accessKey
  3. 参考src/lib/config.sample.js的格式创建src/lib/config.js文件,填入OSS相关信息

三、配置Serverless函数计算

  1. 安装依赖库
    yarn
  2. 参考.env.sample的格式创建.env文件,填入fun的配置信息
    • 这里的ACCOUNT_ID是阿里云账号ID,可以参考这里
    • REGION最好和OSS在一起,具体取值也可以参考上面的文章,就是服务地址第一个点之前的部分,如cn-shanghai
  3. 部署(使用fun
    yarn run deploy

四、配置钉钉机器人

  1. 在钉钉群中添加自定义机器人
  2. 把机器人的webhook地址复制下来,粘贴到src/lib/config.js文件中

五、配置域名

  1. 如果服务只提供GET、POST请求的话,登录阿里云函数计算,在服务-函数页中找到刚刚上传的函数,点开函数切换到触发器Tab,就可以看到访问地址
  2. 如果要访问html的话,阿里云为防止滥用(上面那个域名没有备案),会在下发html时的header中强制带上Content-Disposition: attachment的配置,在浏览器中就变成下载文件了。所以还需要配置自定义域名
  3. 购买一个域名,完成备案(必须在阿里云备案),然后配置一条CNAME解析规则为<账号id>.<region>.fc.aliyuncs.com
  4. 打开云函数的自定义域名页面,创建一条域名,路径可以写/。如果这一步保存不成功,可以看下网络包,这个页面有bug,可能返回了错误但没有提示出来。
  5. 通过这个新域名就可以正常访问html服务了
  6. 另外也可以考虑把html文件放到github或coding等其它平台上,只在阿里云的云服务中提供ajax请求接口。这样就不用配置域名了,开发起来麻烦一点,但也算符合前后端分离了。

调试方法

该项目在本地完整运行需要安装docker,再运行fun local invoke <function_name>

为方便调试,提供了普通的http入口

yarn
yarn run start

控制台会打印调试用的入口地址

TODO

  • 配置日志服务。现在无法查看线上的日志。在云函数中可以开通简单日志服务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版,然后等它升级到新版的

建立项目过程

  1. 全局安装fun
    yarn global add @alicloud/fun
    这里使用命令行创建的方式,而不是在网页上创建的方式。以后部署更新的时候用命令行比较方便
  2. 创建应用
    fun init -n serverless-demo
    选择http-trigger-nodejs10模板
  3. 我们只是用免费额度做测试,所以需要修改根目录下的配置文件template.yaml。主要就是改改服务和函数的名字,再降低一下配置。yaml配置文档。不懂的话可以去网页上创建一个新函数,配置好后,在服务页切换到服务配置Tab,然后选导出配置,拿它的配置来参考
  4. 在项目目录下建一个.env文件,配置fun的部署参数
    • 这里的ACCOUNT_ID是阿里云账号ID,可以参考这里
    • REGION最好和OSS在一起,具体取值也可以参考上面的文章,就是服务地址第一个点之前的部分,如cn-shanghai
    • ACCESS_KEY_IDACCESS_KEY_SECRET使用子账号的。给子账号分配AliyunFCFullAccess(部署云函数)权限和AliyunOSSFullAccess(OSS访问)权限
  5. fun默认打包CodeUri下的所有文件,通过funignore可以配置忽略名单。阿里云有些内置的依赖库,我们开发过程中的devDependencies依赖,都是不用上传的。这里可能需要写一下专门的打包上传流程。如果是非常简单的项目,也可以直接把项目打包成zip去网页上上传
  6. HTTP触发器要对外暴露所以认证方式是anonymous。需要防刷的话可以设置为function,每次访问都需要签名

其它参考资料 使用 Serverless 实现日志报警

腾讯云函数

阿里云的备案太麻烦了,还得先买个ECS,又不能用其它网站备案好的域名。所以也研究了一下腾讯的云函数

  • 和阿里云的配置都差不多,也是通过一个template.yaml文件来配置云函数
  • 创建函数时不能创建触发器,而部分区域(如成都)是不支持API触发器的,所以一定要先确保能创建再搞其它的
  • 必须在网关API中有一个API,才能将其作为云函数的API触发器。虽然过程是一键式的,但腾讯云的网关API只有第一年有免费额度
  • 云函数的公网流量没有免费额度
  • 直接就有免费的运行日志可以看,不像阿里云必须对接到SLS上看
  • 默认的相应方式是返回一个json对象(而不是html请求的response包体),由云函数封装下发。所以如果要返回HTML的话,则API触发器必须钩选集成响应(可以自由设置回包的header等字段),否则会报403错误

国外的云函数

国外的云函数发展的更早,如果要尝试的话可以选择亚马逊、微软或者谷歌的。更好的选择是直接使用框架 serverless

About

基于阿里云serverless做的点餐工具

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors