关于存储:一文搞懂EMAS-Serverless小程序开发|电子书免费下载

6次阅读

共计 8980 个字符,预计需要花费 23 分钟才能阅读完成。

简介:EMAS Serverless 是阿里云一站式利用研发平台 EMAS 旗下的一款子产品,是面向小程序场景提供的 Serverless 开发、经营套件,开发者无需关怀服务器和进行底层设施运维,专一于代码逻辑和业务自身,具备极简运维、多端适配、按需应用、弹性扩容等劣势,帮忙开发者疾速部署小程序,本文将带你全面理解 EMAS Serverless 小程序开发,另附电子书《五天玩转 EMAS Serverless》收费下载!!

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

点击收费下载

《五天玩转 EMAS Serverless》

EMAS Serverless 是什么

EMAS Serverless 是阿里云提供的基于 Serverless 技术的一站式后端开发平台,为开发者提供高可用、弹性伸缩的云开发服务,蕴含云函数、云数据库、云存储、动态网站托管等性能,帮忙开发者及企业客户疾速实现一云多端利用的搭建,您无需治理服务器等基础设施,便能够无缝对接丰盛的云资源。

图 1 EMAS Serverless 产品架构

EMAS Serverless 利用场景

ES 反对云函数、云数据库、云存储等能力,具备弹性伸缩、按量付费、免运维三大特点。弹性伸缩 让您免于频繁运维扩缩机器,轻松应答各种流量突发事件,为您节俭大量工夫。按量付费 做到用多少付多少,函数计费准确到毫秒,为您节俭大量开销。免运维 让开发者不必破费更多的精力在服务器等底层资源上,而是能够将精力放在更具价值的业务逻辑上。因而 ES 宽泛实用于电商、征询、游览、企业展现、社区、餐厅等行业场景。

图 2 EMAS Serverless 利用场景

开明产品

