背景
公司内部的PC站页面(www页面),使用了Express+NodeJS对后端资源进行统一请求并渲染,部署在ECS上。由于前段时间接连出现突发请求,使得负载被打满。公司不得不紧急购买了多台ECS进行扩容。同时,我关注到FC对于NodeJS有着相当优秀的支持,基本可以起到秒级启动和秒级扩容。故尝试将项目迁移至FC中。
同时为了解决项目CI/CD的问题,我们同时使用了ServerlessDEV组件并结合云效“流水线”功能,完成了项目的自动打包上线的一系列操作。
需求
- PC站迁移至函数计算,并可通过HTTP访问
- 通过云效流水线进行打包和发布。
过程详解
迁移函数计算
得益于Express框架的易用性,整个代码发布到函数计算上还是比较容易的。在函数计算的“应用”中,有线程的模板。(如果大家嫌自己配置麻烦,不如直接使用该功能进行部署,再参考其s.yaml文件对自己的服务进行配置)
具体的参数配置可以参考下图
关键参数说明
- 内存规格大小:通过ServerlessDEV中的性能工具,测得在1GB的内存规格下,可以得到成本和响应时间的最优值(内存规格继续上升,响应时间只有非常微小的下降;而内存规格下降会导致响应时长大幅上升)
- 启动命令:这里要和项目中package.json内的scripts块相匹配。
- 执行超时时间:由于是一个PC前端应用,执行时间一般不超过5s(超过5s用户会没有等待的耐心)。考虑到一些异常情况,故配置15s。超时会返回504
踩坑说明(注意事项)
- Custom Runtime运行环境,默认HTTP端口为3001,部署时要更改NodeJS的默认端口
- 以前项目是通过nginx进行gzip压缩的,迁移到函数计算后,需要启用NodeJS的gzip压缩配置,不然后期流量会很喜人(压缩后流量约为压缩前流量的1/5)
使用流水线进行发布
完成部署后,就要去搞定流水线发布了。(总不见得每次都黏贴代码吧)。好在通过ServerlessDev能够完成一些CI\CD操作,同时“流水线”内又内置了对ServerlessDev组件的支持。我们只需要准备对应函数的s.yaml文件即可。
文件如下(已经做了脱敏):
edition1.0.0services cn-hangzhou-lyh_dt_pc-main component devsapp/fc props region cn-hangzhou service description pc站(生产环境) role acs ram 11111111 role/AliyunFcDefaultRole logConfig project aliyun-fc-cn-hangzhou-1111111 logstore function-log enableRequestMetricstrue enableInstanceMetricstrue logBeginRule DefaultRegex vpcConfig vpcId vpc-1111111 securityGroupId sg-1111111 anytunnelViaENI null vswitchIds vsw-1111111 vsw-2222222 vsw-3333333 internetAccesstrue tracingConfig Enable name test_pc function runtime custom handler index.handler timeout15 memorySize1024 environmentVariables instanceConcurrency20 caPort3001 instanceType e1 customRuntimeConfig command npm args run start:prd name main codeUri'.' triggersname defaultTrigger description'' type http qualifier LATEST config methods GET POST PUT DELETE HEAD OPTIONS PATCH authType anonymous
直接使用流水线进行发布配置,他会自动进行打包。配置的步骤如下:
步骤:Node.js构建及部署
这里面分2部:
- NodeJS构建
- ServerlessDev构建上传(部署)
其中:
- 构建命令较为简单,就是普通的打包命令
npminstall
- ServerlessDev构建上传(部署)相对复杂。需要完成账户配置+发布
sconfigadd--AccessKeyID${FC_AK}--AccessKeySecret${FC_SK}-adefault-fsdeployfunction--use-local-ts.yaml
结束语
至此,我们完成了通过函数计算部署NodeJS.