这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战
很多开发者一定多少听过 Serverless Framework。既用更少的服务架构,甚至是无服务器,去实现整个工程的开发。开发者不需要关心底层资源、性能等问题,就可以部署完整的 Serverless 应用。这篇文章的场景,是通过腾讯云提供的 Serverless Framework 搭建并部署一个 Egg.js 应用的实战教程。
Serverless 的应用场景
基于云函数的开发
腾讯云提供的 Serverless Framework,可以让开发者通过命令行或者控制台的方式进行开发、部署和调试应用,结合腾讯云的云函数、API 网关以及数据库等资源,可以完整的开发、部署全栈应用。 腾讯云的云函数有两种,事件型和 web 型,前者支持多种触发方式,例如网关触发、定时触发、COS 资源触发和消息中间件等,而后者目前仅支持 API 网关触发。
传统项目的快速迁移
倘若需要将现有的项目快速迁移至 Serverless Framework,例如 Egg、Koa 等,只需要通过几行代码的改造即可快速迁移。
快速搭建并部署
这里采用的是命令行的方式进行搭建和部署,在此之前需要拥有腾讯云账号并完成实名认证,建议在开始前仔细阅读相关产品的文档。
确认环境
安装腾讯云提供的 Serverless Framework,需要确保你的开发环境拥有 Node10 以上的版本和 Npm。
$ node -v
v12.18.0
$ npm -v
7.0.10
安装 serverless
npm install -g serverless
搭建 Egg 应用
根据 Egg.js 官方文档,本地初始化一个项目,示例:
npm init egg --type=simple
npm install
在项目根目录启动命令,运行项目
npm run dev
open http://localhost:7001
编写 serverless.yml
Serverless Framework 通过项目配置文件 serverless.yml 完成应用的类型识别与资源配置,本地开发完成后的项目,必须先配置 yml 文件,才可以通过运行 sls deploy 命令,将 serverless.yml 中的配置文件和 inputs 中指定参数或代码目录会都被传入 Serverless Components 部署引擎中,从而完成云端部署。启动部署命令时,serverless 会根据配置自动的创建相关服务并部署,一个基础的 yml 文件如下:
#serverless.yml
app: expressDemoApp # 应用名称,默认为与组件实例名称
stage: ${env:STAGE} # 用于开发环境的隔离,默认为dev
component: express # (必填) 引用 component 的名称,当前用到的是 express-tencent 组件
name: expressDemo # (必填) 组件创建的实例名称
inputs:
src:
src: ./
exclude:
- .env
region: ap-guangzhou
runtime: Nodejs10.15
但这只是自动部署了一个 Serverless 应用,需要配置事件型的云函数,还要配置网关触发,具体如下: 配置云函数
functionName: xxx
functionConf:
eip: false # 是否固定出口 IP
timeout: 10 # 函数最长执行时间,单位为秒,可选值范围 1-900 秒,默认为 3 秒
memorySize: 128 #函数运行时内存大小,默认为 128M,可选范围 64、128MB-3072MB,并且以 128MB 为阶梯
配置 API 网关,这里额外配置了认证方式为应用认证,并关联授权对应的 app 应用,app 应用需要在腾讯云 API 网关控制台创建并获取。
serviceName: xxx
apigatewayConf:
isDisabled: false # 关闭自动创建 API 网关功能。默认值为否,即默认自动创建 API 网关。
serviceTimeout: 60 # Api 超时时间,单位: 秒
protocols: # 前端请求的类型,如 http,https,http 与 https
- http
- https
environment: release # 发布环境. 目前支持三种发布环境: test(测试), prepub(预发布) 与 release(发布)
enableCORS: false, # 开启跨域。默认值为否
autoCreateDns: false
endpoints:
- path: /
method: ANY
authType: APP
responseType: JSON
function:
isIntegratedResponse: true
functionQualifier: $LATEST
functionName: xxx
app:
name: xxx
id: app-xxx
description: xxx
命令行部署
在控制台执行以下命令即可部署上云,系统会自动配置云函数和 API 网关,部署后可以在控制台查看应用详情和网关入口。
sls deploy
如果没有在 .env 中配置 Secretid 和 Secretkey,那么在部署是需要扫码授权,授权后会生成临时的 Secretid 和 Secretkey。 也可以在部署时查看具体的日志信息
sls deploy --debug