首先关上 EMAS 阿里云控制台:[https://emas.console.aliyun.com](https://emas.console.aliyun.com),新建并进入我的项目。而后抉择平台服务并创立一个服务空间。如图 3 和图 4 所示:

图 3 EMAS 控制台首页——项目管理

图 4 选中平台服务并创立服务空间

计费形式

反对按量付费和包年包月两种付费形式。

  • 按量付费(后付费):一种后付费模式,即先应用再付费。个别实用于有暴发业务量的利用或服务。
  • 包年包月(预付费):一种预付费模式,即先付费再应用。通过包年包月,您能够提前预留资源,同时享受更大的价格优惠,帮您更大程度节俭收入。

按量付费

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

### 包年包月

<span> 套餐规格 </span> <span> 价格(元 / 月)</span> <span> 套餐形容 </span>
<span> 开发者版 </span> <span>Free</span> <span> 适宜练习、我的项目开发、启动初期应用。</span>
<span> 根底版 </span> <span>5</span> <span> 咱们提供了多种规格的套餐,您能够基于业务规模、我的项目倒退阶段按需抉择,并随同业务的增长进行套餐升配。</span>
<span> 标准版 </span> <span>24</span>
<span> 专业版 </span> <span>82</span>
<span> 企业版 </span> <span>316</span>
<span> 旗舰版 </span> <span>688</span>

具体的套餐资源量请参考 https://help.aliyun.com/document\_detail/435837.html

## 装置 SDK

咱们以开发支付宝小程序为例,演示如何疾速借助 ES 能力疾速开发部署。

1. 首先运行在小程序我的项目根目录执行以下命令。

`
npm install –save @alicloud/mpserverless-sdk
`

微信或者支付宝小程序还有一些非凡配置,具体请参考:https://help.aliyun.com/document\_detail/444395.html

## 初始化 SDK

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

这里演示应用的是 匿名初始化,这种初始化形式无需在支付宝开放平台配置密钥,不过同时也无奈获取小程序用户身份。更多细节请参考:https://help.aliyun.com/document\_detail/444402.html

`
// 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 对象构造

<span> 字段 </span> <span> 类型 </span> <span> 含意 </span>
ctx.args Object? 开发者通过 SDK 调用云函数时传入的参数体。例如:mpserverless.function.invoke(‘function-name’, args)HTTP 触发和定时工作触发的入参构造稍有不同,请参考官网文档。
ctx.logger function 日志工具,能够打印 <span> 不同类型的日志信息,而后在云函数控制台中查看执行日志。</span><ul><li><span>info</span></li><li><span>warn</span></li><li><span>error</span></li><li><span>debug</span></li></ul>
ctx.mpserverless SDK 在云函数中为您提供曾经实现初始化的 mpserverless 对象,让您能够持续调用 Serverless 其余根底服务,<span>API 应用形式和客户端基本一致。</span>
ctx.env Object <span> 在云函数中通过 </span><span>ctx.env</span><span> 来获取环境参数,例如 SpaceId、调用起源、客户端源 IP 和客户端 UserAgent 等信息。</span><ul><li><span>MP_SPACE_ID</span><span> 服务空间 ID</span></li><li>MP_SOURCE 调用起源 </li></ul><ul><li><ul><li>server:服务端触发 </li><li>function:云函数触发 </li><li>client:客户端触发 </li><li>http:HTTP 触发 </li><li>timing:定时触发 </li></ul></li></ul><ul><li>MP_USER_AGENT 客户端标记,仅来自客户端的调用蕴含该字段 </li><li>MP_CLIENT_IP 客户端 IP,仅来自客户端的调用蕴含该字段 </li><li>MP_APP_ID 小程序 AppId,客户端非匿名受权后调用云函数蕴含该字段 </li></ul>
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 所示:

图 5 云函数代码包

如下图 6 所示,首先咱们在阿里云控制台新建一个云函数 TwoNumOperation,函数名称必须和文件夹名称统一。而后将压缩好的代码包上传、部署。部署胜利后能够在控制台测试运行,点击代码执行,输出函数执行参数即可运行云函数。点击日志能够查看云函数的执行日志,不便开发者调试。

图 6 云函数部署、执行、日志查看

### 在小程序中调用云函数

如图 7 所示在小程序中调用云函数。index.axml 布局文件简略写了一个表单蕴含三个 input,绑定表单提交函数 invokeFunctionindex.js 文件首先从全局导入 mpserverless 对象,而后在表单提交函数中获取参数 actionxy,而后通过 mpserverless.function.invoke 调用云函数。

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

## 云数据库

云数据库服务是基于 MongoDB 托管在云端的数据库,数据以 JSON 格局存储。作为开发者,您能够在客户端或者云函数中通过 mpserverless 对象读写数据。

`
mpserverless.db.collection(‘user’).findOne({ name: ‘ 张三 ’} )
`

### 和 MySQL 比照

ES 云数据库服务底层应用的是 MongoDB,以 JSON 格局存储数据。数据库中的每条记录都是一个 JSON 格局的文档,一个数据库能够蕴含多个汇合(相当于关系型数据库中的表),每个汇合可看做一个 JSON 文档数组。MongoDB 数据库和关系型数据库 MySQL 的比照如下表所示。

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

### 数据结构设计策略

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”: “ 女 ”
}
]
}
]
}
`

### 创立数据表

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

图 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

聚合管道查问,该管道容许用户通过一系列基于阶段的操作来解决数据,详情请参考帮忙文档 https://help.aliyun.com/document\_detail/435909.html

## 云存储

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-x…’;
mpserverless.file.deleteFile(fileURL)
`

## 总结

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

## 参考资料

EMAS 控制台:https://emas.console.aliyun.com

帮忙文档:https://help.aliyun.com/document\_detail/436030.html

开发指南:https://help.aliyun.com/document\_detail/444395.html

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

> 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

正文完
 0