Serverless Devs 2.0 开箱测评:Serverless 开发最佳实践

简介: 当下,Serverless 概念很火,很多同学被 Serverless 的优势吸引过来,比如它的弹性伸缩,免运维,高可用,资费少。但真正使用起来去落地的时候发现问题很多,大型项目如何组织函数,性能优化怎么做,怎么做Serverless调试,数据库,共享会话怎么加等等。上周,Serverless Devs 2.0 正式版全新发布。Serverless Devs 2.0 在平台能力、应用模板以及开发者套件方面能力提升。本文以 Serverless Devs 的应用中心(web 版)为案例,来看开箱实践方案。

当下,Serverless 概念很火,很多同学被 Serverless 的优势吸引过来,比如它的弹性伸缩,免运维,高可用,资费少。但真正使用起来去落地的时候发现问题很多,大型项目如何组织函数,性能优化怎么做,怎么做Serverless调试,数据库,共享会话怎么加等等。上周,Serverless Devs 2.0 正式版全新发布。Serverless Devs 2.0 在平台能力、应用模板以及开发者套件方面能力提升。接下来,以 Serverless Devs 的应用中心(web 版)为案例,来看开箱实践方案。

Serverless 函数代码组织

如果想充分利用 Serverless 的能力函数是最佳方案,可以最大程度减少冷启动时间,践行用完即走的理念,保障用户体验的同时,最大程度减少成本,不过对于中大型项目而言,以单函数的方式组织代码,在维护上无疑是一个巨大挑战,可能一个应用会有数百个函数,维护成本极高也极易出错。

最好的方式是用框架的方式组织代码,以函数的方式部署执行。框架组织代码需要做业务的划分,比如电商包含商品,订单,用户等服务,都放到一个框架里面并通过函数去部署执行的话明显太大了。最好就是像微服务一样,独立业务的接口可以在同一个函数中,每一个业务有自己的独立域名,再通过内部路由访问具体的业务服务。

1.png

这样做可以最大限度的利用函数能力,并且维护得来相对容易一些。

我们把 Serverless Hub 的应用市场作为一类场景,进行了统一划分,具体的函数调用如下实现(完整的代码目录 git)

const { http } = require('@serverless-devs/dk');const { searchApp, getAppDetail, getSpecialDetail, getSpecialApp, getCategorys, getTags } = require('./services');http.get("/appCenter/getSpecial", async (ctx) => {const data = await getSpecialApp(ctx);ctx.body = data;}).post("/appCenter/getSpecialDetail", async (ctx, next) => {const data = await getSpecialDetail(ctx);ctx.body = data;})  .post("/appCenter/getAppDetail", async (ctx) => {const data = await getAppDetail(ctx);ctx.body = data;})  .get("/appCenter/getCategory", async (ctx) => {const data = await getCategorys();ctx.body = data;  })  .get("/appCenter/getTags", async (ctx) => {const data = await getTags();ctx.body = data;  })  .post("/appCenter/getApps", async (ctx) => {const data = await searchApp(ctx);ctx.body = data;})  .get("/", async (ctx, next) => {let result = "Hello ServerlessDevs";ctx.body = result;})http.app.use(http.routes());exports.handler = http();

代码使用了 Serverless Devs 提供的 @serverless-devs/dk ,我们对标准的前端框架进行了核心封装,比如 express,koa 等,你可以继续使用习惯的 web 框架进行开发工作,最后通过 s 工具进行函数部署。s.yaml 的配置如下:

edition: 1.0.0 #  命令行YAML规范版本,遵循语义化版本(Semantic Versioning)规范
name: fc-http-demo #  项目名称
access: default #  秘钥别名
vars:
services:serverlesshub:component: devsapp/fc # 组件名称props:region: cn-hangzhouservice:name: myserverlesstestdescription: demo for fc-http componentinternetAccess: truefunction:name: myhubdescription: this is a testruntime: nodejs12codeUri: ./codehandler: index.handlermemorySize: 128timeout: 10triggers:- name: httpTriggertype: httpconfig:            authType: anonymous            methods:              - GET              - POST      customDomains:- domainName: autoprotocol: HTTP          routeConfigs:            - path: /*
# 函数计算FC组件文档参考地址:https://github.com/devsapp/fc

如果你想再增加一个服务业务,可以水平扩展一个新的服务配置,并且可以用同样的代码包去实现。

性能优化

通常 Serverless 应用的最大耗时都在 冷启动时间上,就以阿里云 FC 为例,如果我们的应用以容器的方式进行部署,冷启动时间会比较长可能是 1 分钟或者更多,即使采用镜像加速也仅能缩短到几十秒以内,所以如果项目不是特别大(AI 类应用的包大小可能会达到 G 级别),都建议以 原生runtime 的方式去做。拿我们上面的 serverless hub 为例就是最终运行到 nodejs12 runtime,冷启动时间 1~2s

