什么是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: 部署成功后的输出字段
VPC完整配置
component: vpc # (必填) 组件名称,此处为 vpc
name: 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
postgreSql完整配置
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 实例外网访问
https://serverless.cloud.tencent.com/apps/serverless-vpc/serverless-vpc/dev
部署
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: egg
name: serverless-api
inputs:
src:
src: ./
exclude: # 被排除的文件或目录
- .env
- node_modules
functionName: ${name}
region: ${env:REGION}
runtime: Nodejs10.15
functionConf: # 函数配置相关
timeout: 30
vpcConfig:
vpcId: vpc-xxx # VPC 的 ID 这里填写刚部署好的VPC的outputs.vpcId
subnetId: subnet-xxx # Subnet 的 ID 这里填写刚部署好的VPC的outputs.subnetId
environment: # 环境变量
variables:
PG_CONNECT_STRING: postgresql://xxx # 这里填写刚部署的db outputs.private.connectionString
apigatewayConf: # api网关配置
enableCORS: true
protocols:
- 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: website
name: serverless-vue
inputs:
region: ${env:REGION}
bucketName: ${name} # COS Bucket 名称。 不允许大写字母。如果你不加 AppId 后缀,则默认自动会为你加上。
src:
src: ./
hook: npm run build # 钩子脚本。在你项目代码上传之前执行。
dist: ./dist
envPath: ./
index: index.html # 网站 index 页面
error: index.html
env: # 配置前端环境变量
apiUrl: https://xxx # 这里填写后端api地址
// 部署
serverless deploy
打开页面,可操作相应的user增删改查
参考链接
腾讯云serverless控制台
腾讯云serverless framework文档
部署 Vue + Express + PostgreSQL 全栈网站