使用 Serverless 服务无疑是解决这个问题很合适的方式,它天然为前端而生,近几年 AWS、Google Cloud 等云厂商中都在大幅推广。什么是 Serverless?在 Martin Fowler 观点里,包含 BaaS(Backend as a Service)、FaaS(Functions as a Service)两部分,尤其随着容器化技术日渐成熟,越来越多原先的 BaaS 平台开始补足自己的函数计算能力,让用户可以更加完整的构建应用。
有了 Serverless 服务,我们不再需要关心服务端运维,在客户端即可完成数据存储、文件存储调用,通过云函数便能搞定服务端代码、异步处理逻辑等。这些服务一般都是按使用量计费,可自动弹性扩容,非常适合初创型产品,大幅降低投入成本。
Basement 后端云就是这样一个 Serverless 服务,诞生于蚂蚁体验科技,底层依托于蚂蚁强大稳定的金融科技平台,在过去几年里,一直服务内部 web 开发者们。在今天下午的云栖 ATEC 大会上,Basement 后端云服务正式对外开放,首先服务支付宝小程序场景,提供贴身服务。支付宝小程序事业部负责人何勇明还现场宣布将为一站式小程序云计划投入了一亿元云基金,此计划包含Basement 后端云服务、云端应用开发等。”
Talk is cheap, show me the code.
Basement 拥有下面这些特色能力,尤其在云函数里可直接调用支付宝开放平台接口,非常方便。
下面,我们通过具体的代码示例让大家来快速了解几大重点能力。
云函数支持使用 Node.js 进行开发,大家可通过小程序 IDE 将代码提交到云端,然后在客户端使用 Basement 提供的 API 进行调用,开发者还可以在云函数中直接通过 API 调用数据存储和文件存储的服务资源。
搭配支付宝小程序使用云函数,免配置操作,可以直接调用支付宝开放平台的海量 OpenAPI 接口。
exports.create = async (ctx) => { // @see https://docs.open.alipay.com/api_2/alipay.user.info.share // 通过 OpenAPI 获取用户信息 const userInfo = await ctx.basement.openapi.alipay.exec('alipay.user.info.share'); // @see https://docs.open.alipay.com/api_1/alipay.trade.create // 通过 OpenAPI 创建订单 const order = await ctx.basement.openapi.alipay.exec('alipay.trade.create', { outTradeNo: `${Date.now()}${userInfo.userId}`, // 外部流水号,需要保证唯一性 buyerId: userInfo.userId, // 付款用户的 userId totalAmount: ctx.args.amount, // 金额 subject: ctx.args.subject, // 描述 }); // 返回支付结果 return { order };};
数据存储服务是基于 MongoDB 托管在云端的数据库,数据以 JSON 格式存储。大家可以在客户端(如支付宝小程序)内直接操作数据,也可以在云函数中读写数据。
在小程序客户端代码里,我们可以通过 basement.db
对象调用数据存储的大量 API 方法。比如:我们要获得当前存储的所有集合名词列表。
basement.db.collections().then((res) => { this.setData({ collectionNames: res.result });}).catch(console.error);
云函数内则可直接调用(不需要安装 SDK)同一个云服务的数据存储服务。下面是一个云函数调用的例子,同样是获得所有集合名称的列表。
module.exports = async (ctx) => { const res = await ctx.basement.db.collections(); return res.result;};
文件存储服务支持文本、图片等内容存储到云端后,可通过高速 CDN 访问。同样也是可在客户端直接上传,或云函数里直接上传和读取文件,目前主要支持图片作为文件上传。
在客户端,我们可以通过 basement.file
对象调用文件存储的大量 API 方法。比如:我们将小程序客户端中选中的图片进行上传,获得图片 URL。
// 选择并上传图片,获得图片 URLattach() { my.chooseImage({ chooseImage: 1, success: res => { const path = res.apFilePaths[0]; const options = { filePath: path, headers: { contentDisposition: 'attachment', }, }; basement.file.uploadFile(options).then((image) => { console.log(image); this.setData({ imageUrl: image.fileUrl, }); }).catch(console.log); }, });},
云函数可直接调用(不需要安装 SDK)同一个云服务的文件存储服务。下面是一个云函数调用的例子,将上述客户端中上传的图片删除掉。
module.exports = async (ctx) => { // ctx.args 是从客户端传过来的参数 const res = await ctx.basement.file.deleteFile({ fileUrl: ctx.args.fileUrl }); return res;};
为了让大家能够近距离体验到 Basement,在 9.19-9.21 云栖大会 ATEC 展馆里举办了小程序云+端挑战赛,以及集训营,在这可以近距离接触到 Basement 后端云开发团队。因极简的开发模式,昨天现场一位 11 岁小朋友,都轻松上手,赢得比赛鼓励奖:)
无法到现场的同学,我们还提供了在线示例(请复制链接至浏览器打开):
https://tech.antfin.com/codelabs/eouxrp
目前 Basement 尚在公测期,采用邀请制,有兴趣可以点击阅读原文申请公测资格哦。
— END —
蚂蚁金服官方唯一对外技术传播渠道
投稿邮箱:anttechpr@service.alipay.com
欢迎留言及个人转发,媒体转载请联系授权