serverless架构下的ai应用开发(代码片段)

阿里云云原生 阿里云云原生     2023-03-30     441

关键词:

作者:阿里云云原生

本篇内容连载自《Serverless 架构下的 AI 应用开发:入门、实战与性能优化》。

Serverless 架构与 CI/CD 工具的结合

CI/CD 是一种通过在应用开发阶段引入自动化流程以频繁向客户交付应用的方法。 如图所示,CI/CD 的核心概念是持续集成持续交付持续部署

作为一个面向开发和运营团队的解决方案,CI/CD 主要针对集成新代码时所引发的问题。具体而言,CI/CD 可以让持续自动化和持续监控贯穿于应用的整个生命周期(从集成、测试阶段到交付和部署阶段)。这些关联的事务通常被统称为“CI/CD 管道”,由开发和运维团队以敏捷方式协同支持。

CI/CD 的概念与内容简图

在 Serverless 架构下,通常会有很多函数构成一个完整的功能或服务,这种比较细粒度的功能往往会给后期项目维护带来极大的不便,包括但不限于函数管理、项目的构建、发布层面等的不便。此时在 Serverless 架构中,CI/CD 就显得尤为重要。更加科学、安全的持续集成和部署过程不仅会让整体的业务流程更加规范,也会在一定程度上降低人为操作、手工集成部署所产生错误的概率,同时也会大规模减轻运维人员的工作负担。

如果想要通过 CI/CD 平台,科学且方便地进行 Serverless 应用的持续集成、交付和部署,通常情况下我们需要借助相应的开发者工具,例如 Serverless Framework、Serverless Devs 等。Serverless开发者工具配置到 CI/CD 平台的流程可以简化为下图。

Serverless开发者工具配置到 CI/CD 平台的流程

与 GitHub Action 的集成

在 GitHub Action 的 Yaml 文件中,增加 Serverless Devs 相关下载、配置以及命令执行相关内容。例如,在 GitHub 仓库中创建文件.github/workflows/publish.yml,文件内容如下:

name: Serverless Devs Project CI/CD

on: 
   push: 
      branches: [ master ]

jobs: 
    serverless-devs-cd: 
        runs-on: ubuntu-latest 
        steps:



          - uses: actions/checkout@v2 
          - uses: actions/setup-node@v2 
              with: 
                  node-version: 12 
                  registry-url: https://registry.npmjs.org/ 
          - run: npm install
          - run: npm install -g @serverless-devs/s
          - run: s config add --AccountID $secrets.AccountID --AccessKeyID
             $secrets.AccessKeyID --AccessKeySecret $secrets.AccessKeySecret -a default
          - run: s deploy

与 GitHub Action 集成主要包括以下几部分内容:

  • 通过 NPM 安装最新版本的 Serverless Devs 开发者工具:
run: npm install -g @serverless-devs/s
  • 通过 config 命令进行密钥等信息的配置:
run: s config add --AccountID $secrets.AccountID --AccessKeyID $secrets.
    AccessKeyID --AccessKeySecret $secrets.AccessKeySecret -a default
  • 执行某些命令,例如通过 deploy 命令进行项目的部署,或者通过 build 等命令进行项目的构建:
run: s deploy

关于密钥的配置:密钥信息是通过$secrets.*获取的,此时,需要将所需要的密钥和对应的 Key 配置到 GitHub Secrets 中,例如在上面的案例中,需要 AccountID、AccessKeyID、AccessKeySecret 三个密钥的 Key 就可以配置相关内容。找到 GitHub Secrets 页面,如图所示。

GitHub Secrets 页面

创建和配置密钥信息,如图所示。

创建和配置密钥信息页面

此处配置了 3 对密钥,如图所示。

GitHub 仓库配置密钥结果页面

与 Gitee Go 的集成

在开启 Gitee Go 的服务之后,在流水线的 Yaml 文件中,可以增加 Serverless Devs 的相关下载、配置以及命令执行相关内容。

例如,在 GitHub 仓库中创建文件.github/workflows/publish.yml,文件内容如下:

name: serverless-devs
displayName: 'Serverless Devs Project CI/CD'
triggers:                                     #流水线触发器配置
   push:
       - matchType: PRECISE
           branch: master
commitMessage: ''
stages:
    - stage:
            name: deploy-stage
            displayName: 'Deploy Stage'
            failFast: false

            steps:                            #构建步骤配置
               - step: npmbuild@1             #采用NPM编译环境
                 name: deploy-step
                 displayName: 'Deploy Step'
                 inputs:                      #构建输入参数设定
                     nodeVersion: 14.15       #指定 node 环境版本为 14.15
                     goals: |                 #安装依赖,配置相关主题、部署参数并发布部署
                     node -v
                     npm -v
                     npm install -g @serverless-devs/s
                     s co nfig add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret $ACCESSKEYSECRET -a default
                     s deploy

