个人随笔
目录
Serverless 从原理到实战完整笔记(K8s+OpenFaaS+Java落地)
2026-07-01 23:23:52
本文为系统性 Serverless 学习复盘笔记,彻底讲透:Serverless 是什么、核心原理、K8s 如何运行 Serverless、OpenFaaS 架构、Java 函数开发/访问/登录鉴权、自动扩缩容0、自动发布编排等核心问题,同时纠正认知误区、明确适用场景,适合零基础入门与云原生实战落地参考。

一、彻底搞懂:什么是 Serverless?(破除认知误区)


行业标准定义:Serverless 是事件驱动、按需执行、按量付费、零常驻闲置资源的计算模型,核心载体为 FaaS(函数即服务)和 BaaS(后端即服务),日常技术落地中,Serverless 多指 FaaS。

1.2 核心特征(判断是否为 Serverless 的关键)

很多人误以为“容器自动扩缩容、自动发布就是 Serverless”,这是典型误区,完整的 Serverless 必须满足以下核心特质:
  • 基础设施无感知:无需管理 K8s 节点、容器、网络、负载均衡、服务器开关机、补丁升级等底层资源
  • 弹性缩容至 0:无请求、无任务时,实例数彻底归零,不占用任何计算资源,区别于普通 K8s 自动扩缩容(最低保活1个实例)
  • 事件触发执行:不常驻后台,由 HTTP 请求、定时任务、消息队列、数据库变更等事件触发执行
  • 按量付费:仅计算函数执行时长、资源占用量,闲置零成本
  • 自动编排发布:代码提交即可自动构建、镜像打包、部署、灰度、流量调度,无需手动运维

1.3 关键误区解答(你最关心的问题)

Q:只要满足基础设施不用管、容器自动扩缩容到0、自动发布编排就是 Serverless 吗?
A:基本正确,但缺一不可
仅自动扩缩容、自动发布的 K8s 微服务,属于云原生自动化部署,不是 Serverless。必须叠加缩容至0+事件驱动+按需付费+基础设施零运维四大核心能力,才是标准 Serverless 架构。普通微服务是「常驻服务」,Serverless 是「按需瞬时服务」,这是最本质的区别。

二、Serverless 核心工作原理

2.1 整体运行机制

Serverless 的核心逻辑是平台托管资源,事件驱动生命周期,完整链路分为5步:
  1. 代码上传/提交:开发者提交函数业务代码,无需配置服务器、容器参数
  2. 平台自动构建编排:Serverless 平台自动完成镜像构建、打包、资源注册、路由配置
  3. 监听触发事件:平台持续监听 HTTP、定时、消息、API 调用等触发条件
  4. 即时拉起实例执行:事件到来时,快速创建容器实例、执行函数逻辑、处理请求
  5. 执行完毕缩容归零:请求处理完成、超时无新请求后,自动销毁容器实例,资源彻底释放

2.2 核心架构分层

  • 控制面:负责函数管理、镜像构建、发布编排、弹性策略、权限配置、日志监控
  • 数据面:负责流量接入、请求转发、容器调度、实际函数执行、资源占用统计
  • 触发器层:承接各类事件,作为函数执行的入口,是 Serverless 事件驱动的核心

三、K8s 中如何执行 Serverless?(底层落地原理)

Kubernetes 本身不原生支持 Serverless,默认的 Deployment 只能实现扩缩容,无法缩容至0、无法事件驱动。业界主流方案是基于 K8s 扩展组件实现 Serverless 能力,最常用两套体系:Knative(通用云原生 Serverless)、OpenFaaS(轻量化函数计算)。

3.1 K8s 运行 Serverless 的核心改造逻辑

  • 替代传统 Deployment,使用 Serverless 自定义资源(CRD)管理函数实例生命周期
  • 新增网关与触发器组件,实现事件监听与流量调度
  • 重构弹性策略:支持从0扩容、空闲缩容至0,彻底消除常驻资源
  • 自动化 CI/CD 闭环:代码提交自动构建镜像、更新服务、灰度发布、流量切换

3.2 主流 K8s Serverless 组件对比

  • Knative:谷歌开源,生态完善,主打通用 Serverless 服务,支持灰度发布、流量灰度、精准弹性策略,适合生产级大规模落地
  • OpenFaaS:轻量化、易部署、上手简单,专注 FaaS 函数计算,多语言友好,非常适合 Java 函数快速开发与落地,是本文重点实战方案

四、OpenFaaS 架构详解(K8s 轻量化 FaaS 首选)

4.1 OpenFaaS 核心组件

