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

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

头图.png

作者 | 方剑(洛夜)  Spring Cloud Alibaba 开源项目负责人/创始人之一
来源|阿里巴巴云原生公众号

导读:本文摘自 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 正在成为主流,于是就诞生了下面这幅图,从单体应用的管理到微服务应用的管理再到函数的管理。

1.png

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

2.png

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

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

函数即服务(FaaS)是一类云计算服务,它提供了一个平台,使客户可以开发,运行和管理应用程序功能,而无需构建和维护通常与开发和启动应用程序相关的基础架构。遵循此模型构建应用程序是实现 Serverless 架构的一种方法,通常在构建微服务应用程序时使用。

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

3.png

我们知道,因为 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<T, R> {R apply(T t);
}

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

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

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

<R> Stream<R> map(Function<? super T, ? extends R> mapper)_;_
  1. java.util.function.Consumer: 需要一个参数进行操作,无返回值。

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

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

RestTemplate restTemplate = new RestTemplate();
Stream.of("200", "201", "202").forEach(code -> {ResponseEntity<String> responseEntity =restTemplate.getForEntity("http://httpbin.org/status/" + code, String.class);System.out.println(responseEntity.getStatusCode());
});
  1. java.util.function.Supplier: 得到一个结果,无输入参数。

@FunctionalInterface
public interface Supplier<T> {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: 一次消息消费/生产/转换是一次函数调用。

4.png

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

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

public class HandlerStream implements RequestStreamHandler {@Overridepublic 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);}@Beanpublic Function<String, String> upperCase() {return s -> s.toUpperCase();}@Beanpublic Function<User, String> 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);}@Beanpublic Function<String, String> uppercase() {return x -> x.toUpperCase();}@Beanpublic Function<String, String> 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-groupspring.cloud.stream.bindings.output.destination=output-topicspring.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);}@Beanpublic Supplier<List<String>> supplier() {return () -> Arrays.asList("200", "201", "202");}@Beanpublic Function<List<String>, List<String>> function() {return (list) ->list.stream().map( item -> "prefix-" + item).collect(Collectors.toList());}@Beanpublic Consumer<List<String>> 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 Committer,Alibaba Nacos Committer。曾在个人博客上编写过《SpringMVC 源码分析系列》、《SpringBoot 源码分析系列》文章,目前,关注微服务、云原生、Kubernetes。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MSHA x Chaos 容灾高可用实践

简介&#xff1a; 2020 年 12 月份&#xff0c;阿里云应用高可用产品 AHAS&#xff08;Application High Availability Service&#xff09;发布了新的功能模块 AHAS-MSHA&#xff0c;它是在阿⾥巴巴电商业务环境演进出来的多活容灾架构解决⽅案。本篇文章我们首先介绍容灾领域…

基于元学习和人机协同的端到端对话模型

Dialog Studio 是达摩院NLP-小蜜Conversational AI团队研发的面向开发者的智能对话开发平台&#xff0c;目前已经在云&#xff08;多省市政务12345热线、中移动10086、金融、医疗等&#xff09;、钉钉&#xff08;通过钉钉官方智能工作助理服务几百万企业&#xff09;、集团内&…

AI释放数字经济潜能!思谋科技受邀出席2021全球数字经济大会

8月2日&#xff0c;2021全球数字经济大会在北京举办。本次会议以“创新引领 数据驱动——建设全球数字经济标杆城市”为主题&#xff0c;由北京市人民政府、国家发展和改革委员会、工业和信息化部、商务部、国家互联网信息办公室共同主办。思谋科技作为承办单位参与论坛。思谋科…

ZAO 背后的深度学习算法原理浅析

ZAO最近火爆&#xff0c;成为现象级产品之一&#xff0c;引起大家的广泛关注&#xff0c;ATA上面已经有同学做了一些说明分析&#xff0c;链接如下&#xff1a; https://www.atatech.org/articles/148375?spmata.13269325.0.0.27ad49fa0Vr2gG 上面文章介绍了ZAO是基于deep f…

Serverless在SaaS领域的最佳实践

简介&#xff1a; 特别对于当下的经济环境&#xff0c;SaaS厂商要明白&#xff0c;不能再通过烧钱的方式&#xff0c;只关注在自己的用户数量上&#xff0c;而更多的要思考如何帮助客户降低成本、增加效率&#xff0c;所以需要将更多的精力放在自己产品的定制化能力上。 作者&a…

终于有人把大数据讲明白了。。。

大数据是对海量数据进行存储、计算、统计、分析处理的一系列处理手段&#xff0c;处理的数据量通常是TB级&#xff0c;甚至是PB或EB级的数据&#xff0c;这是传统数据处理手段所无法完成的&#xff0c;其涉及的技术有分布式计算、高并发处理、高可用处理、集群、实时性计算等&a…

都 2021 年了,Serverless 能取代微服务吗?

简介&#xff1a; 马上就要 2021 年了&#xff0c;Serverless 是否终将取代微服务&#xff1f;从微服务到 Serverless 需要经过怎样的路径&#xff1f;本文将对 Serverless 与微服务在优势劣势上进行深度对比。 来源 | Serverless 公众号 编译 | OrangeJ 作者 | Mariliis Rett…

Knative 快捷操作命令 Kn 介绍

