serverless笔记

165 阅读5分钟

一. 本地环境

  1. sudo npm i -g @cloudbase/cli

  2. tcb -v查看版本,确认是否安装成功

  3. tcb login 登陆授权

  4. 找到自己的工作目录运行 tcb new

  5. 关联已有环境或者新建

  6. 输入项目名称,例如: test 就会下载云函数模版代码

就会在工作目录看到一个 test目录,其中 node-app时云函数的名字

node-app/index.js随便修改一点

  1. 在test目录下, 输入 tcb 部署,可以在腾讯云中看到多了一个node-app云函数

  2. test目录下创建触发器 tcb service create -- 选择 -- 服务路径 -- 生成访问路径

  3. 修改本地函数, 下次就直接 tcb 部署了

二. 本地测试

  1. scf/cli

sudo npm install scf-cli -g

  1. scf --version查看版本

  2. test目录, scf init

  3. 输入相对路径 ./functions/node-app

  4. main - 3 - http

三. express与云函数

  1. node-app目录下安装 express

  2. node-app新建app.js

const express = require('express')
const app = express() 
app.use('/users', (req, res) => {
   res.send('users')
})
module.exports = app
  1. node-app启动文件www.js
const app = require('./app')
app.listen(3000)
  1. 用以上www.js启动存在本地请求路径跟云函数请求路径不一致问题

image.png

  1. 解决:使用 severless-http 不需要服务器和端口监听

  2. node-app安装serverless-http

//node-app/index.js

const serverless = require('serverless-http')
const app = require('./app')
const handler = serverless(app)

// 返回输入参数
exports.main = async (event, context) => {
    const res = await handler(event, context)
    return res
}
  1. test目录下tcb部署,查看,访问服务中有访问路径 https://域名/app/users

  2. 但是本地还是执行的www.js查看...

三. 简单todo案例

路由定义/todo

本地访问: http://localhost:3000/todo

云: https://域名/app/todo

每一个云环境只有一个数据库实例,每个实例可以创建多个集合,存放多个json格式对象(称为记录)

使用数据库

  1. node-app目录下安装 npm i @cloudbase/node-sdk

  2. todo.js连接数据库

const cloudBase = require("@cloudbase/node-sdk")
const cloudDb = cloudBase.init({
  env: "envId", //环境总览中的环境id
  secretId: "",
  secretKey: "", //访问控制中密钥中获取
});
const app = cloudDb.database()

router.get('/', async (req, res) => {
    const data = await app.collection('todo').get() //测试语句,获取成功
    res.send(data)
})

  1. 增删改
//增
app.collection('todo').add({title: 'hello node'})

//改
app.collection('todo').doc(req.query.id).update({title:'hi'})

//删
app.collection('todo').doc(req.query.id).delete()

vue客户端请求云函数

全局安装

npm install -g @vue/cli-service-global

vue create vue-demo (搜索vue快速原型开发 vue serve启动),快速启动一个vue demo

async getData() {
        const res = await axios({
            url: 'https://域名/app/todo'
        })
        console.log(res) //可以获取到数据了
},

总结: 以上都是简单书写,下面

FaaS运行机制

faas执行阶段

  1. 代码下载 faas不会存储代码,将函数放在对象存储中,需要执行时,会从对象存储中下载解压,因此faas对代码大小有限制(50M)

  2. 启动容器 faas根据函数配置,启动对应容器,faas使用容器进行资源隔离

  3. 初始化环境 分析代码依赖,执行用户初始化的逻辑,初始化入口函数之外的代码等

  4. 运行代码

第一次执行会完整经过这四个步骤,前三个阶段称为冷启动,最后一步叫热启动

函数运行完毕后,运行环境会保留一段时间,如果这段时间内(时间长短根据云厂商设置),函数需要再次执行,faas会使用上次的运行环境,这就是执行上下文重用,也就是实例复用,函数在这个启动过程,叫热启动,热启动的耗时,完全就是启动函数的耗时.

一段时间没有请求,函数运行环境被释放,直到下一次事件到来,重新从冷启动开始进行初始化.

需要保证云函数的无状态性, 也就是当前云函数的执行不能依赖上一次云函数执行过程残留的信息的. 上面todo案例中,将所有的逻辑处理放到一个云函数中,处理并发量受到了极大的限制,当并发量到一定程度,无法创建新的函数实例了,无法分配更多的服务器资源,所以应该拆分,一个云函数对应一个业务逻辑.

cloudbase framework 对 todo重构

  1. tcb new -- 上海 - lq - vue应用 - todos

  2. cd todos, npm i

  3. cd cloudfunctions/vue-echo, npm i

  4. cloudbaserc.json

"functionRoot": "cloudfunctions", //云函数所在路径

"version": "2.0", //支持.env文件 使用 "{{env.ENV_ID}}"

插件配置信息:

“framework" - "plugins" - "client"

"use": "@cloudbase/framework-plugin-website",
"inputs": {
  "buildCommand": "npm run build",
  "outputPath": "dist",
  "cloudPath": "/vue",
  "envVariables": {
    "VUE_APP_ENV_ID": "{{env.ENV_ID}}"
  }
}

静态站点插件,打包并上传到静态资源那里

本地执行tcb,自动执行 npm run build,打包后生成dist目录,传到静态站点/vue目录下

framework" - "plugins" - "server" name云函数名,可以进行修改,那么目录也需要修改

  1. tcb, 查看静态网站托管 访问默认域名: https://域名/vue/

  2. todo目录下,只更新某个云函数 tcb fn code update getTodo

云函数下多了个一个getTodo,但是没有触发器

  1. cloudbase-vue 使用@cloudbase/vue-provider

本项目已安装,修改main.js

Vue.use(Cloudbase, { env: envId, //环境纵览中的环境id region: 'ap-shanghai' });

  1. 根目录本地运行 npm run serve

基础代码(pdf)

App.vue中

<router-link to='/'>...
<router-link to='/login'>...
<router-link to='/register'>...

npm i @cloudbase/js-sdk

部署

  1. todos, tcb全量部署,访问返回域名

  2. 绑定自定义域名

申请证书:

  • 申请免费证书
  • 写一个二级域名 lg.xxx.com
  • 验证,给出了记录,去阿里云服务商:添加记录
  • 完成
  1. 填写域名及证书

  2. 阿里云服务商:添加记录 CName

  3. 可以访问自定义域名了