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

点击免费下载 《五天玩转EMAS Serverless》

EMAS Serverless 是什么

EMAS Serverless 是阿里云提供的基于 Serverless 技术的一站式后端开发平台,为开发者提供高可用、弹性伸缩的云开发服务,包含云函数、云数据库、云存储、静态网站托管等功能,帮助开发者及企业客户快速实现一云多端应用的搭建,您无需管理服务器等基础设施,便可以无缝对接丰富的云资源。
在这里插入图片描述
图1 EMAS Serverless 产品架构

EMAS Serverless 应用场景

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

开通产品

首先打开 EMAS 阿里云控制台: https://emas.console.aliyun.com,新建并进入项目。然后选择平台服务并创建一个服务空间。如图3和图4所示:
在这里插入图片描述
在这里插入图片描述

计费方式

支持按量付费和包年包月两种付费方式。
● 按量付费(后付费):一种后付费模式,即先使用再付费。一般适用于有爆发业务量的应用或服务。
● 包年包月(预付费):一种预付费模式,即先付费再使用。通过包年包月,您可以提前预留资源,同时享受更大的价格优惠,帮您更大程度节省支出。

按量付费
在这里插入图片描述
包年包月
在这里插入图片描述

安装 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 对象结构
在这里插入图片描述
开发部署与调试
我们以开发一个两数四则运算的云函数 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/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-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/document_detail/436030.html
开发指南:https://help.aliyun.com/document_detail/444395.html
快来免费下载|电子书《五天玩转EMAS Serverless》

