>> 快来免费下载|电子书《五天玩转 EMAS Serverless》 <<

点击免费下载

《五天玩转 EMAS Serverless》

EMAS Serverless 是什么

EMAS Serverless 是阿里云供给的根据 Serverless 技能的一站式后端开发渠道,为开发者供给高可用、弹性伸缩的云开发服务,包括云函数、云数据库、云存储、静态网站保管等功能,协助开发者及企业客户快速完结一云多端运用的建立,您无需办理服务器等根底设施,便能够无缝对接丰富的云资源。

一文搞懂EMAS Serverless小程序开发|电子书免费下载

图 1 EMAS Serverless 产品架构

EMAS Serverless 运用场景

ES 支持云函数、云数据库、云存储等才能,具有弹性伸缩、按量付费、 免运维三大特色。弹性伸缩让您免于频频运维扩缩机器,轻松应对各种流量突发事件,为您节约很多时间。按量付费做到用多少付多少,函数计费精确到毫秒,为您节约很多开支。免运维让开发者不必花费更多的精力在服务器等底层资源上,而是能够将精力放在更具价值的事务逻辑上。因此 ES 广泛适用于电商、咨询、旅游、企业展现、社区、餐厅等职业场景。

一文搞懂EMAS Serverless小程序开发|电子书免费下载
图 2 EMAS Serverless 运用场景

开通产品

首要翻开 EMAS 阿里云操控台:https://emas.console.aliyun.com,新建并进入项目。然后挑选渠道服务并创立一个服务空间。如图 3 和图 4 所示:

一文搞懂EMAS Serverless小程序开发|电子书免费下载

图 3 EMAS 操控台首页 —— 项目办理

一文搞懂EMAS Serverless小程序开发|电子书免费下载

图 4 选中渠道服务并创立服务空间

计费办法

支持按量付费和包年包月两种付费办法。

  • 按量付费(后付费):一种后付费形式,即先运用再付费。一般适用于有爆发事务量的运用或服务。
  • 包年包月(预付费):一种预付费形式,即先付费再运用。经过包年包月,您能够提前预留资源,同时享用更大的价格优惠,帮您更大程度节约支出。

按量付费

模块 计费项 单价(按量付费)
云函数 资源运用量(GBs) 0.000110592
调用次数(万次) 0.0133
出网流量(GB) 0.8
云数据库 容量(GB / 天) 0.07
读操作数(万次) 0.015
写操作数(万次) 0.05
云存储 容量(GB / 天) 0.0043
下载操作次数(万次) 0.01
上传操作次数(万次) 0.01
CDN 流量(GB) 0.18
静态网站保管 容量(GB / 天) 0.0043
CDN 流量(GB) 0.18

包年包月

套餐标准 价格(元 / 月) 套餐描述
开发者版 Free 适合练习、项目开发、发动初期运用。
根底版 5 咱们供给了多种标准的套餐,您能够根据事务规模、项目发展阶段按需挑选,并随同事务的增加进行套餐升配。
标准版 24
专业版 82
企业版 316
旗舰版 688

具体的套餐资源量请参阅help.aliyun.com/document_de…

装置 SDK

咱们以开发支付宝小程序为例,演示如何快速凭借 ES 才能快速开发布置。

  1. 首要运转在小程序项目根目录履行以下指令。
npm install --save @alicloud/mpserverless-sdk

微信或者支付宝小程序还有一些特殊装备,具体请参阅:help.aliyun.com/document_de…

初始化 SDK

在小程序端开始运用 Serverless 服务前,需要先调用mpserverless.init办法完结服务的初始化,且仅能初始化一次。较为通用的做法是在onLaunch生命周期中进行初始化操作,并将实例目标mpserverless挂载到小程序的大局目标App,以便后续在其他文件中调用。

