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

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 当下,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-hangzhou
      service:
        name: myserverlesstest
        description: demo for fc-http component
        internetAccess: true
      function:
        name: myhub
        description: this is a test
        runtime: nodejs12
        codeUri: ./code
        handler: index.handler
        memorySize: 128
        timeout: 10
      triggers:
        - name: httpTrigger
        type: http
        config:            
          authType: anonymous            
          methods:              
            - GET              
            - POST      
      customDomains:
        - domainName: auto
        protocol: 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.png14.png15.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, //开启Stream
        expirationTime: 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.serverless-devs.com/

  • 项目仓库

https://github.com/Serverless-Devs/Serverless-Devs

  • Serverless Desktop 桌面客户端

https://serverlessdevs.resume.net.cn/zh-cn/desktop/index.html

  • Serverless 应用开发者套件

http://serverless-dk.oss.devsapp.net/docs/tutorial-dk/intro/react

  • Serverless Devs CLI

https://serverlessdevs.resume.net.cn/zh-cn/cli/index.html

  • Serverless Hub 应用中心

https://serverlesshub.resume.net.cn/#/hubs/special-view

  • 场景上手 Serverless Devs


19.png


钉钉识别二维码,进群参与讨论


20.png


点击链接(https://developer.aliyun.com/adc/expo/serverless),立刻参与场景体验!


相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
打赏
0
0
0
0
13400
分享
相关文章
Serverless Devs 官网全新升级,Serverless+AI 重磅来袭
Serverless Devs 官网全新升级,Serverless+AI 重磅来袭
云原生应用实战:基于阿里云Serverless的API服务开发与部署
随着云计算的发展,Serverless架构日益流行。阿里云函数计算(Function Compute)作为Serverless服务,让开发者无需管理服务器即可运行代码,按需付费,简化开发运维流程。本文从零开始,介绍如何使用阿里云函数计算开发简单的API服务,并探讨其核心优势与最佳实践。通过Python示例,演示创建、部署及优化API的过程,涵盖环境准备、代码实现、性能优化和安全管理等内容,帮助读者快速上手Serverless开发。
AI 场景下,函数计算 GPU 实例模型存储最佳实践
AI 场景下,函数计算 GPU 实例模型存储最佳实践
AI 场景下,函数计算 GPU 实例模型存储最佳实践
当前,函数计算 FC 已被广泛应用在各种 AI 场景下,函数计算支持通过使用容器镜像部署 AI 推理应用,并且提供多种选项来访问训练好的模型。为了帮助开发者高效地在函数计算上部署 AI 推理应用,并快速解决不同场景下的模型存储选型问题,本文将对函数计算的 GPU 模型存储的优缺点及适用场景进行对比分析,以期为您的模型存储决策提供帮助。
Serverless Devs 官网全新升级,Serverless+AI 重磅来袭
Serverless Devs 官网迎来全新升级,主站以 AI 应用开发的叙事透出项目特性和解决方案。应用中心(Registry)将各类热门 AI 应用模版、实用 AI 工具以及 AI 工作流等呈现给用户。本次升级主题为“一站式 AI/函数/应用开发”,希望为开发者提供更加便利的应用模版搜索和展示服务,本文将对本次升级的三大看点进行整理,欢迎您来体验!
活动实践 | 告别资源瓶颈,函数计算驱动多媒体文件处理测评
本方案介绍了一种高效处理文件的方法,适用于企业办公和社交媒体应用。通过阿里云的函数计算、对象存储OSS和轻量消息队列,实现文件的异步处理,如格式转换和水印添加,有效减轻了核心应用的负担,提高了业务稳定性和资源利用率。方案包括云服务器ECS、云数据库RDS、OSS存储等组件,支持快速部署和资源清理。
探索Serverless架构:开发实践与优化策略
本文深入探讨了Serverless架构的核心概念、开发实践及优化策略。Serverless让开发者无需管理服务器即可运行代码,具有成本效益、高可扩展性和提升开发效率等优势。文章还详细介绍了函数设计、安全性、监控及性能和成本优化的最佳实践。
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
230 1
体验《触手可及,函数计算玩转 AI 大模型》解决方案测评
本文介绍了《触手可及,函数计算玩转 AI 大模型》解决方案的测评体验。作者对解决方案的原理理解透彻,认为文档描述清晰但建议增加示例代码。部署过程中文档引导良好,但在环境配置和依赖安装上遇到问题,建议补充常见错误解决方案。体验展示了函数计算在弹性扩展和按需计费方面的优势,但需增加性能优化建议。最后,作者明确了该方案解决的主要问题及其适用场景,认为在处理大规模并发请求时需要更多监控和优化建议。
76 2
《触手可及,函数计算玩转 AI 大模型》解决方案测评
对《触手可及,函数计算玩转 AI 大模型》解决方案的整体理解较好,但建议在模型加载与推理过程、性能指标、示例代码等方面增加更多细节。部署体验中提供了较详细的文档,但在步骤细化、常见问题解答、环境依赖、权限配置等方面有改进空间。解决方案有效展示了函数计算的优势,建议增加性能对比、案例研究和成本分析。方案基本符合生产环境需求,但需增强高可用性、监控与日志、安全性和扩展性。

相关产品

  • 函数计算
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等