共计 5830 个字符,预计需要花费 15 分钟才能阅读完成。
点击收费下载《五天玩转 EMAS Serverless》
EMAS Serverless 是什么
EMAS Serverless 是阿里云提供的基于 Serverless 技术的一站式后端开发平台,为开发者提供高可用、弹性伸缩的云开发服务,蕴含云函数、云数据库、云存储、动态网站托管等性能,帮忙开发者及企业客户疾速实现一云多端利用的搭建,您无需治理服务器等基础设施,便能够无缝对接丰盛的云资源。
图 1 EMAS Serverless 产品架构
EMAS Serverless 利用场景
ES 反对云函数、云数据库、云存储等能力,具备弹性伸缩、按量付费、免运维三大特点。弹性伸缩让您免于频繁运维扩缩机器,轻松应答各种流量突发事件,为您节俭大量工夫。按量付费做到用多少付多少,函数计费准确到毫秒,为您节俭大量开销。免运维让开发者不必破费更多的精力在服务器等底层资源上,而是能够将精力放在更具价值的业务逻辑上。因而 ES 宽泛实用于电商、征询、游览、企业展现、社区、餐厅等行业场景。
开明产品
首先关上 EMAS 阿里云控制台:https://emas.console.aliyun.com,新建并进入我的项目。而后抉择平台服务并创立一个服务空间。如图 3 和图 4 所示:
计费形式
反对按量付费和包年包月两种付费形式。
● 按量付费(后付费):一种后付费模式,即先应用再付费。个别实用于有暴发业务量的利用或服务。
● 包年包月(预付费):一种预付费模式,即先付费再应用。通过包年包月,您能够提前预留资源,同时享受更大的价格优惠,帮您更大程度节俭收入。
按量付费
包年包月
装置 SDK
咱们以开发支付宝小程序为例,演示如何疾速借助 ES 能力疾速开发部署。
首先运行在小程序我的项目根目录执行以下命令。
npm install --save @alicloud/mpserverless-sdk
微信或者支付宝小程序还有一些非凡配置,具体请参考:https://help.aliyun.com/docum…
初始化 SDK
在小程序端开始应用 Serverless 服务前,须要先调用 mpserverless.init 办法实现服务的初始化,且仅能初始化一次。较为通用的做法是在 onLaunch 生命周期中进行初始化操作,并将实例对象 mpserverless 挂载到小程序的全局对象 App,以便后续在其余文件中调用。
这里演示应用的是匿名初始化,这种初始化形式无需在支付宝开放平台配置密钥,不过同时也无奈获取小程序用户身份。更多细节请参考:https://help.aliyun.com/docum…
// 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 对象构造
开发部署与调试
咱们以开发一个两数四则运算的云函数 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 所示:
如下图 6 所示,首先咱们在阿里云控制台新建一个云函数 TwoNumOperation,函数名称必须和文件夹名称统一。而后将压缩好的代码包上传、部署。部署胜利后能够在控制台测试运行,点击代码执行,输出函数执行参数即可运行云函数。点击日志能够查看云函数的执行日志,不便开发者调试。
在小程序中调用云函数
如图 7 所示在小程序中调用云函数。index.axml 布局文件简略写了一个表单蕴含三个 input,绑定表单提交函数 invokeFunction。index.js 文件首先从全局导入 mpserverless 对象,而后在表单提交函数中获取参数 action、x、y,而后通过 mpserverless.function.invoke 调用云函数。
云数据库
云数据库服务是基于 MongoDB 托管在云端的数据库,数据以 JSON 格局存储。作为开发者,您能够在客户端或者云函数中通过 mpserverless 对象读写数据。
mpserverless.db.collection('user').findOne({ name: '张三'} )
和 MySQL 比照
ES 云数据库服务底层应用的是 MongoDB,以 JSON 格局存储数据。数据库中的每条记录都是一个 JSON 格局的文档,一个数据库能够蕴含多个汇合(相当于关系型数据库中的表),每个汇合可看做一个 JSON 文档数组。MongoDB 数据库和关系型数据库 MySQL 的比照如下表所示。
数据结构设计策略
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": "女" | |
} | |
] | |
} | |
] | |
} |
创立数据表
在阿里云管制台上点击“+”新建数据表
增加数据记录
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
聚合管道查问,该管道容许用户通过一系列基于阶段的操作来解决数据,详情请参考帮忙文档 https://help.aliyun.com/docum…
云存储
mpserverless.file 对象提供 uploadFile 和 deleteFile 办法管理文件。上传的文件将通过 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 = 'https://mp...bspapp.com/xxx-xx/4b82ded0-0118-4de4-9f50-ab13110a1ffb.jpg'; | |
mpserverless.file.deleteFile(fileURL) |
总结
EMAS Serverless 依靠阿里巴巴数字经济技术能力和业务能力提供云函数、云存储、云数据库等 Serverless 服务。大大晋升了前端工程师的价值,让开发者疾速落地小程序开发工作,按量付费和主动弹性伸缩省时省力。此外,ES 还反对动态网站托管以及面向支付宝生态的云调用模块,技术与商业联动为开发者提供一站式地小程序生态服务。
参考资料
EMAS 控制台:https://emas.console.aliyun.com
帮忙文档:https://help.aliyun.com/docum…
开发指南:https://help.aliyun.com/docum…
快来收费下载|电子书《五天玩转 EMAS Serverless》