这儿演示运用的是匿名初始化,这种初始化办法无需在支付宝敞开渠道装备密钥,不过同时也无法获取小程序用户身份。更多细节请参阅:help.aliyun.com/document_de…

// app.js
import MPServerless from '@alicloud/mpserverless-sdk'
const mpserverless = new MPServerless(my, {
    appId: '小程序 AppID',
    spaceId: '服务空间 SpaceId',
    clientSecret: '服务空间 Secret',
    endpoint: '服务空间 API Endpoint'
});
App({
    mpserverless: mpserverless,
    onLaunch() {
        mpserverless.init(
          authorType: 'anonymous'
        );
    },
});

云函数

云函数(FaaS)是一段运转在云端的、轻量的、无关联的而且可重用的代码。无需办理服务器,只需编写和上传代码,即可取得对应的数据成果。云函数的入参只要一个ctx目标,出参结构由开发者自行界说:

// 云函数入口界说在 index.js 中
module.exports = async ctx => {
  // do something
  return result
}

ctx目标结构

字段 类型 含义
ctx.args Object? 开发者经过 SDK 调用云函数时传入的参数体。例如:mpserverless.function.invoke ( ‘function-name’,args)HTTP 触发和守时任务触发的入参结构稍有不同,请参阅官方文档。
ctx.logger function 日志东西,能够打印不同类型的日志信息,然后在云函数操控台中查看履行日志。- info
  • warn
  • error
  • debug | | ctx.mpserverless | SDK | 在云函数中为您供给已经完结初始化的mpserverless目标,让您能够持续调用 Serverless 其他根底服务,API 运用办法和客户端基本一致。 | | ctx.env | Object | 在云函数中经过ctx.env来获取环境参数,例如 SpaceId、调用来历、客户端源 IP 和客户端 UserAgent 等信息。- MP_SPACE_ID服务空间 ID
  • MP_SOURCE调用来历- – server:服务端触发
    • function:云函数触发
    • client:客户端触发
    • http:HTTP 触发
    • timing:守时触发- MP_USER_AGENT客户端标志,仅来自客户端的调用包括该字段
  • MP_CLIENT_IP客户端 IP,仅来自客户端的调用包括该字段
  • MP_APP_ID小程序 AppId,客户端非匿名授权后调用云函数包括该字段 | | ctx.httpclient | HttpClient | 经过该目标能够请求任何 HTTP 和 HTTPS 协议的 Web 服务。例如:ctx.httpclient.request (‘https://***’) |

开发布置与调试

咱们以开发一个两数四则运算的云函数TwoNumOperation为例:

// index.js
module.exports = async ctx => {
    const { action, x, y } = ctx.args;
    let result = 0
    switch (action) {
        case '+': result = x + y; break;
        case '-': result = x - y; break;
        case '*': result = x * y; break;
        case '/':
            if (y === 0) {
                throw new Error('cannot divide by 0')
            }
            result = x / y; break;
        default:
            throw new Error('not support action ' + action)
    }
    return { result }
}

新建文件夹TwoNumOperation,然后在文件夹下面新建文件 index.js 并放入上述代码,然后全体打包该文件夹得到压缩文件 TwoNumOperation.zip 。如下图 5 所示:

一文搞懂EMAS Serverless小程序开发|电子书免费下载

图 5 云函数代码包

如下图 6 所示,首要咱们在阿里云操控台新建一个云函数 TwoNumOperation,函数称号必须和文件夹称号一致。然后将压缩好的代码包上传、布置。布置成功后能够在操控台测试运转,点击代码履行,输入函数履行参数即可运转云函数。点击日志能够查看云函数的履行日志,方便开发者调试。

一文搞懂EMAS Serverless小程序开发|电子书免费下载

图 6 云函数布置、履行、日志查看

在小程序中调用云函数

如图 7 所示在小程序中调用云函数。index.axml布局文件简略写了一个表单包括三个 input,绑定表单提交函数invokeFunctionindex.js文件首要从大局导入mpserverless目标,然后在表单提交函数中获取参数actionxy,然后经过mpserverless.function.invoke调用云函数。

一文搞懂EMAS Serverless小程序开发|电子书免费下载

图 7 在小程序中调用云函数

云数据库

云数据库服务是根据 MongoDB 保管在云端的数据库,数据以 JSON 格局存储。作为开发者,您能够在客户端或者云函数中经过mpserverless目标读写数据。

mpserverless.db.collection('user').findOne( { name: '张三' } )

和 MySQL 比照

ES 云数据库服务底层运用的是 MongoDB,以 JSON 格局存储数据。数据库中的每条记载都是一个 JSON 格局的文档,一个数据库能够包括多个调集(相当于联系型数据库中的表),每个调集可看做一个 JSON 文档数组。MongoDB 数据库和联系型数据库 MySQL 的比照如下表所示。

云数据库 (MongoDB) 联系型数据库 (MySQL)
数据库(database) 数据库(database)
表(collection) 表(table)
记载(document) 行(row)
域(field) 列(column)
索引(index) 索引(index)
主动将_id字段作为主键 主键(primary key)

数据结构规划战略

MongoDB 是一个根据分布式文件存储的 NoSQL 数据库,旨在为 WEB 运用供给可扩展的高性能数据存储解决方案。以电商渠道为例,一般电商渠道的中心数据包括产品、用户、购物车和订单。订单是由用户购买产品发生的,订单就能够认为是产品和用户之间的关联联系发生的。在订单发生之前,产品和用户之间的关联联系是经过购物车来保持的。针对上述案例,能够规划一个称号为 products 的产品表存储以下信息:

  • 产品根底信息:包括展现信息、产品标准等;
  • 特点信息:特点都归属于一个产品,属于 N 对 1 的联系。因此作为子文档存储在 products 调集中较适宜;
  • 库存及价格信息:库存不仅仅跟产品关联,更直接对应产品特点。因此也应该放在 products 调集中;
{
  "id": 5573,
  "name": "Egg T恤",
  "desc": {
    "short": "限量版 Egg T恤,穿上它你离极客也不远了",
    "long": "这是一段非常长的描述",
    "category": {
      "_id": "48bf43a..29e90bc",
      "name": "上衣"
    }
  },
  "attributes": [
    {
      "id": 1151,
      "name": "尺寸",
      "values": [
        {
          "id": 3871,
          "value": "S"
        },
        {
          "id": 3874,
          "value": "M"
        },
        {
          "id": 3875,
          "value": "L"
        }
      ]
    },
    {
      "id": 1152,
      "name": "性别",
      "values": [
        {
          "id": 3872,
          "value": "男"
        },
        {
          "id": 3873,
          "value": "女"
        }
      ]
    }
  ],
  "sku": [
    {
      "id": 1153,
      "stock": 30,
      "attributeIds": [
        3871,
        3872
      ],
      "attributes": [
        {
          "key": "尺寸",
          "value": "S"
        },
        {
          "key": "性别",
          "value": "女"
        }
      ]
    }
  ]
}

创立数据表

在阿里云操控台上点击 “+” 新建数据表

一文搞懂EMAS Serverless小程序开发|电子书免费下载

图 8 在操控台新建数据表

增加数据记载

insertOne

刺进用户张三

mpserverless.db.collection('users').insertOne( {
    name: '张三',
    age: 18
} )

insertMany

mpserverless.db.collection('users').insertOne( [
    { name: '张三', age: 18 },
    { name: '李四', age: 17 }
] )

删去数据记载

deleteOne

mpserverless.db.collection('users').deleteOne( {
    name: '张三'
} )

deleteMany

删去年纪小于 18 的用户

mpserverless.db.collection('users').deleteMany( {
    age: { $lt: 18 }
} )

查询数据记载

findOne

mpserverless.db.collection('users').findOne( {
    age: { $gt: 18 }
} )

find

查询一切大于 18 的用户 name,并将查询成果按年纪升序回来

mpserverless.db.collection('users').find( {
    age: { $gt: 18 }
}, {
    projection: { name: 1 },
    sort: { age: 1 }
} )

findOneAndDelete

查询并删去小于且最接近 18 岁的一条数据

mpserverless.db.collection('users').findOneAndDelete( {
    age: { $lt: 18 }
}, {
    sort: { age: -1 }
} )

findOneAndReplace

查询并替换 name 为张三的一条数据

mpserverless.db.collection('users').findOneAndReplace( {
    name: "张三"
}, {
    name: "张三三",
    age: 20
}, {
    upsert: true // 如果不存在则刺进
} )

findOneAndUpdate

查询并更新 name 为张三的一条数据

mpserverless.db.collection('users').findOneAndUpdate( {
    name: "张三"
}, {
    $set: {
        name: "张三三",
        age: 20
    }
}, {
    upsert: true // 如果不存在则刺进
} )

更新数据记载

updateOne

更新第一个张三的年纪为 22 岁

mpserverless.db.collection('users').updateOne( {
    name: "张三"
}, {
    $set: {
        age: 22
    }
} )

updateMany

把一切的张三年纪都设置为 22 岁

mpserverless.db.collection('users').updateMany( {
    name: "张三"
}, {
    $set: {
        age: 22
    }
} )

replaceOne

把第一个张三姓名改为张阿三,年纪改为 22 岁

mpserverless.db.collection('users').replaceOne( {
    name: "张三"
}, {
    $set: {
        name: '张阿三',
        age: 22
    }
}, {
    upsert: true // 如果不存在则刺进,为 flase 时代表不存在则不做任何操作
} )

其他指令

distinct

回来 age 字段大于 18 的一切姓名(如果有相同的 name 只回来一个)

mpserverless.db.collection('users').distinct(
    'name', 
    { age: { $gt: 18 }
)

count

查找调集 users 中一切 age 大于 18 的记载数量

mpserverless.db.collection('users').count( {
    age: { $gt: 18 }
} )

aggregate

聚合管道查询,该管道答应用户经过一系列根据阶段的操作来处理数据,详情请参阅协助文档help.aliyun.com/document_de…

云存储

mpserverless.file目标供给uploadFiledeleteFile办法办理文件。上传的文件将经过 CDN 进行网络加快。单个文件要求小于 100 MB。

上传文件

支付宝小程序上传文件示例

my.chooseImage({
    chooseImage: 1,
    success: res => {
        const path = res.apFilePaths[0];
        const options = {
            filePath: path,
        };
        mpserverless.file.uploadFile(options)
        .then(res => { 
            console.log(res);  
        })
        .catch(err => {  
            console.log(err);
        });
    },
});

回来示例:

{
    "fileUrl": "https://mp-…storage/2e7acad6-2212-4863-aaa7-4e89d7d8df4c.png", 
    "filePath": "cloudstorage/2e7acad6-2212-4863-aaa7-4e89d7d8df4c.png"
}

删去文件

根据文件地址从服务空间中删去该文件

const fileURL = '';
mpserverless.file.deleteFile(fileURL)

总结

EMAS Serverless 依托阿里巴巴数字经济技能才能和事务才能供给云函数、云存储、云数据库等 Serverless 服务。大大提升了前端工程师的价值,让开发者快速落地小程序开发作业,按量付费和主动弹性伸缩省时省力。此外, ES 还支持静态网站保管以及面向支付宝生态的云调用模块,技能与商业联动为开发者供给一站式地小程序生态服务。

参阅资料

EMAS 操控台:emas.console.aliyun.com

协助文档:help.aliyun.com/document_de…

开发指南:help.aliyun.com/document_de…

>> 快来免费下载|电子书《五天玩转 EMAS Serverless》 <<