Serverless初探

2024年 2月 29日 69.3k 0

Serverless概念介绍

Server-服务,less-少,Serverless其实是一种开发者只需关注如何更好提供服务,而无需关心服务器的架构思想。传统应用缺点:服务器利用率低(应用常年cpu利用率<10%)、DevOps成本高(Docker、进程、限流、日志等前端维护乏力)

从发展视角看Serverless

  • 物理机时代:单机版的单体架构,数据库、应用、Nginx 等服务全都在一台你自己管理的服务器上。最大问题就是需要关心网络,关心主机,关心它的虚拟化,关心操作系统和中间件,关心应用运行时和node版本,关心数据存储位置和后期运维成本。
  • 虚拟机时代:不需要关注物理机,把一台物理机分割成多台虚拟机提供给多用户使用,充分利用硬件资源,而且创建速度和弹性也远超物理机。这中间很多云厂商也提供了IaaS和PaaS服务。但IaaS只是也需要关心它的运行时、成本、应用、数据。而PaaS类似提供应用引擎,只需提交代码即可运行,但还是要关心成本、应用、数据,而且不是按量付费,而是按租用时间。
  • 容器技术时代:不需要关心运行环境,把代码和运行环境打包在一起,这样代码就可以在任何地方运行。但容器多了如何管理成了问题,虽出现Kubernetes容器编排技术可实现自动弹性伸缩,但支撑不了双十一这种需秒级弹性要求。
  • Serverless 时代:构建和运行不需要服务器管理的一种概念,相当于写一个云函数,部署后,调用就收费,不调用就不收费,即按流量计费。
  • IaaS、PaaS、SaaS是什么?

    IaaS PaaS SaaS
    Infrasturcture as a Service Platform-as-a-Service Software-as-a-Service
    基础设施即服务 平台即服务 软件即服务
    IaaS公司提供场外服务器、存储和网络硬件等 PaaS公司提供应用程序开发环境或部分应用 SaaS公司提供完整可食用应用程序

    FaaS和BaaS是什么?

    FaaS是函数即服务,应用层面的对外接口,而BaaS则是后端即服务,更多的是业务系统相关的服务。
    写一个函数提供出去,并通过回调结果返回,就可以实现一次Faas调用,调用完后就会显示Hello Serverless
    exports.handler = (event, context, callback) => {
    callback(null, 'Hello Serverless');
    }
    整体架构就是会有不同数据源,不同数据源都可连接到FaaS后端,FaaS会根据当前请求量去缩扩容,并且决定启用多少容器,去算最终成本。

    Serverless特性

    • Hostless:不绑定具体主机,跑在云厂商服务器任何一台都可以
    • Elastic:弹性,遇到大流量可快速扩容
    • Stateless:无状态,因为函数随时可能被启动,随时可能被销毁
    • Event-driven:事件驱动,如上传文件就是上传事件,请求服务器就是请求事件,不同事件对应不同函数,不同函数实现不同功能
    • Lego Blocks:乐高式组合
    • High Availability:高可用,不会因流量洪峰导致额外故障
    • Usage-based Cost:按量付费,而不是传统的按时间付费

    Serverless案例

    • Web应用:当用户访问cdn内容分发网络,cdn会把事件派发给函数计算,函数计算可连通后台服务,可以去表格存储里拉数据,去文件存储里拉文件,去日志函数里打日志,然后返回计算结果,最后给用户返回一个站点或一些数据。
    • 视频转码:上传mp4可能需要转成mkv等各种格式,用户上传视频到对象存储,对象存储此时派发一个事件去触发函数,即文件上传后函数计算就会收到一次调用,从而进行相关操作,包括调用整个函数工作流,即调用更多函数去执行转码任务,转码完成后这些函数又会被回收掉,并把转码后文件上传到对象存储。

    Serverless落地

    开发 Serverless 应用

    • Serverless应用开发流程

    • 选择一个 Serverless FaaS 平台,如 阿里云函数计算

    • 开发完的函数代码部署到 FaaS 平台

    • 为函数配置 HTTP 触发器

      • 下面结合在阿里云函数计算平台相关操作配图进行详细说明
      • 进入函数计算控制台,新建一个函数
        image.png

      • 函数创建成功后,就会进入到代码编辑页面,在编辑器中写入代码
        image.png

      • 写完代码后,你就可以在“触发器”标签下看到函数计算为你默认创建的 API Endpoint,用该 API Endpoint 对函数进行测试。接口也按照预期返回了status code: 200。
        image.png

    • 到目前为止,这个应用很简单(只有一个函数),而实际情况绝大部分应用都是由多个函数组成的,应用部署时需要将所有函数一同部署,并且函数运行依赖 FaaS 环境,这就导致函数代码不能直接在本地运行。要解决这些问题,你就需要一套完整的开发、调试和部署 Serverless 的解决方案,于是出现了 Serverless 开发框架

    现在主流 Serverless 开发框架 Serverless Framework/Serverless Cloud Framework

    目前最完善的 Serverless 开发框架之一。它不仅实现了前面提到的应用开发、调试、部署等基础功能,还实现了多个 Serverless 平台的支持。

    框架使用讲解

    • 安装
      Serverless Framework 是使用 Node.js 开发的,所以你可以使用 npm 直接来安装它
    $ npm install -g serverless
    $ serverless --version
    
    • 账号设置
    $ serverless config credentials --provider aws --key key --secret secret
    --provider 具体的 Serverless 平台
    --key AWS 账号的 aws_access_key_id
    --secret AWS 账号的 aws_secret_access_key
    
    • 应用配置

      • 初始化一个应用
    $ serverless create --template svl-nodejs
    $ ls
    index.js    serverless.yml
    
    • 通过 YAML 配置文件来定义应用和函数
    # serverless.yaml
    # 应用名称
    service: myservice
    frameworkVersion: '2'
    provider:
      name: aws
      runtime: nodejs12.x # 函数运行环境
    # 函数列表
    functions:
      # 函数1
      index:
        handler: index.handler # 函数入口
        events: # 函数触发器,一个函数可能有多个触发器
          - http
    
    • 应用开发
    // index.js
    exports.handler = (event, context, callback) => {
        // 从 event 中获取 URL query 参数
        const { name } = event.queryStringParameters;
        // 定义 HTTP Response
        const response = {
            statusCode: 200,
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify({ message: `Hello ${name}!`} ),
        };
        callback(null, response);
    };
    
    • 应用调试
      调试函数也很简单,直接通过 invoke 命令
    # 远程调试
    $ serverless invoke --function hello
    
    # 本地调试
    $ serverless invoke local --function hello
    
    • 应用部署
      使用 deploy 命令来部署应用,将函数部署之前,serverless 会先在本地将代码打包,最终代码是一个压缩包,路径为 .serverles/[serviceName].zip 。
    $ serverless deploy
    Serverless: Packaging service...
    
    $ tree
      |-- .serverless
      |-- myservice.zip
      |-- handler.js
      |-- serverless.yaml
    

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论