2020年春季回顾

工程 | Josh Long | 2020年12月31日 | ...

嗨,Spring 粉丝们!

你们知道我做了什么吗?我搞砸了,各位。我不小心在12月的最后一周,也是今年的最后一个月发布了《本周Spring》!我不应该这么做。我真不应该这么做。通常情况下,我会将一年中《本周Spring》的最后一期改名为《今年Spring》,来庆祝定义这一年的大主题(至少从我的角度来看是这样)。然后我会将通常的《本周Spring》摘要放在其中。我忘了做第一部分,所以我将其作为单独的文章发布。嘿,这是传统。

啊,2020年。这个年头真是不断带来惊喜。这是《虎王》之年。如果你在2019年告诉我,在2020年我会粘在沙发上看Netflix上老虎训练师的冒险经历,害怕我的送货上门商品,并且渴望十年来第一次坐飞机,我会笑掉大牙!

今年,2020年,开始得非常好。2020年是VMware收购Pivotal之后,Spring团队重归团队的第一年(或大约如此)。你们中的一些人可能知道,Spring团队在2013年分拆成立Pivotal之前曾在VMware工作了几年。现在我们又回来了。你可能会认为这会带来破坏,但事实并非如此。Pivotal和VMware都秉承着帮助客户投产的理念。我们立即投入工作,并持续交付重要的成果,并且经常交付。

这种兴奋在今年的史诗级SpringOne 2020(虚拟)活动中最为明显,该活动吸引了来自各行各业、信仰、国家和大陆的约40,000人参加。这是如此甜蜜的甘露,我永远不会忘记它。

Spring团队一直以来地理位置分布都比较分散,这很有帮助。例如,从2010年起,我从技术上来说一直都是在家工作的员工。虽然今年由于很多原因而格外紧张和格外特殊,但对我们许多人来说,弄清楚在家工作的流程并不是其中之一。

在我写这篇文章的时候,是2020年12月30日,距离大流行的消息开始传到西方已经一年了。我不是想做那个家伙,但我今年因为COVID-19失去了家人。我有一些朋友今年用了呼吸机。我也认识失去家人和朋友的人。对全世界许多人来说,这绝对是一场恐怖秀。然而,不知何故,我有幸继续撰写关于软件的博客。这要感谢你们,亲爱的社区。虽然我一直都很感激你们,但我今年尤其如此。为你们工作是一种荣幸。

这场大流行像野火一样蔓延(有些东西不应该开源!),它掩盖了其他一些,有时甚至是更积极的消息。本着这种精神,我想回顾一下2020年的一些亮点——一些主要主题。

Kubernetes

您可能听说过VMware Tanzu。您可能听说过Spring团队是Tanzu的一部分。您是否还知道Kubernetes的三位创始人中有两位也是Tanzu的一部分?您是否知道VMware是Kubernetes的第三大贡献者?我们对Kubernetes非常着迷!

Tanzu Kubernetes Grid是我们非常棒的Kubernetes发行版,可在本地或公共基础设施上运行。Harbor是一个企业级容器注册表。Tanzu Mission Control提供跨云的多集群Kubernetes管理。VMware也是Carvell的重要贡献者,它提供了一套可靠的、单用途的、可组合的工具,可帮助您构建、配置和部署到Kubernetes的应用程序。我们有Tanzu Build Service,它可在企业规模上自动化容器创建、管理和治理。我相信我还遗漏了无数其他内容。

我们甚至已经改造了Cloud Foundry(我们的平台即服务产品),使其可以在Kubernetes之上运行。同样的丝般顺滑的以开发者为中心的流程,以及全功能的Kubernetes容器编排。

近年来,已经做了大量工作,使Java和Spring在Kubernetes等容器化云基础设施中更加相关。

今年,Spring Boot通过CNCF Paketo buildpacks项目引入了对buildpacks的内置支持。使用2.3或更高版本的Spring Boot项目?试试这个:mvn spring-boot:build-image(也有Gradle等效项),您将在大约一分钟内拥有一个容器化应用程序。然后,您可以将该容器化应用程序docker tagdocker push到您选择的Kubernetes集群。或者,实际上,任何支持OCI/Docker镜像的东西。

