什么是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 # (必填) 组件名称,此处为 vpcname: serverless-vpc # (必填) 实例名称inputs:
  region: ${env:REGION} # VPC 的所属地区
  zone: ${env:ZONE} # VPC 所在地区的区域
  vpcName: ${name} # VPC 的名称
  subnetName: ${name} # Subnet 的名称复制代码

部署

serverless deploy复制代码

校验身份,使用腾讯云关联的微信号扫码serverless 入门 腾讯云serverless_serverless

部署成功后可在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 实例外网访问复制代码

serverless.cloud.tencent.com/apps/server…serverless 入门 腾讯云serverless_serverless_02

部署

serverless deploy复制代码

校验身份,使用腾讯云关联的微信号扫码

部署成功后可在https://serverless.cloud.tencent.com/查看部署成功的组件

  • 使用navicat连接

    填写https://serverless.cloud.tencent.com/apps/serverless-db/serverless-db/dev中outputs.public外网访问信息

serverless 入门 腾讯云serverless_serverless_03

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文件夹常常会导致上传不上去,所以在这里需要排除,可以使用两种方法处理:

  1. 使用层管理
  2. 在线安装依赖

这里使用方法2,登录腾讯云。开启自动安装依赖,再点部署

serverless 入门 腾讯云serverless_serverless_04

部署完成后再打开api首页就可以了

serverless 入门 腾讯云serverless_serverless_05

  • 初始化数据库
// 本地安装依赖
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复制代码

serverless 入门 腾讯云serverless_serverless_06

表已建好

serverless 入门 腾讯云serverless_serverless_07

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增删改查serverless 入门 腾讯云serverless_serverless_08