2.png

热启动则缩短到150ms

3.png

对于这类非高频访问的站点而言还是比较适合的,另外你可以根据需要在具体的某个时间点通过添加预留的方式保持高性能的访问效果。

当然,冷启动这块需要云厂商的进一步优化把他做到极致,最终才能真正让 Serverless 完美。

端云调试

调试始终是 Serverless 应用的最棘手的部分,我们开发的应用是在本地,部署的应用是在线上。并且线上的环境跟本地开发环境有着巨大的差异,通常我们只能通过在线打印输出,然后还得通过日志平台查看日志判断问题,再回来本地修改代码,一来一回耗时非常巨大,而且效果也不好。Serverless Devs 提供了自己的解决方案,我们巧妙的设计了一个在线的辅助函数,辅助函数完整复刻线上代码,然后通过本地跟辅助函数建设通道实现本地的代码调试效果

4.png

基于这样的能力我们再来看看具体怎么在 Serverless Hub 实施的, 本次演示使用的是Serverless Desktop, 大家可以尝试跟着我的操作步骤进行使用:

1、新建一个Serverless 应用,并把它部署到线上

我们可以通过 Serverless Desktop 的应用市场搜索 xxx 应用模板,然后加载到本地,然后通过可视化配置部分修改相应的服务和函数内容,进行部署。

2、进入工作空间->应用管理->应用详情->端云调试

5.png

按照提示准备好前置条件,比如安装docker demon 指定调试端口,启动资源准备,这个时候会创建辅助函数,同时构建 vscode 的 debug 文件。

6.png

启动好之后,使用 vscode 打开工程目录,查看debug配置文件.vscode/launch.json

7.png

以这个启动 debug 模式

8.png

3、发起调用

切换到"本地调试配置"面板,点击"发起调用"

9.png

可以发现  vscode 触发调试

10.png

调试结束回到 Serverless Desktop 页面,我们可以看到输出效果:

11.png

这里我们发起调用是向这个服务的根目录发起,如果我们想向其他的路由地址发起调用该怎么操作呢?我们可以复制发起调用后输出的基础地址。

12.png

然后贴到 postman, 再往后拼接上我们的测试路由地址,比如,想访问"/appCenter/getSpecial",可以拼接成"<基础地址>/appCenter/getSpecial"然后"Send"这个请求。

13.png

14.png

15.png

通过这样的方式我们可以深入细节知道每一行代码的调用问题到底出在哪里,极大的提高了我们的开发效率。

4、清空环境

调试结束后不要忘了清楚调试环境,包括关闭本地的容器地址,以及清理线上的函数。

16.png

综上我们完成了一次完整的调试过程。

数据库使用

Serverless 一大特色就是他的计费模式:按需按量计费。在数据库存储层面,阿里云推出 Serverless 分布式数据库 Tablestore,和函数计算 FC 是最佳拍档。

1、前提

  1. 请先到 tablestore 控制台,开通服务
  2. 使用主账号创建按量付费的实例

17.png

  1. 在实例管理页面获取访问地址以及实例名

18.png

2、Initializer 函数

首先让我们先认识下 initializer 函数,initializer 函数能够保证统一实例成功并且仅成功执行一次。这个特性非常适合我们的数据库初始化连接。

const  TableStore = require('tablestore');let internal; // 先定义一个全局变量
exports.initializer = (context, callback) => {try {    const endpoint = process.env.tablestore_endpoint; // tablestore的连接地址    const instanceName = process.env.tablestore_instanceName;// tablestore实例名    const tableClient = new TableStore.Client({accessKeyId: context.credentials.accessKeyId,accessKeySecret: context.credentials.accessKeySecret,stsToken: context.credentials.securityToken,endpoint,instancename: instanceName,});internal = { tableClient, TableStore };callback();} catch (err) {callback(err.message);}
}

3、handler函数

数据库建立连接后,我们就可以在 handler 函数中处理业务逻辑。

const { http } = require('@serverless-devs/dk');
http// 创建表.post("/table", async (ctx, next) => {const { tableName } = ctx.request.body;const { tableClient } = ctx.req.requestContext.internal;const params = {tableMeta: {tableName,primaryKey: [{            name: 'id',type: 'INTEGER',},],},reservedThroughput: {capacityUnit: {read: 0,          write: 0,},},tableOptions: {timeToLive: -1, // 数据的过期时间, 单位秒, -1代表永不过期. 假如设置过期时间为一年, 即为 365 * 24 * 3600.maxVersions: 1, // 保存的最大版本数, 设置为1即代表每列上最多保存一个版本(保存最新的版本).},streamSpecification: {enableStream: true, //开启StreamexpirationTime: 24, //Stream的过期时间,单位是小时,最长为168,设置完以后不能修改},};await tableClient.createTable(params);ctx.body = {success: true,message: `${tableName}表已创建成功`,}})exports.handler = (req, res, context) => {context.internal = internal;http()(req, res, context);
};