Spring Boot本身现在可以从配置树中提取配置。配置树是将Kubernetes ConfigMap作为卷安装到Kubernetes中时获得的配置目录。它是另一种配置源,例如类路径配置(application.propertiesapplication.yaml等)、环境变量、文件(file://${user.home}/config/my-config.properties)等等。

Spring Boot的Actuator模块可以公开端点,作为Kubernetes存活性探针和就绪性探针。就绪性探针告诉Kubernetes刚刚启动的服务是否已准备好投入运行。存活性探针告诉Kubernetes服务是否仍然存活。如果服务由于任何原因出现故障,它将被移出轮换。

然后应用程序面临的问题是:Kubernetes是否应该立即销毁应用程序,或者它是否应该等待配置的时间间隔以允许正在进行的事务完成?此行为可在Kubernetes中配置。Spring Boot支持通过我们称为优雅关闭的新功能来排空任何正在进行的事务并拒绝任何新请求。

Spring Boot及其周围的生态系统(包括用于Kubernetes的Spring Cloud)是构建专为云原生Kubernetes环境设计的软件的最佳方法,并且每天都在改进。不过,我们才刚刚开始,敬请期待!

响应式编程

响应式编程是一种编程范例,它带来三大好处:资源效率、数据 API 的一致性和可组合性以及健壮性。它通过使编写能够很好地释放空闲线程以供重用的代码变得微不足道来提高资源效率。它提供一致性,因为它为我们提供了一种抽象,一种思考不同数据流的方式。将数据作为 Java 8 Stream<T> 输入?一个 Collection<T>?一个 CompletableFuture<T>?单个值或数组?没问题。响应式编程为我们提供了一种以一致的方式根据所有这些 API 来描述数据流管道的方法。

学习响应式类型存在一点小小的挑战。但是,在整个生态系统中对这些类型的各种应用进行均摊后,我认为您会发现自己能够忘记许多其他抽象和 API。Spring 生态系统自 2011 年以来(适度地)支持响应式编程,但真正的飞跃发生在 2017 年,当时我们在 Spring Framework 5 中引入了对响应式编程的支持。从那时起,响应式编程已经渗透到 Spring 生态系统的各个方面。我不记得上次我寻找响应式世界中的某些东西,却被告之它仍在开发中是什么时候了。它肯定没有发生在 2020 年!

我想要的一切都在这里,而且通常可用。事务、SQL 数据访问、消息传递和集成、响应式客户端负载均衡、重试、速率限制、API 网关、NoSQL 数据访问、HTTP、WebSocket、RPC、指标、分布式跟踪、可观察性:所有这些(以及我能想到的任何其他内容)现在开箱即用。未来是非阻塞的,而 Spring(按照今天的设计)将与您一起走在最前沿。我写了一本关于这些内容的书,所以请相信我说它很棒。响应式编程是使我们的服务在云中表现更好(并扩展!)的一种强大的方法。

使用 GraalVM 的原生镜像

原生镜像已经成为主流,而且非常棒。一切看起来如此简单。如果我们采用Java传奇的即时编译器(HotSpot),提前、主动地编译整个应用程序呢?这看起来荒谬地简单。这个将源代码转换为原生代码的过程,在许多其他语言中被称为编译。字节码编译引入的间接性迫使我们为这种新的直通式流程采用了一个新术语:提前编译(AOT)。哦哦。啊哈。

简单。然而,事实并非如此。因为一旦编译成原生镜像,应用程序的运行时环境就与在JVM中运行时不同了。一旦编译成原生镜像,运行时将无法执行我们期望JVM具备的一些更动态的功能。想要将类加载到类加载器中?使用CGlib代理?在没有先验运行时感知的情况下对类进行反射?从类加载器加载资源(例如,banner.txt文件)?所有这些在GraalVM AOT编译这个古怪但精彩的世界中都消失了。

Spring GraalVM项目可以在这里帮助你。它支持识别Spring应用程序可能需要执行此类操作的所有位置,并提供帮助来注册任何可能需要配置的操作。该项目发展迅速,目标是在Spring Boot 3和Spring Framework 6中,所有这些都将内置并开箱即用。

GraalVM 为了应对所有这些附带的复杂性,带来了启动速度的显著提升和内存占用空间的显著减少。这使得GraalVM成为一个(更好的)容器打包工具,尤其是在资源消耗成本高的容器化云环境中。我也迫不及待地想看看Leydon项目的未来会怎样!

RSocket

RSocket是一个二进制协议,它使微服务之间的消息交换变得轻而易举。它将响应式流的概念具体化到网络中,支持网络上的背压。我喜欢RSocket。它当然在Spring Framework和Spring Boot中内置了新的支持,并且还支持Spring Security和Spring Batch。

RSocket是我们与阿里巴巴、Facebook和Lightbend共同捐赠给新兴的响应式基金会的第一个项目。它现在比HTTP 2或gRPC更好,仅此一点就应该激起你的好奇心,但我同样对未来感到兴奋。最令人兴奋的前景之一是Spring团队和其他团队正在开发的新的RSocket代理。这个代理可以消除对Netflix Eureka之类的服务注册中心、RabbitMQ之类的消息总线的一些用例。RSocket JVM客户端使用Reactor,这赋予它强大的功能:轻松重试、错误处理、背压等。

Facebook和阿里巴巴等组织已经在规模化地使用它,而Spring使它比以往任何时候都更容易。我迫不及待地想看看人们在未来几周、几个月和几年中将用RSocket构建什么。

Java和Kotlin

我今年非常兴奋的最后一件事是与最新版本的Spring中最新版本的Java和Kotlin的深度集成。Spring Boot每六个月发布一次,与Java的发布节奏完美契合。将Spring Boot与Java 15一起使用是一种梦想。我制作了一个关于Java 14的视频,其中介绍了该版本中的许多新功能,包括大量预览功能。但你甚至不需要查看所有这些。只需查看Java 15中开箱即用的内容!仅多行文本字符串和var就使生活更加便捷。新版本的Java非常出色,我们甚至不必讨论过去几代的所有幕后工作,这些工作使Java更快、更强大、更适合容器、更安全等等。

我正在使用一款新型的Apple Silicon M1 MacBook Pro,并使用Microsoft OpenJDK端口支持ARM芯片。它很快。我的大多数应用程序在约0.8秒内启动!请记住,这些芯片仅仅在几个月前发布!Microsoft/Azul Systems已经推出了一个可用的OpenJDK端口,这证明了生态系统的活力。Java是梦幻般技术和更梦幻般社区的名称,我喜欢Java。

Kotlin是我今年的另一个亮点。今年早些时候,我被任命为Kotlin Google开发者专家,所以我可能会有偏见。Kotlin有协程的概念。Kotlin中的协程是一个语言关键字,允许你将特定代码标记为执行异步操作,运行时可以重新调度其线程。这很容易。Spring基于此机制构建,通过协程集成响应式编程。因此,你在这里得到了两全其美:易于使用的命令式编程,可以从响应式代码的非阻塞特性中受益。在Spring支持响应式API的任何地方,Spring和Kotlin现在都支持协程。

展望未来一年

朋友们,我希望你们已经被说服,2020年代表着机遇。我期待着在未来一年与大家交流。谁知道呢,也许,如果科学和后勤允许的话,我们甚至还会见面。(为医生们三呼!)这将是充满乐趣的一年。我希望你们都照顾好自己,保持社交距离,戴口罩等等,我相信我可以代表整个Spring团队向你和你的家人致以最美好的新年快乐

(你无法相信找到保持社交距离的库存照片有多难!)

获取Spring通讯

与Spring通讯保持联系

订阅

领先一步

VMware提供培训和认证,以加快您的进步。

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看Spring社区中所有即将举行的活动。

查看全部