与 GitHub Action 集成的流程类似,与 Gitee Go 集成主要包括以下几部分内容。

  • 通过 NPM 安装最新版本的 Serverless Devs 开发者工具:
npm install -g @serverless-devs/s
  • 通过 config 命令进行密钥等信息的配置:
s config add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret 
    $ACCESSKEYSECRET -a default
  • 执行某些命令,例如通过 deploy 命令进行项目的部署,或者通过 build 等命令进行项目的构建:
s deploy

关于密钥的配置:密钥信息是通过$*获取的,此时将所需的密钥和对应的 Key 配置到 Gitee 的环境变量管理中,例如在上面的案例中,需要 AccountID、AccessKeyID、AccessKeySecret 三个密钥的 Key 就可以配置相关内容。

找到 Gitee 的环境变量管理页面,如图所示。

Gitee 的环境变量管理页面

创建和配置密钥信息,如图所示。

创建和配置密钥信息页面

此处配置了 3 对密钥,如图所示。

Gitee 仓库完成密钥配置页面

与 Jenkins 的集成

在将 Serverless Devs 集成到 Jenkins 之前,需要先基于 Jenkins 官网安装并运行 Jenkins。本地启动 Jenkins,通过浏览器进入并配置完成基础设置,之后新增凭据设置,如下图所示。

浏览器链接:

http://localhost:8080

Jenkins 凭据设置页面

可以根据需要,增加密钥信息。以阿里云为例,新增 3 个全局凭据:

  • jenkins-alicloud-account-id : 阿里云 accountId
  • jenkins-alicloud-access-key-id : 阿里云 accessKeyId
  • jenkins-alicloud-access-key-secret : 阿里云 accessKeySecret

此时,可以对自身的 Serverless Devs 项目进行完善。创建文件 Jenkinsfile:

pipeline  
    agent  
        docker  
            image 'maven:3.3-jdk-8' 
         

     

     environment  
         ALICLOUD_ACCESS = 'default' 
         ALICLOUD_ACCOUNT_ID = credentials('jenkins-alicloud-account-id') 
         ALICLOUD_ACCESS_KEY_ID = credentials('jenkins-alicloud-access-key-id') 
         ALICLOUD_ACCESS_KEY_SECRET = credentials('jenkins-alicloud-access-key-secret') 
      

     stages  
         stage('Setup')  
             steps  
                 sh 'scripts/setup.sh' 
              
         
    

与 Jenkins 集成主要内容包括以下两部分:

  • environment 部分:主要是根据上面步骤配置的密钥信息,进行密钥的处理。
  • stages 部分:包括 sh 'scripts/setup.sh’部分,即运行 scripts/setup.sh 文件,进行相关内容的准备和配置。

准备 scripts/setup.sh 文件,只需要在项目下创建该文件即可。

#!/usr/bin/env bash
echo $(pwd)
curl -o- -L http://cli.so/install.sh | bash
source ~/.bashrc
echo $ALICLOUD_ACCOUNT_ID
s config add --AccountID $ALICLOUD_ACCOUNT_ID --AccessKeyID $ALICLOUD_ACCESS_KEY_
     ID --AccessKeySecret $ALICLOUD_ACCESS_KEY_SECRET -a $ALICLOUD_ACCESS
(cd code && mvn package && echo $(pwd))
s deploy -y --use-local --access $ALICLOUD_ACCESS

在该文件中,主要包括以下几个部分:

  • 安装最新版本的 Serverless Devs 开发者工具:
curl -o- -L http://cli.so/install.sh | bash
  • 通过 config 命令进行密钥等信息的配置:
s config add --AccountID $ALICLOUD_ACCOUNT_ID --AccessKeyID $ALICLOUD_ACCESS_
    KEY_ID --AccessKeySecret $ALICLOUD_ACCESS_KEY_SECRET -a $ALICLOUD_ACCESS
  • 执行某些命令,例如通过 deploy 命令进行项目的部署,或者通过 build 等命令进行项目构建:
s deploy -y --use-local --access $ALICLOUD_ACCESS

完成密钥配置之后,可以创建一个 Jenkins 流水线。该流水线的源是目标 GitHub地址。接下来,就可以开始运行 Jenkins 流水线,运行结束后可得到相关的结果。

与云效的集成

在云效中,可以直接选择 Serverless Devs 开发者工具,并在自定义命令中输入以下内容:

# input your command here
npm install -g @serverless-devs/s
s config add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret 
    $ACCESSKEYSECRET -a default
s deploy

与 GitHub Action、Gitee Go 以及 Jenkins 的配置类似,与云效集成同样主要包括 3 部分。

  • 安装最新版本的 Serverless Devs 开发者工具:
