最近在公司项目中实践数据中台的概念,调研并使用了阿里云提供的函数计算服务,记录下相关内容:
¶一、安装 fun 命令行工具
1 | npm install @alicloud/fun -g |
¶二、搭建基于Express的Serverless Web应用
阿里云文档:搭建基于Express的Serverless Web应用
¶1、通过 fun 模板生成项目
1 | fun init -n wisejob-class https://github.com/muxiangqiu/fc-Express-nodejs8.git |
¶2、本地运行
注意
- 本地需要安装 Docker 并启动
- 静态页面打包时的路径需带上访问域名的名称前缀
- 本地访问静态页面时 url 后需要带 /
1 | cd demo |
本地查看效果:http://localhost:8000/2016-08-15/proxy/wisejob-class-service/wisejob-class
¶3、通过 .env 文件配置
(1)、在项目目录即template.yml文件所在目录下,创建一个名为.env的文件。
说明
- 建议将 .env 文件放到 .gitignore中,避免泄漏重要的账户信息。
(2)、在 .env 文件录入以下配置:
1 | ACCOUNT_ID=xxxxxxxx |
¶4、部署函数到控制台
1 | fun deploy |
¶三、阿里云控制台注意事项
¶1、自定义域名
操作路径:控制台 -> 函数计算 -> 自定义域名
每个路由的 版本/别名 在开发调试时先选择 LATEST,等待上线时,按照第4条的版本管理,选择别名。
¶2、日志查询
操作路径:控制台 -> 函数计算 -> 服务/函数 -> (选择一个函数)函数列表 -> 函数名称(点击函数名称) -> 日志查询
日志内容包含的内容如:接口url、报错信息
¶3、配置导出
操作路径:控制台 -> 函数计算 -> 服务/函数 -> (选择一个函数)函数列表 -> 函数名称(点击函数名称) -> 概览 -> 导出 -> 导出配置
将导出的 template.yml 文件放到项目中,这样控制台配置的配置项就不会被 deploy 覆盖掉。
注意
- 控制台导出的配置文件可能有部分缺失,需要和本地已有的 template.yml 文件对比,保留部分字段,如:CodeUri
¶4、版本管理
操作路径:控制台 -> 函数计算 -> 服务/函数 -> (选择一个函数)版本管理 -> 别名
(1)上线时可以新建一个版本,并对该版本新建别名且设置别名对应的版本占比,用来在自定义域名中使用(每个路径都选择该别名),在 版本管理 -> 别名 中可对该别名进行版本占比控制,达到灰度发布的效果。
(2)后续迭代时,deploy 后可在 版本管理 中新建一个版本,并在别名中选择该版本的占比。
¶5、环境变量
待补充 https://help.aliyun.com/document_detail/164217.html?spm=a2c4g.11186623.6.629.3e0a283bkc5bnN
¶6、请求环境区分
调用请求时需要区分生产环境和测试环境,可以发布不同的版本,并创建多个触发器,设置触发器指向不同的版本,如下图:
自定义域名中创建两个域名,用来区分环境,路径可按下方示例填写,生产和测试选择不同的版本/别名即可。
¶四、遇到的问题
¶1、regeneratorRuntime is not defined
在代码中使用 async/await 时报错,是 babel 编译的问题,安装babel-plugin-transform-runtime
,
1 | npm i babel-plugin-transform-runtime -D |
然后在 .babelrc 中添加 plugins,重新运行即可。
1 | { |
¶2、使用 … 扩展符
在代码中使用 … 扩展符时本地运行报错,是 babel 编译的问题,安装babel-plugin-transform-object-rest-spread
,
1 | npm i babel-plugin-transform-object-rest-spread -D |
然后在 .babelrc 中添加 plugins,重新运行即可。
1 | { |
¶3、load code for handler:index.handler
本地运行时项目刚启动,调用 POST 接口可能导致程序阻塞(deploy到线上不会阻塞),先调用一次 GET 接口再调用 POST 接口就不会阻塞,原因未知。
¶4、静态文件使用自定义域名
需要每个文件都添加记录,等待后续必须上传到函数计算时,使用打包到 OSS 尝试解决。
¶5、目录过深,运行报错
将项目拷贝到桌面,运行。