本文为系统性 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步:
- 代码上传/提交:开发者提交函数业务代码,无需配置服务器、容器参数
- 平台自动构建编排:Serverless 平台自动完成镜像构建、打包、资源注册、路由配置
- 监听触发事件:平台持续监听 HTTP、定时、消息、API 调用等触发条件
- 即时拉起实例执行:事件到来时,快速创建容器实例、执行函数逻辑、处理请求
- 执行完毕缩容归零:请求处理完成、超时无新请求后,自动销毁容器实例,资源彻底释放
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 运行流程
- 用户通过 CLI/控制台提交 Java 函数代码
- OpenFaaS 自动构建镜像,推送至镜像仓库,在 K8s 中注册函数服务
- 网关监听外部请求,无请求时函数实例数为0
- 请求到达,网关触发 K8s 拉起对应函数 Pod,执行 Java 业务逻辑
- 请求结束,空闲超时后自动销毁 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/templates2、创建 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.yml2、推送镜像至仓库、部署到 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-func6.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 java17package 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 令牌认证(业务级,推荐)
适合对外公开接口、精细化权限控制,流程如下:
- 单独编写登录函数,接收用户名密码,校验成功后生成 JWT 令牌返回
- 所有业务函数统一拦截请求,校验 Header 中的 Token
- 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 函数默认无状态,不适合本地缓存、会话常驻场景
十、全文核心总结
- Serverless 不是无服务器,是开发者零基础设施运维、平台全托管的事件驱动计算模型
- 核心判定标准:事件触发、自动扩缩容到0、按量付费、自动发布编排、底层无感知
- K8s 需依赖 OpenFaaS/Knative 等组件实现 Serverless 能力,弥补原生无零缩容、无事件驱动的短板
- Java 可基于 OpenFaaS 官方模板快速开发函数,极简部署、零运维、自动弹性
- 函数支持 HTTP/定时/消息多方式触发,可通过平台认证、JWT、第三方身份系统实现登录鉴权
- 适合低频、突发、事件驱动业务,不适合长连接、常驻超高并发核心服务