npm install -g @serverless-devs/s
  • 通过 config 命令进行密钥等信息的配置:
s config add --AccountID $ACCOUNTID --AccessKeyID
    $ACCESSKEYID --AccessKeySecret
  • 执行某些命令,例如通过 deploy 命令进行项目的部署,或者通过 build 等命令进行项目的构建:
s deploy -y

效果如图所示。

云效命令配置页面

由于在命令中引用了 3 个重要的环境变量:ACCOUNTID、 ACCESSKEYID、 ACCESSKEYSECRET,因此还需要在环境变量中增加图所示的类似内容。

环境变量配置页面

CI/CD 平台集成

总结通过上面几个案例不难发现,在做自动化发布时,最核心的 3 个流程如下。

  • 下载工具:命令为 npm install -g @Serverless-devs/s。
  • 配置密钥:命令为s config add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret $ACCESSKEYSECRET -a default。
  • 项目部署:命令为s deploy。

虽然只是以 GitHub Action、Gitee Go、Jenkins、云效几个工具作为案例,实际上无论哪个工具与 CI/CD 平台集成,上述 3 个核心流程都不会发生本质变化。另外,上面所列举的流程更多是在做自动化发布,在发布之前有时还需要进行一些测试和重新构建,以便根据具体的实际需要进行适当的完善。

综上所述,如果想非常简单、快速、科学地完成 Serverless 应用的 CI/CD 建设,一个完善的开发者工具是必不可少的。

Serverless Devs 是一款多云开发者工具。我们可以通过该工具非常简单、快速、方便地部署 AWS、阿里云、腾讯云等多个云厂商的函数计算等相关服务。同时,Serverless Devs 也是一个开源项目,便于用户随时随地贡献组件、应用。

Serverless 应用的可观测性

Serverless 应用的可观测性被很多用户所关注。可观测性是通过外部表现判断系统内部状态的方式。在应用开发中,可观测性有助于判断系统内部的健康状况,在系统出现问题时,帮助定位问题、排查问题、分析问题;在系统平稳运行时,帮助评估风险,预测可能出现的问题。

在 Serverless 应用开发中,如果函数的并发度持续升高,很可能是业务推广团队业务规模迅速扩张。为了避免达到并发度限制而触发流控,开发者就需要提前提高并发度。

以阿里云函数计算为例,阿里云函数计算在可观测性层面提供了多种维度,包括 Logging、Metrics 以及 Tracing 等。如图所示:

函数计算可观测性整体图表

在控制台监控中心,我们可以查看整体的 Metrics、服务级 Metrics 以及每个函数的 Metrics,还可以看到当前函数计算的请求记录。

函数计算的请求记录

根据不同的请求记录,我们还可以查看函数计算的详细信息。

函数计算的请求详情

除了在控制台的监控中心查看函数的日志等信息,我们还可以在函数详情页面看到函数计算的详细日志信息,

函数计算的日志信息

还可以看到 Tracing 相关信息,如下图所示。

函数计算的 Tracing 相关信息


阿里云、蚂蚁集团的 4 位专家刘宇、田初东、卢萌凯、王仁达(排名不分先后)系统梳理阿里在 Serverless 架构下的 AI 经验,联袂推出新书 《Serverless 架构下的 AI 应用开发:入门、实战与性能优化》

本书是关于 Serverless 架构下机器学习实战的技术书,我们希望通过简单明了的语言、真实的案例,以及开放的源代码,为读者介绍 Serverless 架构与机器学习相关的基础知识,帮助读者在 Serverless 架构下开发、上线机器学习项目。

serverless架构下的ai应用开发:入门实战与性能优化

随着时间的推移,Serverless架构变得越来越火热,凭借着极致弹性、按量付费、低成本运维等特性,在很多领域发挥着越来越重要的作用;机器学习领域在近些年也非常火热,并在越来越多的行业中得到应用。... 查看详情

实战指南|serverless架构下的应用开发

...,以更好地为Serverless架构提供支持。Serverless架构的应用开发流程基于Serverless架构的应用开发流程将会比基于传统架构 查看详情

serverless工程实践|serverless应用开发观念的转变(代码片段)

简介: Serverless架构带来的除了一种新的架构、一种新的编程范式,还包括思路上的转变,尤其是开发过程中的一些思路转变。有人说要把Serverless架构看成一种天然的分布式架构,需要用分布式架构的思路去开发... 查看详情

共克时艰,停工不停学serverless在线课堂免费开课(代码片段)

二月份,Serverless团队联合腾讯云大学与云+社区免费推出Serverless在线直播课程,课程涵盖Serverless架构解密、技术解析以及不同应用场景下的最佳实战指导,让你从0到1快速掌握Serverless开发知识,足不出户,就能完成开发技能升... 查看详情

