当前位置:

首页 > 系统应用 > 距离Java开发者玩转Serverless,到底还有多远?

距离Java开发者玩转Serverless,到底还有多远?

本文目录

    简介: 本文摘自 Spring Cloud Alibaba 开源项目创始团队成员方剑撰写的《深入理解 Spring Cloud 与实战》一书,主要讲述了 Java 微服务框架 Spring Boot/Cloud 这个事实标准下如何应对 FaaS 场景。 导读:本文摘自 Spring Cloud Al

    简介: 本文摘自 Spring Cloud Alibaba 开源项目创始团队成员方剑撰写的《深入理解 Spring Cloud 与实战》一书,主要讲述了 Java 微服务框架 Spring Boot/Cloud 这个事实标准下如何应对 FaaS 场景。

    导读:本文摘自 Spring Cloud Alibaba 开源项目创始团队成员方剑撰写的《深入理解 Spring Cloud 与实战》一书,主要讲述了 Java 微服务框架 Spring Boot/Cloud 这个事实标准下如何应对 FaaS 场景。

    Serverless & FaaS

    2019 年,O'Reilly 对 1500 名 IT 专业人员的调查中,有 40% 的受访者在采用 Serverless 架构的组织中工作。2020 年DataDog 调查显示,现在有超过 50% 的 AWS 用户正在使用 Serverless 架构的 AWS Lambda。

    Serverless 正在成为主流,于是就诞生了下面这幅图,从单体应用的管理到微服务应用的管理再到函数的管理。

    Serverless 到目前为止还没有一个精准定义。Martin Fowler 在个人博客上有一篇《ServerlessArchitectures》文章,其对 Serverless 的的定义分成了 BaaS 或 FaaS。

    Baas 是全称是 Backend-as-a-Service,后端即服务,FaaS 的全称是 Function-as-a-Service,函数即服务。

    今天我们来聊聊 FaaS。这是维基百科对 FaaS 的定义:

    函数即服务(FaaS)是一种云计算模式,允许开发人员在云中运行单个代码片段或函数,而无需管理底层基础设施。FaaS通常被视为无服务器计算的关键组成部分,在这种模式下,云服务提供商负责服务器管理。开发人员只需编写并部署代码,云服务提供商便会根据特定事件(如API调用、数据库更新或消息队列触发)来执行代码。

    对于 Python、JavaScript 这种天生支持 Lambda 的开发语言,和 FaaS 简直是完美结合。Serverless Framework 的调研报告也很好地说明了这一点。NodeJS、Python 是 FaaS 使用率前二的语言。

    我们知道,因为 JVM 占用的内存比较大,所以 Java 应用的启动会有点慢,不太适合 FaaS 这个场景,这也是 Java 在使用率上偏低的原因。

    另外,对 Java 开发者来说 Spring Boot/Cloud 已经成为了事实标准,依赖注入是 Spring Framework 的核心,Spring Boot/Cloud 这个事实标准应对 FaaS 这个场景,会碰撞出怎么样的火花呢?这就是今天我们要聊的 Spring Cloud Function。

    Java Function

    在对 Spring Cloud Function 介绍之前,我们先来看 Java 里的核心函数定义。

    JDK 1.8 推出了新特性 Lambda 表达式,java.util.function 包下面提供了很多的函数。这 3 个函数尤为重要:

    1. java.util.function.Function: 需要一个参数,得到另一个结果.

    @FunctionalInterface
    public interface Function {
    R apply(T t);
    }

    比如通过 Stream API 里的 map 方法可以通过 Function 把字符串从小写变成大写:

    Stream.of("a", "b", "c").map(String::toUpperCase);

    这里的 map 方法需要一个 Function 参数:

     Stream map(Function mapper);

    2. java.util.function.Consumer: 需要一个参数进行操作,无返回值。

    @FunctionalInterface
    public interface Consumer {
    void accept(T t);
    }

    比如通过 Stream API 里的 forEach 方法遍历每个元素,做对应的业务逻辑处理:

    RestTemplate restTemplate = new RestTemplate();
    Stream.of("200", "201", "202").forEach(code -> {
    ResponseEntity responseEntity =
    restTemplate.getForEntity("http://httpbin.org/status/" + code, String.class);
    System.out.println(responseEntity.getStatusCode());
    });

    3. java.util.function.Supplier: 得到一个结果,无输入参数。

    @FunctionalInterface
    public interface Supplier {
    T get();
    }

    比如自定义 Supplier 可以返回随机数:

    Random random = new Random();

    Supplier supplier100 = () -> random.nextInt(100);
    Supplier supplier1000 = () -> random.nextInt(1000);

    System.out.println(supplier100.get());
    System.out.println(supplier1000.get());
    Spring Cloud Function

    Java Function 的编程模型非常简单,本质上就是这 3 个核心函数:

    • Supplier
    • Function
    • Consumer

    Spring Cloud Function 是 Spring 生态跟 Serverless(FaaS) 相关的一个项目。它出现的目的是增强 Java Function,主要体现在这几点:

    • 统一云厂商的 FaaS 编程模型: Spring Cloud Function 的口号是 "Write Once, Run Anywhere"。我们写的 Spring Cloud Function 代码可以运行在本地、各个云厂商(AWS Lambda, GCP Cloud Functions, Azure Functions)。
    • 自动类型转换: 理解过 Spring MVC 或者 Spring Cloud Stream 的同学肯定对 HttpMessageConverter 或者 MessageConverter 模型,这个转换器的作用是将 HTTP BODY(或者 Message Payload)、HTTP Query Parameter、HTTP HEADER(或者 Message Header)自动转换成对应的 POJO。有了这个特性后,我们就无需关注函数的入参和返回值,用 String 参数就可以获取原始的入参信息,用 User 这个 POJO 参数就可以将原始的入参参数自动转换成 User 对象。
    • 函数组合: 可以让多个函数之间进行组合操作。
    • 函数管理: 新增 FunctionCatalog、FunctionRegistry 接口用于 Function 的管理。管理 ApplicationContext 内的 Function,动态注册 Function 等操作。
    • Reactive 支持: Spring Cloud Function 新增比如 FluxFunction、FluxSupplier、FunctionConsumer 这种 Reactive 函数。
    • 自动跟 Spring 生态内部原有的组件进行深度集成:

      • Spring Web/Spring WebFlux: 一次 HTTP 请求是一次函数调用。
      • Spring Cloud Task: 一次任务执行是一次函数调用。
      • Spring Cloud Stream: 一次消息消费/生产/转换是一次函数调用。

    这里再多介绍统一云厂商的 FaaS 编程模型,让大家对 Spring Cloud Function 更有体感。

    AWS Lambda 是第一个是提供 FaaS 服务的云厂商,RequestStreamHandler 是 AWS 提供的针对 Java 开发者的接口,需要实现这个接口:

    public class HandlerStream implements RequestStreamHandler {
    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException
    {
    ...

    Azure Functions 针对 Java 开发者提供了 @HttpTrigger 注解:

    public class Function {
    public String echo(@HttpTrigger(name = "req",
    methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS)
    String req, ExecutionContext context) {
    ...
    }
    }

    从这两段代码可以看出,不同的云厂商要编写不同的代码。如果要变换云厂商,这个过程会很痛苦。

    另外,无论是 AWS、Azure 或者 GCP 提供的接口或注解,他们没有任何 Spring 上下文相关的初始化逻辑。如果我们是一个 Spring Boot/Cloud 应用迁移到 FaaS 平台,需要添加 Spring 上下文初始化逻辑等改动量。

    Spring Cloud Function 的出现就是为了解决这些问题。

    Spring Cloud Function 的使用

    Spring Cloud Function & Spring Web:

    @SpringBootApplication
    public class SpringCloudFunctionWebApplication {

    public static void main(String[] args) {
    SpringApplication.run(SpringCloudFunctionWebApplication.class, args);
    }

    @Bean
    public Function upperCase() {
    return s -> s.toUpperCase();
    }

    @Bean
    public Function user() {
    return user -> user.toString();
    }

    }

    访问对应的 Endpoint:

    $ curl -XPOST -H "Content-Type: text/plain" localhost:8080/upperCase -d hello
    HELLO
    $ curl -XPOST -H "Content-Type: text/plain" localhost:8080/user -d '{"name":"hello SCF"}'
    User{nameu003du0027hello SCFu0027}

    Spring Cloud Function & Spring Cloud Stream:

    @SpringBootApplication
    public class SpringCloudFunctionStreamApplication {

    public static void main(String[] args) {
    SpringApplication.run(SpringCloudFunctionStreamApplication.class, args);
    }

    @Bean
    public Function uppercase() {
    return x -> x.toUpperCase();
    }

    @Bean
    public Function prefix() {
    return x -> "prefix-" + x;
    }

    }

    加上 function 相关的配置(针对 input-topic 上的每个消息,payload 转换大写后再加上 prefix- 前缀,再写到 output-topic 上):

    spring.cloud.stream.bindings.input.destination=input-topic
    spring.cloud.stream.bindings.input.group=scf-group

    spring.cloud.stream.bindings.output.destination=output-topic

    spring.cloud.stream.function.definition=uppercase|prefix

    Spring Cloud Function & Spring Cloud Task:

    @SpringBootApplication
    public class SpringCloudFunctionTaskApplication {

    public static void main(String[] args) {
    SpringApplication.run(SpringCloudFunctionTaskApplication.class, args);
    }

    @Bean
    public Supplier> supplier() {
    return () -> Arrays.asList("200", "201", "202");
    }

    @Bean
    public Function, List> function() {
    return (list) ->
    list.stream().map( item -> "prefix-" + item).collect(Collectors.toList());
    }

    @Bean
    public Consumer> consumer() {
    return (list) -> {
    list.stream().forEach(System.out::println);
    };
    }

    }

    加上 function 相关的配置(Supplier 模拟任务的输入源,Function 模拟对任务输入源的处理,Consumer 模拟处理对 Function 处理输入源后的数据):

    spring.cloud.function.task.function=function
    spring.cloud.function.task.supplier=supplier
    spring.cloud.function.task.consumer=consumer

    《深入理解 Spring Cloud 与实战》一书正式开始预售啦,这是一本深入剖析 Spring Cloud 全家桶的书籍,涉及以下内容:

    • Spring Boot 核心特性
    • Spring Cloud 服务注册/服务发现原理剖析
    • 双注册双订阅模型完成 Eureka 迁移至 Nacos 的案例
    • 负载均衡:Spring Cloud LoadBalancer 和 Netflix Ribbon
    • Dubbo Spring Cloud:Spring Cloud 与 Apache Dubbo 的融合
    • Spring Cloud 灰度发布案例
    • Spring 体系配置,动态刷新加载原理剖析
    • Spring Cloud Circuit Breaker 抽象以及 Sentinel、Hystrix、Resilience4j 熔断器对比
    • Spring 体系消息编程模型剖析
    • Spring Cloud Data Flow 完成批处理和流处理任务
    • Spring Cloud Gateway 网关剖析
    • Spring 与 Serverless 的融合

    点击了解详情,更有机会赢取免费图书!

    作者简介

    方剑,Spring Cloud Alibaba开源项目的负责人兼创始人之一。他是《深入理解Spring Cloud与实战》的作者,同时也是Apache RocketMQ和Alibaba Nacos的提交者。方剑曾在个人博客上撰写了《SpringMVC源码分析系列》和《SpringBoot源码分析系列》等文章,目前专注于微服务、云原生和Kubernetes领域。

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    系统应用
    相关文章 更多
    win10正在玩游戏弹出更新重启怎么禁止
    win10正在玩游戏弹出更新重启怎么禁止

    Win10玩游戏时突然弹出更新重启提示?不要强制关机。本文教你如何通过设置“活动时间”避免自动重启,利用“安排重启”规划空闲时间,以及合理使用“暂停更新”功能。区分不同状态下的应对策略,既保护游戏进度又维持系统安全。

    win10自动更新抢占网络带宽该怎么处理
    win10自动更新抢占网络带宽该怎么处理

    Win10自动更新抢占带宽导致游戏卡顿或网页打不开?本教程教你通过任务管理器确认更新进程,利用暂停更新、按流量计费连接和传递优化带宽限制,精准控制Windows Update下载速度,解决网络拥堵问题。

    win10家庭版有没有简单办法阻止强制更新
    win10家庭版有没有简单办法阻止强制更新

    Win10家庭版用户常受强制更新困扰。本文详解如何利用系统自带的暂停更新、活动时间和安排重启功能,在不破坏系统稳定性的前提下减少更新打扰,并分析注册表修改的风险及系统支持现状。

    win10升级新版本后取消开机密码失效怎么修复
    win10升级新版本后取消开机密码失效怎么修复

    Windows 10更新后开机突然要求输入密码?本文解析自动登录失效的真实原因,提供通过netplwiz重新保存凭据、关闭Windows Hello干扰及排查账户策略的完整步骤,助你恢复免密进入桌面。

    win10更新没下载完反复重试该怎么停止任务
    win10更新没下载完反复重试该怎么停止任务

    Windows 10更新下载失败反复重试怎么办?不要直接停用服务。本文教你通过设置页面暂停更新、启用按流量计费连接以及调整活动时间,安全地暂时停止下载任务并避免意外重启。

    win10怎么取消系统准备强制升级新版本
    win10怎么取消系统准备强制升级新版本

    面对Win10强制升级新版本的提示,本文解析家庭版与专业版的应对差异。介绍如何通过暂停更新、设置活动时间临时避让,以及利用组策略控制功能版本。强调Windows 10支持终止后的安全风险,避免使用高风险的禁用服务手段。

    win10组策略找不到更新选项该怎么处理
    win10组策略找不到更新选项该怎么处理

    Win10组策略编辑器中找不到Windows Update选项怎么办?本文分析家庭版与专业版的权限差异,厘清本地策略与域策略的区别,提供设置页替代方案及企业环境排查思路,避免盲目修改注册表或安装非官方补丁。

    win10取消开机密码会影响电脑里的文件安全吗?
    win10取消开机密码会影响电脑里的文件安全吗?

    很多人为了便捷选择取消 Win10 开机密码,这会导致文件丢失吗?本文详解取消密码后文件访问权限的变化、BitLocker 加密的有效性以及更安全的替代方案,帮助用户在便利与数据安全之间做出正确选择。

    win10弹出立即重启更新怎么延后这个操作
    win10弹出立即重启更新怎么延后这个操作

    Win10弹出立即重启更新会打断工作?本文介绍如何通过Windows Update页面安排重启时间、设置活动时段以及暂停后续更新,有效延后重启操作,保护未保存的工作成果。

    win10自动更新在夜间偷偷运行怎么限制
    win10自动更新在夜间偷偷运行怎么限制

    Win10晚上自动下载或重启怎么办?不要直接禁用服务。本文教你通过设置活动时间、安排指定重启时间及短期暂停更新,精准控制Windows Update行为,避免夜间网络占用和意外重启,同时保留系统安全性。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。