3、快速体验

1. Serverless Devs 提供 tablestore 组件, 通过一行命令快速体验

$ s init dk-tablestore

2. 本地调试

$ cd code
$ npm install
$ npm run serve

3. 一键部署到函数计算 FC

回到项目根目录(s.yaml平级),执行命令

$ s deploy

原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CDS技术揭秘系列 总篇】阿里云的云定义存储来了

简介&#xff1a; 全新发布的云定义存储 CDS 和传统的存储阵列、分布式存储、软件定义存储的区别在哪里&#xff1f;阿里云存储团队如何看待将来存储的发展趋势&#xff1f;本文邀请了 CDS 研发团队的核心技术负责人为大家揭开围绕着阿里云 CDS 的种种谜团。 云定义存储&#…

TSDB时序数据库时序数据压缩解压技术浅析

简介&#xff1a; 目前&#xff0c;物联网、工业互联网、车联网等智能互联技术在各个行业场景下快速普及应用&#xff0c;导致联网传感器、智能设备数量急剧增加&#xff0c;随之而来的海量时序监控数据存储、处理问题&#xff0c;也为时序数据库高效压缩、存储数据能力提出了更…

Atmosic推出ATM33新品,全新的ATM33系列性能大升级

为减少各种物联网产品高昂的电池更换成本&#xff0c;以及降低对环境的危害&#xff0c;在上个月举行的媒体发布会中&#xff0c;Atmosic营销及业务拓展副总裁 Srinivas发布了公司的新产品——ATM33&#xff0c;并详细解析了ATM33的技术特性和主要应用领域。 ATM33系列产品可支…

什么是低代码(Low-Code)?

简介&#xff1a; 什么是低代码&#xff1f;我们为什么需要低代码&#xff1f;低代码会让程序员失业吗&#xff1f;本文总结了低代码领域的基本概念、核心价值与行业现状&#xff0c;带你全面了解低代码。 阿里云 云原生应用研发平台EMAS 彭群&#xff08;楚衡&#xff09; 一…

php用wordanalysis抓取姓名_利用vba查询/抓取 外部数据

考虑这么一个excel文件&#xff0c;路径为&#xff1a;"E:dataEdata.xlsx"&#xff0c;样式如封面图片所示想要在其他excel文件中&#xff0c;通过代码直接抓取Edata.xlsx中想要的数据&#xff0c;做法如下&#xff1a;先在Visual Basic中勾选“工具-引用-Microsoft …

如何加速云原生数据应用?这个开源项目备受关注

简介&#xff1a; 自2020年9月Fluid正式对外开源&#xff0c;发展短短一年时间&#xff0c; Fluid 便一次获得两项开源界的重要认可&#xff0c;证明着其所专注的云原生、AI 领域也正在迎来广泛关注。这其中的意义和价值如何&#xff1f;我们尝试管中察豹&#xff0c;从 Fluid …

使用 Cilium 增强 Kubernetes 网络安全

作者 | Addo Zhang来源 | 云原生指北TL;DR在本篇&#xff0c;我们分别使用了 Kubernetes 原生的网络策略和 Cilium 的网络策略实现了 Pod 网络层面的隔离。不同的是&#xff0c;前者只提供了基于 L3/4 的网络策略&#xff1b;后者支持 L3/4、L7 的网络策略。通过网络策略来提升…

内含干货PPT下载|一站式数据管理DMS关键技术解读

简介&#xff1a; 深入解读实时数据流、库仓一体数据处理等核心技术 “数聚云端智驭未来”——阿里云数据库创新上云峰会暨第3届数据库性能挑战赛决赛颁奖典礼已圆满结束&#xff0c;更多干货内容欢迎大家观看峰会直播回放。 峰会直播回放&#x1f4ce;数聚云端 智驭未来——…

好饭不怕晚,扒一下 Redis 的配置文件

作者 | 阿Q来源 | 阿Q说代码在往期的文章中我们已经对Redis的概念和基本命令进行了讲解&#xff0c;今天我们来看下它的配置文件&#xff0c;Redis的配置文件在我们的开发和实际应用中起着非常重要的作用。我们可以在安装目录下找到redis.conf配置文件&#xff0c;通过vim命令进…

