什么是Serverless
要说Serverless是什么,直译过来就是无服务器。根据 CNCF 的定义,Serverless 是指构建和运行不需要服务器管理的应用程序的概念。
CloudFlare对其定义:
无服务器计算是一种按需提供后端服务的方法。无服务器提供程序允许用户编写和部署代码,而不必担心底层基础结构。从无服务器供应商处获得后端服务的公司将根据其计算费用,而不必保留和支付固定数量的带宽或服务器数量,因为该服务是自动扩展的。请注意,尽管称为无服务器,但仍使用物理服务器,但开发人员无需了解它们。
运维的三个阶段:
物理服务器
云服务器
无服务器(serverless)
serverless是否是下一代云计算?
优点:轻运维、低成本、弹性伸缩,按量付费
缺点:需要使用云服务商的配套服务、冷启动
实践:部署一个Vue+Egg+PostgreSql的serverless应用
1.首先需要在腾讯云注册账号
2.安装serverless framework
为了部署完整的项目,我们这里不单讨论云函数,直接使用serverless框架
npm install -g serverless复制代码
- 这里主要参考了最佳实践fullstack-app,为了更好的了解各个组件的配置运行机制,这里将每个组件拆分进行部署
3.部署私有网络VPC
私有网络VPC可以串联各项云服务,可以使后端服务和数据库在同一私网内,使之能够连接数据库
mkdir vpc; cd vpc touch serverless.yaml复制代码
serverless.yaml是serverless framework的配置文件
大致结构为
公共部分,例如component、name等字段
inputs:部署组件需要的字段
outputs: 部署成功后的输出字段
component: vpc # (必填) 组件名称,此处为 vpcname: serverless-vpc # (必填) 实例名称inputs: region: ${env:REGION} # VPC 的所属地区 zone: ${env:ZONE} # VPC 所在地区的区域 vpcName: ${name} # VPC 的名称 subnetName: ${name} # Subnet 的名称复制代码
部署
serverless deploy复制代码
校验身份,使用腾讯云关联的微信号扫码
部署成功后可在https://serverless.cloud.tencent.com/查看部署成功的组件
4.部署PostgreSql数据库
至于为什么不使用mysql,因为腾讯云现在只有pgsql推出了serverless版本
mkdir db; cd db touch serverless.yaml复制代码
component: postgresql #(必填) 引用 component 的名称,当前用到的是 postgresql 组件name: serverless-db # (必填) 该 postgresql 组件创建的实例名称inputs: region: ${env:REGION} zone: ${env:ZONE} dBInstanceName: ${name} # 数据库实例名称,对一用户必须唯一 vpcConfig:vpcId: vpc-xxx # VPC 的 ID 这里填写刚部署好的VPC的outputs.vpcId(见下图)subnetId: subnet-xxx # Subnet 的 ID 这里填写刚部署好的VPC的outputs.subnetId extranetAccess: true # 是否开启 serverlessDB 实例外网访问复制代码
serverless.cloud.tencent.com/apps/server…
部署
serverless deploy复制代码
校验身份,使用腾讯云关联的微信号扫码
部署成功后可在https://serverless.cloud.tencent.com/查看部署成功的组件
使用navicat连接
填写https://serverless.cloud.tencent.com/apps/serverless-db/serverless-db/dev中outputs.public外网访问信息
5.部署后端Eggjs
后端api使用的是egg.js + sequelize,这里可以使用现成的案例
git clone https://gitee.com/logicadi/serverless-egg.git复制代码
修改serverless.yaml配置 查看全量配置
component: eggname: serverless-apiinputs: src:src: ./exclude: # 被排除的文件或目录 - .env - node_modules functionName: ${name} region: ${env:REGION} runtime: Nodejs10.15 functionConf: # 函数配置相关timeout: 30vpcConfig: vpcId: vpc-xxx # VPC 的 ID 这里填写刚部署好的VPC的outputs.vpcId subnetId: subnet-xxx # Subnet 的 ID 这里填写刚部署好的VPC的outputs.subnetIdenvironment: # 环境变量 variables:PG_CONNECT_STRING: postgresql://xxx # 这里填写刚部署的db outputs.private.connectionString apigatewayConf: # api网关配置enableCORS: trueprotocols: - http - https复制代码
部署
serverless deploy复制代码
从面板点击链接打开api首页,发现报错,是因为没有安装依赖
node_modules文件夹常常会导致上传不上去,所以在这里需要排除,可以使用两种方法处理:
- 使用层管理
- 在线安装依赖
这里使用方法2,登录腾讯云。开启自动安装依赖,再点部署
部署完成后再打开api首页就可以了
- 初始化数据库
// 本地安装依赖 npm install复制代码
使用sequelize初始化数据库
// database/config.json{ "development": {"url": "postgresql://xxx",// 填写db外网地址 db outputs.public.connectionString"dialect": "postgres" } }复制代码
执行数据库脚本
# 升级数据库npx sequelize db:migrate# 如果有问题需要回滚,可以通过 `db:migrate:undo` 回退一个变更# npx sequelize db:migrate:undo# 可以通过 `db:migrate:undo:all` 回退到初始状态# npx sequelize db:migrate:undo:all复制代码
表已建好
6.部署前端Vue
推荐使用现有模板。前端静态文件是使用的对象存储COS部署
git clone https://gitee.com/logicadi/serverless-vue.git复制代码
website组件配置 全量配置
component: websitename: serverless-vueinputs: region: ${env:REGION} bucketName: ${name} # COS Bucket 名称。 不允许大写字母。如果你不加 AppId 后缀,则默认自动会为你加上。 src:src: ./hook: npm run build # 钩子脚本。在你项目代码上传之前执行。dist: ./distenvPath: ./index: index.html # 网站 index 页面error: index.html env: # 配置前端环境变量apiUrl: https://xxx # 这里填写后端api地址复制代码
// 部署 serverless deploy复制代码
打开页面,可操作相应的user增删改查