简介&#xff1a; kn 是 Knative 命令行操作客户端。 通过 kn 可以方便的操作Knative 相关的资源。 安装 Kn 可以通过官方获取对应的 Kn 二进制 • macOS • Linux • Windows kn 会与 kubectl 使用同样的config 文件&#xff0c;默认使用 $HOME/.kube/config 服务管理 使用…

四大触点,教你从“用户视角”构建数据分析体系

简介&#xff1a; 做增长、做产品其实和谈恋爱的道理是一样的&#xff0c;想要把这件事情做好&#xff0c;需要建立一个好的用户基础&#xff0c;站在用户&#xff08;女朋友&#xff09;的角度看待问题、发现需求、建立场景、提出解决方案&#xff0c;这种需求大到可以是产品的…

数据中心 48 V 直流供电,Vicor 如何解决“最后一英寸”电源设计难题?

作者 | 伍杏玲出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;7 月 27 日&#xff0c;由 OCP 社区主办、浪潮承办的第三届 OCP China Day 2021 在北京举行。会上&#xff0c;笔者有幸和全球领先的电源厂商 Vicor 公司的高管进行交流&#xff0c;了解这个 40…

阿里云高效基因序列检索助力新冠肺炎病毒序列快速分析

简介&#xff1a; 阿里云高效基因序列检索助力新冠肺炎病毒序列快速分析 AnalyticDB for MySQL是云端托管的PB级高并发低延时数据仓库&#xff0c;通过AnalyticDB for MySQL向量检索功能构建基因检索系统&#xff0c;支持毫秒级针对10亿级别的向量数据进行查询分析&#xff0c;…

DTCC 2020 | 阿里云赵殿奎:PolarDB的Oracle平滑迁移之路

简介&#xff1a; Oracle兼容性是业务客户从Oracle生态迁移到PolarDB生态的第一步也是至关重要的一步&#xff0c;PolarDB通过不断沉淀支持大量实际业务的真实Oracle兼容性功能&#xff0c;确保客户业务可以真正做到平滑迁移。同时PolarDB带给Oracle生态客户的不仅仅是上的来的…

边缘计算助力云游戏成为5G时代的杀手级应用

作者&#xff1a;王超引言随着技术、架构以及商业模式的快速发展和完善&#xff0c;边缘计算作为一种成熟的计算范型已经得到广泛应用。边缘计算是为应用开发者和服务提供商在网络的边缘侧提供云服务和IT环境服务&#xff0c;“边缘”指的是位于管理域的边缘&#xff0c;尽可能…

阿里如何做好双11技术保障?大队长霜波分享4点经验

简介&#xff1a; 为什么说双11是阿里每年技术保障稳定性最困难的一次&#xff1f;50多个BU一起加入双11&#xff0c;怎么组织和运营&#xff1f;为了保障双11的顺利进行&#xff0c;又有哪些备战方案以及创新技术&#xff1f;在由阿里云CIO学院主办的【2020中国企业数字创新峰…

47 张图带你走进浏览器的世界!

作者&#xff1a; 零一0101来源&#xff1a;前端印象大家好&#xff0c;我是零一&#xff0c;每个开发者&#xff08;尤其是前端工程师&#xff09;或多或少会跟浏览器打交道&#xff0c;那么你们有没有想过去深入了解浏览器呢&#xff1f;无论是因为好奇还是为了面试&#xff…

一文教你轻松搞定ANR异常捕获与分析方法

简介&#xff1a; 选择一款有超强捕获能力的专业产品&#xff0c;对于开发者定位和修复稳定性问题至关重要。友盟U-APM SDK集成了UC 内核团队强大的技术及友盟超强的错误捕获能力&#xff0c;通过数万次捕获实践中积累了丰富经验&#xff0c;在产品、性能和研发能力上都极大保障…

DTCC 2020 | 阿里云梁高中:DAS之基于Workload的全局自动优化实践

简介&#xff1a; 第十一届中国数据库技术大会&#xff08;DTCC2020&#xff09;&#xff0c;在北京隆重召开。在12.23日性能优化与SQL审计专场上&#xff0c;邀请了阿里巴巴数据库技术团队高级技术专家梁高中为大家介绍DAS之基于Workload的全局自动优化实践。 SQL自动优化是阿…

更便捷:阿里云DCDN离线日志转存全新升级

简介&#xff1a; 1月6日&#xff0c;阿里云CDN年度产品升级发布会中&#xff0c;阿里云CDN产品专家邓建伟宣布DCDN离线日志转存全新升级&#xff0c;并对离线日志转存方案的价值、应用及使用进行了详细解读。 1月6日&#xff0c;阿里云CDN年度产品升级发布会中&#xff0c;阿里…

20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测

简介&#xff1a; 本文将会通过一个有趣的 Python 库&#xff0c;快速将图像分类的功能搭建在云函数上&#xff0c;并且和 API 网关结合&#xff0c;对外提供 API 功能&#xff0c;实现一个 Serverless 架构的“图像分类 API”。 前言 图像分类是人工智能领域的一个热门话题。…

夯实数字化转型算能基石 构建洛阳银行核心云

作者 | 李清溪 洛阳银行信息技术部副总经理 当前&#xff0c;以移动互联网、云计算、大数据、区块链等技术为代表的新一轮科技革新正全面渗透到经济社会各行业各领域。在推动数字经济与实体经济融合发展的同时&#xff0c;也不断改变和重塑着银行业的发展模式和经营理念。 根…