OpenFaaS 是基于 K8s 的开源 Serverless 函数计算平台,架构简洁、运维成本极低,核心组件如下:
  • Gateway(网关):核心入口,接收所有 HTTP 请求、管理触发器、调度函数、统计调用指标、控制弹性伸缩
  • Faas-Provider-K8s:对接 K8s 核心组件,负责将函数配置转化为 K8s 资源,管理容器创建、销毁、扩缩容
  • Builder:自动构建组件,支持在线/本地构建函数镜像,无需手动写 Dockerfile
  • Watchdog(看门狗):每个函数容器内置进程,负责监听请求、保活、超时退出,支撑缩容至0能力

4.2 OpenFaaS 运行流程

  1. 用户通过 CLI/控制台提交 Java 函数代码
  2. OpenFaaS 自动构建镜像,推送至镜像仓库,在 K8s 中注册函数服务
  3. 网关监听外部请求,无请求时函数实例数为0
  4. 请求到达,网关触发 K8s 拉起对应函数 Pod,执行 Java 业务逻辑
  5. 请求结束,空闲超时后自动销毁 Pod,实例归零,释放资源

五、Java 函数实战开发(OpenFaaS 标准流程)

OpenFaaS 原生支持 Java 运行时,提供官方模板,无需复杂配置,快速开发可部署、可自动弹性的 Serverless 函数。

5.1 环境前置准备

  • 已部署 K8s 集群 + OpenFaaS 完整环境
  • 安装 faas-cli 命令行工具(OpenFaaS 核心操作工具)
  • JDK11+、Maven/Gradle 环境

5.2 初始化 Java 函数项目

1、拉取官方 Java 函数模板
faas-cli template pull https://github.com/openfaas/templates
2、创建 Java 函数项目
faas-cli new java-demo-func --lang java11
执行后自动生成标准 Java 函数目录结构,包含入口类、配置文件、构建脚本,开箱即用。

5.3 编写核心业务代码

入口文件为 Handler.java,所有业务逻辑统一在此实现,示例极简接口:
package com.openfaas.function;

public class Handler {
    // 函数入口方法,接收请求参数,返回响应结果
    public String handle(String input) {
        return "Java Serverless 函数执行成功!请求参数:" + input;
    }
}

5.4 自动构建与发布(零手动运维)

1、构建镜像、自动打包
faas-cli build -f java-demo-func.yml
2、推送镜像至仓库、部署到 K8s
faas-cli push -f java-demo-func.yml
faas-cli deploy -f java-demo-func.yml
执行完成后,OpenFaaS 自动完成 K8s 资源创建、路由注册、弹性策略配置,全程无需操作 K8s 原生资源。

六、Serverless 函数访问方式(HTTP/触发器)

OpenFaaS 函数默认以 HTTP 接口 对外暴露,同时支持多种事件触发方式,适配不同业务场景。

6.1 直接 HTTP 访问(最常用)

部署成功后,自动生成唯一访问地址,格式:http://<网关IP>:8080/function/<函数名>
示例访问:
# GET 请求
curl http://127.0.0.1:8080/function/java-demo-func

# POST 传参请求
curl -X POST -d "test-param" http://127.0.0.1:8080/function/java-demo-func

6.2 其他触发方式

  • 定时触发:配置 cron 表达式,定时自动执行函数,适合定时任务、数据同步
  • 消息触发:对接 Kafka/RabbitMQ,消息到达自动触发函数消费
  • API 网关触发:绑定自定义域名、路由,对外标准化提供接口服务

6.3 补充说明

支持扩展复杂业务:数据库调用、HTTP 请求、消息队列消费、文件处理等,可正常引入 Maven 依赖。

根据 OpenFaaS 官方最新模板规范,不同 Java 模板能力差异极大,直接决定是否能获取请求头、Token、HTTP 元数据,选型错误会导致接口报错、参数获取失败:
  • java11(废弃不推荐):经典老旧模板,基于 CGI 模型,仅支持 handle(String input)入参,无法获取请求头、请求方法、URL、Token,仅能接收请求体字符串,生产环境禁用,也是多数接口访问异常的核心原因
  • java17(官方推荐标准版):基于 of-watchdog 高性能模型,支持完整 HTTP 事件,可获取全部请求信息,稳定无兼容问题
  • java11-vert-x(高性能异步版):基于 Vert.x 异步框架,高并发场景优选,同样支持完整 HTTP 请求对象
全新创建可获取请求头、支持鉴权的标准函数(替换旧的java11命令):
# 推荐使用 java17 官方稳定模板
faas-cli new java-demo-func --lang java17
package com.openfaas.function;

import com.openfaas.model.Request;
import com.openfaas.model.Response;

/**
 * 标准 Java17 模板入口(支持完整HTTP请求、请求头、Token鉴权)
 * 废弃旧写法:public String handle(String input)
 * 新版固定入参:Request(全部请求信息)、Response(自定义响应)
 */