ICBU可控文本生成技术详解

简介&#xff1a; 文本生成&#xff08;Text Generation&#xff09;是自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;领域的一项重要且具有挑战的任务。顾名思义&#xff0c;文本生成任务的目的是生成近似于自然语言的文本序列&#xff0c;…

云拨测助力节卡机器人 全面优化海外网站性能

简介&#xff1a; 【案例分享云拨测】借助云拨测&#xff0c;节卡机器人有效挖掘性能瓶颈&#xff0c;经过优化&#xff0c;提升网站打开速度 50% 以上&#xff0c;提高了运营推广活动的 ROI&#xff0c;帮助节卡为全球用户提供更加优质的服务&#xff01; 作者&#xff5c;白…

分享一个巨好用的 HTTP 命令行宝藏工具

作者 | Eason来源 | 程序员巴士HTTPie是一个命令行 HTTP 客户端。它的目标是使 CLI 与 Web 服务的交互尽可能人性化。HTTPie 设计用于测试、调试以及通常与 API 和 HTTP 服务器交互。http 和 https 的命令允许创建和发送任意 HTTP 请求。HTTPie 整体采用简单自然的语法&#xf…

mysql远程备份工具_innobackupex实现MySQL远程备份

一、了解innobackupex1、mysqldumpmysql逻辑备份工具&#xff0c;作用于服务器本地&#xff0c;不需要额外安装插件可以单表备份&#xff0c;备份为sql文件形式、方便&#xff0c;在多个场景通用可通过shell命令实现定时备份&#xff0c;但备份时如果用户有操作&#xff0c;容易…

技术干货 | Native 页面下如何实现导航栏的定制化开发?

简介&#xff1a; 通过不同实际场景的描述&#xff0c;供大家参考完成 Native 页面的定制化开发。 很多 mPaaS Coder 在接入 H5 容器后都会对容器的导航栏进行深度定制&#xff0c;本文旨在通过不同实际场景的描述&#xff0c;供大家参考完成 Native 页面的定制化开发。 欢迎关…

深入理解云计算OpenAPI体系

简介&#xff1a; 就云计算的API来看&#xff0c;当前并没有类似POSIX这样的API标准&#xff0c;基本上各大厂商各自为政。当然&#xff0c;有一些业界主流标准例如OAS获得多数云厂商的支持&#xff0c;但云厂商本身的API却往往由于历史原因、技术路线原因百花齐放&#xff0c;…

Gartner:2025年有效细分市场中过半企业的 IT 支出将转向云

来源 | CSDN云计算 根据Gartner的最新预测&#xff0c;2025年有效细分市场中的企业在公有云计算领域的IT支出将超过传统IT服务支出。 Gartner的“云迁移”研究只包括可以迁移到云的企业IT市场&#xff0c;即应用软件、基础设施软件、业务流程服务和系统基础设施市场。2025年在这…

阿里云容器服务全面升级为 ACK Anywhere,让云的边界拓展至企业需要的每个场景

简介&#xff1a; 2021 年 9 月 26 日上海阿里云计算峰会上&#xff0c;阿里巴巴研究员、阿里云云原生应用平台负责人丁宇宣布&#xff0c;阿里云容器服务全面升级为 ACK Anywhere&#xff0c;让企业在任何需要云的地方&#xff0c;都能获得一致的容器基础设施能力。 此次升级的…

Redis 突然变慢了如何排查并解决?

作者 | 码哥字节来源 | 码哥字节Redis 通常是我们业务系统中一个重要的组件&#xff0c;比如&#xff1a;缓存、账号登录信息、排行榜等。一旦 Redis 请求延迟增加&#xff0c;可能就会导致业务系统“雪崩”。最近遇到了一个bug&#xff0c;经过查找发现 Redis 报 Could not ge…

成本直降50% | 阿里云发布云原生网关,开启下一代网关新进程

简介&#xff1a; 融合流量网关与微服务网关的下一代网关—云原生网关来啦&#xff01;优势满满&#xff01; 流量网关和微服务网关必须分开构建吗&#xff1f; 在容器技术和 K8s 主导的云原生时代&#xff0c;这个命题正浮现出新的答案。 更经济&#xff1a;将流量网关与微…

MongoDB 5.0新特性概览

简介&#xff1a; MongoDB 5.0标志着一个新的发布周期的到来&#xff0c;以更快地交付新特性给到用户。版本化API与在线重新分片相结合&#xff0c;使用户不必担心未来的数据库升级以及业务变化问题&#xff1b;本地原生时间序列数据平台也使MongoDB能支持更广泛的工作负载和业…