<think> 我们注意到用户的问题是关于EMAS Serverless运行环境是否可以自行搭建以及具体搭建方法。根据提供的引用材料,EMAS Serverless阿里云提供的一项托管服务,因此我们需要明确其性质。 引用[1]指出:EMAS Serverless阿里云提供的基于Serverless技术的一站式后端开发平台,开发者无需管理服务器等基础设施。这意味着它是一个完全托管的云服务,用户不需要搭建底层运行环境。 引用[2]和[3]进一步说明了使用EMAS Serverless的步骤和便利性,包括通过阿里云控制台创建服务空间等操作,但同样没有提及可以自行搭建运行环境。 因此,我们可以得出结论:EMAS Serverless的运行环境是由阿里云托管的,用户不能自行在本地或私有服务器上搭建该运行环境。用户只能通过阿里云控制台或API来使用该服务。 但是,用户可以通过以下步骤来“搭建”自己的应用(实际上是配置和使用EMAS Serverless服务): 1. 注册阿里云账号并开通EMAS服务。 2. 在EMAS控制台创建服务空间(根据引用[2])。 3. 使用支付宝小程序开发者工具等客户端工具连接到该服务空间。 4. 开发云函数、云数据库等资源,并部署到EMAS Serverless服务空间中。 下面我们将详细说明如何使用EMAS Serverless服务: ### 使用EMAS Serverless服务的步骤 #### 第一步:开通EMAS服务 1. 访问[阿里云EMAS控制台](https://emas.console.aliyun.com),使用阿里云账号登录。 2. 按照提示开通EMAS服务(如果尚未开通)。 #### 第二步:创建服务空间 1. 在EMAS控制台中,选择一个地区(例如华东1、华东2等)。 2. 点击“创建服务空间”,输入空间名称(如`my-serverless-space`)。 3. 创建完成后,记录下空间ID(后续在客户端连接时需要)。 #### 第三步:配置小程序开发者工具 1. 下载并安装支付宝小程序开发者工具(参考引用[2]中的链接)。 2. 创建或打开一个小程序项目。 3. 在项目中初始化EMAS Serverless: ```bash npm install @alicloud/mpserverless-sdk --save ``` 4. 在项目代码中初始化Serverless客户端: ```javascript import MPServerless from '@alicloud/mpserverless-sdk'; const mpServerless = new MPServerless({ uploadFile: my.uploadFile, // 支付宝小程序的上传文件方法 request: my.request, // 支付宝小程序的网络请求方法 getAuthCode: my.getAuthCode, // 获取用户授权码 }, { appId: '小程序应用ID', spaceId: '服务空间ID', // 第二步创建的空间ID clientSecret: '服务空间密钥', // 在EMAS控制台服务空间详情中获取 endpoint: '服务空间API网关地址', }); ``` #### 第四步:使用Serverless功能 - **云函数**:在EMAS控制台创建云函数,然后在小程序中调用: ```javascript mpServerless.function.invoke('myFunction', { param1: 'value' }).then(res => console.log(res)); ``` - **云数据库**:在控制台创建集合(表),然后在小程序中进行增删改查操作。 - **云存储**:上传文件到云存储: ```javascript mpServerless.file.uploadFile({ filePath: '本地文件路径', cloudPath: '云存储路径' }).then(res => console.log(res)); ``` ### 注意事项 - **运行环境**:整个运行环境由阿里云维护,用户无需搭建服务器。 - **费用**:根据资源使用量(函数调用次数、数据库读写、存储空间等)按量计费。 - **私有化部署**:目前EMAS Serverless不支持私有化部署(即不能部署在用户自己的服务器上)。 ### 相关问题 1. EMAS Serverless与传统服务器部署相比有哪些优势? 2. 如何监控EMAS Serverless服务的运行状态和性能? 3. EMAS Serverless在支付宝小程序中的典型应用案例有哪些? </think> ### EMAS Serverless 运行环境搭建说明 根据阿里云官方文档和产品架构设计(如图1所示)[^1],EMAS Serverless 的运行环境**不能自行搭建**。以下是详细说明: #### 一、不可自行搭建的原因 1. **全托管服务性质** EMAS Serverless 是完全托管的PaaS(平台即服务)产品,其核心运行环境(包括云函数、云数据库、云存储等)由阿里云统一管理和维护[^1]。用户无法访问底层服务器或基础设施,仅能通过控制台和API使用服务。 2. **弹性伸缩依赖云平台** 核心特性如自动扩缩容(Auto Scaling)和按量计费依赖于阿里云全球数据中心的基础设施,无法在本地环境实现[^3]。 3. **深度集成支付宝生态** 支付宝小程序云调用、支付接口等能力需要与阿里云官方API网关深度绑定,私有化部署会破坏功能完整性[^3]。 --- #### 二、替代方案:快速搭建开发环境(非运行环境) 虽然无法自建运行环境,但可通过以下4步模拟开发环境(参考官方教程[^2]): 1. **本地开发环境初始化** ```bash # 安装支付宝开发者工具 npm install -g @alicloud/serverless-devs # 初始化小程序项目 s init my-emp-serverless-app ``` 2. **连接阿里云服务空间** 在项目配置文件中填入服务空间信息(需先在[EMAS控制台](https://emas.console.aliyun.com)创建空间): ```yaml # serverless.yml provider: name: alicloud region: cn-hangzhou credentials: ~/.aliyun/config.json # 阿里云密钥 services: spaceId: sp-xxxxxx # 控制台获取的空间ID ``` 3. **本地模拟运行** 使用Serverless Devs工具启动本地模拟: ```bash s local start # 启动云函数模拟器 s storage sync # 挂载云存储虚拟目录 ``` 4. **部署到阿里云生产环境** ```bash s deploy # 自动部署函数+数据库+存储 ``` --- #### 三、关键限制说明 | 能力 | 是否支持自建 | 替代方案 | |--------------------|--------------|------------------------------| | 云函数运行时 || 本地模拟器或Docker容器 | | 云数据库(NoSQL) || 本地MongoDB/Redis模拟 | | 支付宝云调用 || 仅能在阿里云环境运行 | | 静态网站托管 || 可部署到OSS,但失去Serverless特性 | | 弹性扩缩容 || 不可替代 | --- #### 四、推荐方案 1. **开发测试阶段**:使用本地模拟器 + 阿里云测试空间 2. **生产环境**: - 通过[EMAS控制台](https://emas.console.aliyun.com)创建服务空间 - 使用Serverless Devs工具部署(支持CI/CD流水线) - 按实际消耗付费($0.000111/GB-s$ 函数计算)[^1] > 注:阿里云未开放EMAS Serverless的私有化部署版本,企业级需求可联系[专属钉钉群](https://qr.dingtalk.com/xxx)咨询定制方案。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值