fluid助力阿里云serverless容器极致提速(代码片段)

...著称的云服务。在这种数据密集应用上云的趋势下,Serverless似乎并不是这个趋势的明显受益者。尽管几乎所有人都对这种计算资源无限扩容、弹性敏捷交付、低运维成本的架构不吝赞美之词,但由于它将计算存储分离的... 查看详情

fluid助力阿里云serverless容器极致提速(代码片段)

...著称的云服务。在这种数据密集应用上云的趋势下,Serverless似乎并不是这个趋势的明显受益者。尽管几乎所有人都对这种计算资源无限扩容、弹性敏捷交付、低运维成本的架构不吝赞美之词,但由于它将计算存储分离的... 查看详情

serverless(无服务器架构)初识篇(代码片段)

一、什么是serveless?Serverless架构是一种按量计费的无服务器架构,有着一键部署、日志报警、低成本、弹性扩容等众多优势。我们传统的前后端分离开发模式是:UI设计页面——前端开发页面、后端开发接口——后端... 查看详情

serverlessdevs重大更新,基于serverless架构的ci/cd框架:serverless-cd(代码片段)

...全生命周期管理的平台,致力于为开发者打造Serverless应用开发一站式服务,帮助解决目前的工具链之困,让开发者一键体验多云产品,极速部署Serverless项目。ServerlessDevs项目为应用的开发,调试,部署ÿ... 查看详情

文本情感分析在serverless架构下的应用

文本情感分析是指对包含人们观点、喜好、情感等的主观性文本进行检测。该领域的发展和快速起步得益于社交媒体。越来越多的用户从单纯地获取互联网信息向创造互联网信息转变,例如产品评论、论坛讨论、博客等由用户发... 查看详情

serverless与flask框架结合进行blog开发(代码片段)

随着时间的发展,Serverless架构越来越火热,其按量付费、弹性伸缩等诸多优质特性,让人眼前一亮,不得不惊叹云计算为我们带来的便利。本实践通过一个博客系统的开发,和大家简单地体验一下基于Serverless架构的博客系统是... 查看详情

如何将传统web框架迁移部署到serverless架构?(代码片段)

与其说Serverless架构是一个新的概念,不如说它是一种全新的思路,一种新的编程范式。但是原生的Serverless开发框架却非常少。以Web框架为例,目前主流的Web框架“均不支持Serverless模式部署”,因此我们一方面要... 查看详情

serverless下的微服务实践

...注业务逻辑即可,本文将详解微服务体系与平台化的Serverless架构融合的过程。微服务架构介绍微服务架构诞生背景在互联网早期即Web1.0的时代,当时流行的是单体应用,研发团队比较小,主要是外部网页,然... 查看详情

开源工作流引擎如何支撑企业级serverless架构?(代码片段)

Serverless应用引擎(SAE)是一款底层基于Kubernetes,实现了Serverless架构与微服务架构结合的云产品。作为一款不断迭代的云产品,在快速发展的过程中也遇到了许多挑战。如何在蓬勃发展的云原生时代中解决这些挑... 查看详情

从函数计算到serverless架构(代码片段)

前言随着Serverless架构的不断发展,各云厂商和开源社区都已经在布局Serverless领域,一方面表现在云厂商推出传统服务/业务的Serverless化版本,或者Serverless计算平台,另一方面表现在开源社区中Serverless相关项目逐... 查看详情

基于serverless架构的编程学习小工具(代码片段)

...行代码的编写、运行还可以进行编程的学习。自己一直对Serverless架构情有独钟,恰好赶到我的这个App学习板块被很多人吐槽难用,索性就对这个学习板块进行重构,并且打算在重构的时候,直接将这个学习板块搬上Serverless架构... 查看详情

serverless从入门到进阶:架构原理与实践

Serverless从入门到进阶:架构、原理与实践腾讯云Serverless项目早期参与者撰写,基于腾讯云、阿里云和亚马逊云等多个云厂商的产品和技术;从产品和技术两个维度展开,讲解Serverless的架构设计、技术原理、开发流程、实战案例... 查看详情

serverless入门学习(代码片段)

MVC架构MVC前端:View层后端:Control层&&Model层Serverless解决问题的边界,就是服务端的边界,即服务端运维。Serverless狭义Serverless(最常见)=Serverlesscomputing架构=FaaS架构=Trigger(事件驱动)+FaaS(函数即服务)+BaaS(后端即服务... 查看详情

从函数计算到serverless架构(代码片段)

作者:秋雨陈前言随着Serverless架构不断发展,各云厂商和开源社区都已经布局Serverless领域,一方面表现在云厂商推出传统服务/业务的Serverless化版本,或者Serverless计算平台;另一方面表现在开源社区中Serverles... 查看详情