public class Handler {
    // 完整事件驱动入口,可获取所有HTTP元数据
    public void handle(Request request, Response response) {
        // 1. 获取请求头(核心:用于登录鉴权、获取客户端信息)
        String authorization = request.getHeader("Authorization");
        String userAgent = request.getHeader("User-Agent");
        
        // 2. 获取请求基础信息
        String method = request.getMethod(); // GET/POST/PUT/DELETE
        String path = request.getPath();
        String queryParam = request.getQueryString();
        String body = request.getBody();

        // 3. 业务逻辑处理 + 响应返回
        String result = "【Java17 Serverless标准函数执行成功】\n" +
                "请求方式:" + method + "\n" +
                "请求路径:" + path + "\n" +
                "Query参数:" + queryParam + "\n" +
                "请求Body:" + body + "\n" +
                "Authorization令牌:" + authorization;

        response.setBody(result);
        response.setStatusCode(200);
    }
}
通过 Request 对象可全覆盖开发所需的请求信息,完美支撑登录鉴权、参数校验、客户端溯源等业务场景,彻底解决旧模板无法获取请求头的痛点。
支持扩展复杂业务:数据库调用、HTTP 请求、消息队列消费、文件处理等,可正常引入 Maven 依赖。


七、函数登录鉴权方案(安全访问控制)

Serverless 函数默认公开访问,生产环境必须配置登录认证、权限控制,主流三种落地方案,适配不同场景。

7.1 方案一:OpenFaaS 基础账号密码认证(平台级)

OpenFaaS 网关自带基础认证,开启后所有函数接口必须输入账号密码才能访问,适合内部私有函数。
默认账号密码由集群 Secret 生成,可自定义配置,全局统一鉴权,无需修改业务代码。

7.2 方案二:JWT 令牌认证(业务级,推荐)

适合对外公开接口、精细化权限控制,流程如下:
  1. 单独编写登录函数,接收用户名密码,校验成功后生成 JWT 令牌返回
  2. 所有业务函数统一拦截请求,校验 Header 中的 Token
  3. Token 有效则执行业务逻辑,无效直接返回 401 无权限
Java 函数可集成 Spring Security、JJWT 快速实现,适配常规后端鉴权体系。

7.3 方案三:第三方身份服务对接(企业级)

对接 Keycloak、OAuth2.0 等统一身份平台,由网关层统一鉴权,函数无需感知认证逻辑,解耦性最强,适合大型集群、多函数统一权限管理。

八、Serverless 自动扩缩容至0 核心原理

8.1 弹性触发机制

OpenFaaS/Knative 会实时监控函数 QPS、请求堆积数、CPU/内存使用率,实现智能弹性:
  • 扩容:请求量突增、单实例压力过大时,秒级新增 Pod 实例,支撑并发
  • 缩容:请求量下降后,逐步减少实例数
  • 缩容至0:默认空闲超时(可自定义,默认几十秒)无任何请求,销毁所有 Pod,实例数归零,彻底释放资源

8.2 和普通 K8s 扩缩容的本质区别

  • 普通 K8s HPA:最低实例数 ≥1,服务常驻,闲置仍占用资源
  • Serverless 弹性:最低实例数=0,无请求零资源占用,真正按需付费

九、Serverless 适用场景与不适用场景

9.1 最佳使用场景

  • 突发流量、低频业务:后台管理接口、临时查询、活动秒杀、低频回调服务,闲置节省大量资源
  • 事件驱动任务:定时任务、消息消费、日志处理、数据清洗、文件解析
  • 快速迭代小服务:轻量化接口、工具类服务,无需运维,快速上线
  • 微服务拆分后的细粒度能力:单一职责的功能模块,独立部署、独立弹性

9.2 不适用场景

  • 超高并发常驻核心服务:电商首页、支付核心链路,频繁冷启动会增加延迟
  • 长连接、长耗时任务:WebSocket、超大文件处理、超长时间计算,容易触发超时销毁
  • 强状态依赖服务:Serverless 函数默认无状态,不适合本地缓存、会话常驻场景

十、全文核心总结

  1. Serverless 不是无服务器,是开发者零基础设施运维、平台全托管的事件驱动计算模型
  2. 核心判定标准:事件触发、自动扩缩容到0、按量付费、自动发布编排、底层无感知
  3. K8s 需依赖 OpenFaaS/Knative 等组件实现 Serverless 能力,弥补原生无零缩容、无事件驱动的短板
  4. Java 可基于 OpenFaaS 官方模板快速开发函数,极简部署、零运维、自动弹性
  5. 函数支持 HTTP/定时/消息多方式触发,可通过平台认证、JWT、第三方身份系统实现登录鉴权
  6. 适合低频、突发、事件驱动业务,不适合长连接、常驻超高并发核心服务
 6

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2