睿诚科技协会

Serverless如何实现?技术难点有哪些?

核心概念:什么是 Serverless?

首先要明确,Serverless 不是“没有服务器”,而是“你不再需要关心服务器的管理”

Serverless如何实现?技术难点有哪些?-图1
(图片来源网络,侵删)

这是一种云原生计算模型,开发者只需编写和部署业务代码(函数),云服务商会自动处理服务器的 provisioning(配置)、scaling(扩展)、scaling down(缩减)、patching(打补丁)、以及容错和冗余等所有底层运维工作。

你可以把它想象成一个“函数即服务”(Function-as-a-Service, FaaS)的自动餐厅:

  • :只负责做好你的“拿手菜”(业务函数代码)。
  • 餐厅:云服务商负责提供厨房(计算资源)、水电(网络、存储)、点餐系统(API网关)、服务员(触发器),甚至洗碗(日志、监控)。
  • 计费:你只需要为你做菜时实际消耗的燃气和水电(计算资源使用量)付费,而不是整个厨房24小时的租金。

实现原理:Serverless 架构如何工作?

一个典型的 Serverless 应用由以下几个核心组件协同工作构成:

  1. 函数

    Serverless如何实现?技术难点有哪些?-图2
    (图片来源网络,侵删)
    • 是什么:你的业务逻辑代码,通常是一个单一目的的、无状态的函数(处理图片上传、发送验证邮件、处理 API 请求)。
    • 特点:启动快、轻量级,代码被打包成部署包(如一个 ZIP 文件或容器镜像)。
  2. 触发器

    • 是什么:导致函数被调用的“事件”,它是连接 Serverless 世界与其他服务的桥梁。
    • 常见类型
      • API 网关触发器:当 HTTP 请求发送到特定 URL 时触发函数。
      • 对象存储触发器:当文件被上传/删除到云存储桶(如 S3, OSS)时触发函数。
      • 定时触发器:按照预设的 Cron 表达式(如每天凌晨 2 点)定时触发函数。
      • 消息队列触发器:当消息队列(如 SQS, Kafka, RabbitMQ)中有新消息时触发函数。
      • 数据库触发器:当数据库中的数据发生变化(如插入、更新)时触发函数。
  3. 计算服务

    • 是什么:运行你函数的环境,这是 Serverless 的核心,由云服务商提供。
    • 工作流程
      • 冷启动:当一段时间没有请求后,函数实例会被销毁以节省成本,当新请求到来时,云服务商需要重新创建一个函数实例并加载你的代码,这个过程称为“冷启动”,可能会导致延迟。
      • 热启动:如果函数被频繁调用,实例会被复用,后续请求几乎没有冷启动延迟。
  4. 其他云服务

    • 是什么:与函数配合使用的其他服务,用于构建完整的应用。
    • 常见服务
      • 数据库:如 Amazon DynamoDB, Google Cloud Firestore, Azure Cosmos DB(NoSQL 数据库,天然适合 Serverless)。
      • 对象存储:如 Amazon S3, Google Cloud Storage, Alibaba Cloud OSS(用于存储文件、静态资源等)。
      • API 网关:如 Amazon API Gateway, Alibaba Cloud API Gateway(将 HTTP 请求路由到函数)。
      • 身份认证与授权:如 Amazon Cognito, Auth0(管理用户登录和权限)。
      • 监控与日志:如 Amazon CloudWatch, Prometheus(记录函数执行日志、监控性能指标)。

工作流程示例:一个用户上传头像并自动生成缩略图的应用

Serverless如何实现?技术难点有哪些?-图3
(图片来源网络,侵删)
  1. 用户通过网页将头像图片上传到 对象存储(如 S3)。
  2. 上传事件触发一个 触发器
  3. 触发器调用 处理图片的函数
  4. 函数代码被执行,从 S3 读取原始图片,使用一个图像处理库(如 Pillow)生成缩略图。
  5. 函数将生成的缩略图保存回另一个 S3 存储桶。
  6. 整个过程的日志被发送到 监控系统(如 CloudWatch)。

主流 Serverless 平台

选择正确的平台是实现的第一步,目前市场由三大巨头主导,同时也有优秀的开源方案。

平台 提供商 核心计算服务 核心数据库 特点
AWS Lambda Amazon Web Services AWS Lambda DynamoDB 市场份额最大,生态系统最成熟,服务最全面,学习曲线较陡峭。
Google Cloud Functions Google Cloud Cloud Functions Firestore 与 GCP 生态(如 BigQuery, GKE)集成紧密,性能优异,冷启动通常较快。
Azure Functions Microsoft Azure Functions Cosmos DB 与微软生态(.NET, Office 365, Azure AD)无缝集成,适合企业级应用。
Serverless Framework 开源/社区 可插拔(支持 AWS, GCP, Azure 等) 可插拔 不是平台,而是框架,用于简化部署流程,用 YAML/JSON 定义基础设施,实现跨平台部署。
Knative 开源(CNCF) 可插拔(基于 Kubernetes) 可插拔 开源的 Serverless 平台,可以在任何支持 Kubernetes 的集群上运行,避免了厂商锁定,但运维复杂度更高。

如何选择?

  • 新手入门/快速验证:从 AWS Lambda 开始,资料最多。
  • 全栈 Google 开发:选择 Google Cloud Functions。
  • 微软技术栈:Azure Functions 是不二之选。
  • 避免厂商锁定:考虑 Knative,但需要自己管理 K8s 集群。
  • 统一部署流程:强烈推荐使用 Serverless FrameworkTerraform 来管理你的 Serverless 应用。

实践步骤:如何实现一个 Serverless 应用?(以 AWS Lambda 为例)

我们通过一个简单的例子:创建一个 API,接收一个名字,返回 "Hello, [Name]!"。

步骤 1:环境准备

  1. 注册云账号:拥有一个 AWS 账号。
  2. 安装 AWS CLI:并配置好 aws configure,输入你的 Access Key 和 Secret Key。
  3. 安装 Node.js:我们将用 Node.js 编写函数。

步骤 2:编写函数代码

创建一个项目目录 hello-lambda,并创建文件 index.js

// index.js
exports.handler = async (event) => {
    // 从 event 对象中获取 name 参数
    const name = event.queryStringParameters && event.queryStringParameters.name ? event.queryStringParameters.name : 'Stranger';
    // 返回一个 HTTP 响应
    const response = {
        statusCode: 200,
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            message: `Hello, ${name}!`,
        }),
    };
    return response;
};

步骤 3:配置基础设施(使用 Serverless Framework)

  1. 安装 Serverless Framework CLI:

    npm install -g serverless
  2. 初始化项目:

    serverless create --template aws-nodejs --path hello-lambda

    这会生成一个 serverless.yml 文件和 handler.js,我们用自己写的 index.js 替换 handler.js,并修改 serverless.yml

  3. 编辑 serverless.yml:

    service: hello-lambda
    provider:
      name: aws
      runtime: nodejs18.x # 指定 Node.js 版本
      region: us-east-1 # 指定区域
    functions:
      hello:
        handler: index.handler # 指向你的 handler 文件和函数名
        events:
          - httpApi: # 使用 HTTP API 网关
              path: /hello
              method: get

    这个 YAML 文件定义了:

    • 我们使用 AWS 提供商。
    • 运行时是 Node.js 18。
    • 有一个名为 hello 的函数。
    • 这个函数由一个 HTTP API 请求触发,路径是 /hello,方法是 GET

步骤 4:部署

在项目根目录下运行命令:

serverless deploy

Serverless Framework 会自动:

  1. 打包你的代码。
  2. 在 AWS 中创建或更新 Lambda 函数、API Gateway 等所有必要资源。
  3. 将部署包上传到 S3。
  4. 完成后,它会输出一个 API 端点 URL。

步骤 5:测试和验证

复制输出的 URL(https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/hello),在浏览器或 Postman 中访问:

  • https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/hello -> 返回 {"message":"Hello, Stranger!"}
  • https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/hello?name=Serverless -> 返回 {"message":"Hello, Serverless!"}

步骤 6:监控与日志

  1. 登录 AWS 控制台。
  2. 进入 CloudWatch 服务。
  3. 在 "Log groups" 中,找到你的 Lambda 函数对应的日志组。
  4. 你可以查看每一次函数执行的详细日志,这对于调试至关重要。

优缺点分析

优点

  1. 极致的弹性与扩展性:可以轻松应对从每秒 0 次到数千次请求的流量波动,无需手动配置服务器。
  2. 按需付费,成本效益高:只为函数实际执行的时间和消耗的资源付费,几乎没有闲置成本,对于间歇性或不可预测的工作负载尤其划算。
  3. 开发者专注业务逻辑:从繁琐的服务器管理、补丁更新、容量规划中解放出来,让开发者专注于编写代码。
  4. 更高的可靠性:云服务商负责底层基础设施的高可用性,你的函数会自动在多个可用区部署和运行。
  5. 运维简化:无需管理操作系统、运行时或服务器软件的生命周期。

缺点与挑战

  1. 厂商锁定:代码和配置与特定云平台的服务紧密耦合,迁移到其他平台成本很高。
  2. 冷启动问题:如前所述,可能导致不可预测的延迟,对实时性要求高的应用是挑战。
  3. 调试和监控困难:分布式架构使得问题定位比传统应用更复杂,需要依赖强大的云厂商监控工具(如 CloudWatch)。
  4. 执行时间限制:单个函数的执行时间有上限(如 AWS Lambda 为 15 分钟),不适合长时间运行的任务。
  5. 状态管理复杂:函数是无状态的,有状态的数据(如用户会话)必须存储在外部数据库中,增加了架构的复杂性。
  6. 依赖管理:如果你的函数依赖大量第三方库,部署包可能会变得很大,影响冷启动速度。

适用场景

  • Web 和移动后端:构建 API、处理用户认证、数据验证。
  • 数据处理与ETL:对上传到 S3 的文件进行批量处理(如日志分析、数据转换)。
  • 实时流处理:与 Kinesis 或 Kafka 集成,处理实时数据流。
  • 聊天机器人:响应来自 Slack、Teams 等平台的 webhook 事件。
  • IoT 后端:处理来自大量物联网设备的数据和指令。
  • 定时任务:每日报告生成、数据备份、清理任务。

不适用场景

  • 长时间运行的计算任务:如视频渲染、大型科学计算。
  • 有状态且需要大量本地缓存的应用:如传统的关系型数据库应用。
  • 需要低延迟、稳定性能的实时系统:对冷启动延迟零容忍的应用。

Serverless 技术通过将开发者从底层基础设施中解放出来,极大地提升了开发效率和资源利用率,它并非万能药,但对于特定类型的应用(尤其是事件驱动、间歇性负载的应用)是一种极具颠覆性和成本效益的架构模式。

实现 Serverless 的关键在于:

  1. 理解其核心组件(函数、触发器、服务)
  2. 选择合适的平台或框架
  3. 将应用逻辑拆分为细粒度、无状态的函数
  4. 熟练使用云服务商提供的工具链(监控、日志、数据库等)。

随着 Serverless for Kubernetes (Knative) 等开源方案的发展,Serverless 的未来将更加开放和灵活。

分享:
扫描分享到社交APP
上一篇
下一篇