领先一步
VMware 提供培训和认证,助您加速进步。
了解更多你好,Spring 爱好者!
您知道我做了什么吗?我搞砸了,各位。我不小心在十二月的最后一周、一年中的最后一个月发布了《本周 Spring》。我本不该这样做的。通常,您知道,我会在每年的最后一期《本周 Spring》中,将其变成一个恰如其分的《本年 Spring》,庆祝那些定义了这一年的大型主题(至少,从我的角度来看是这样)。然后,我会在文章中包含通常的《本周 Spring》内容。我忘了先做第一件事,所以这是单独发布的。嘿,这是传统。
啊,2020 年。这个不断带来惊喜的一年。这是《虎王》的一年。如果 2019 年有人告诉我,2020 年我会窝在沙发上,盯着 Netflix 上看一位驯虎人的冒险故事,害怕送来的杂货,并且迫不及待地想在十个月后第一次坐飞机,我一定会从椅子上笑掉!
这一年,2020 年,开始了非凡的征程。在 VMware 收购 Pivotal 后,2020 年是 Spring 团队(大约)重返大家庭的第一年。你们中的一些人可能知道,Spring 团队在 2013 年分离出来成立 Pivotal 之前,曾在 VMware 工作过几年。现在我们回来了。你可能会认为这会造成混乱,但事实并非如此。Pivotal 和 VMware 都秉持着帮助客户实现产品交付的共同理念。我们一上来就干劲十足,并持续不断地推出伟大成果。
这种兴奋感在今年盛大的 SpringOne 2020(虚拟)会议上尤为明显,这次会议吸引了来自各行各业、各种信仰、不同国家和大陆的约 40,000 人。这是多么甜蜜的甘露,我永远不会忘记。
令人欣慰的是,Spring 团队一直以来都是地理上分散的。就我而言,自 2010 年以来,我技术上一直是一名居家办公的员工。虽然今年对我们许多人来说,由于各种原因,压力更大,但要适应居家办公的环境并不是其中之一。
在我写下这些话的 2020 年 12 月 30 日,距离疫情消息开始传到西方已经一年了。我不想成为那种“我认识的人”的陈述者,但我今年因 COVID-19 失去了家人。我的一些朋友今年进了呼吸机。我认识的人也失去了家人和朋友。对全世界如此多的人来说,这简直是一场彻头彻尾的灾难。然而,不知何故,我很有幸能继续撰写关于软件的博客。这是因为你们,亲爱的社区。虽然我一直非常感激你们,但今年我尤其感激。能为你们工作是我的荣幸。
疫情如野火般蔓延(有些事情不应该开源!),它淹没了许多其他,有时是更积极的新闻。本着这种精神,我想回顾一下 2020 年的一些亮点——一些重要的主题。
您可能听说过 VMware Tanzu。您可能听说过 Spring 团队是 Tanzu 的一部分。您是否也知道 Kubernetes 的三个创始人中有两位也在 Tanzu?您是否知道 VMware 是 Kubernetes 的第三大贡献者?我们对 Kubernetes 真是如痴如醉!
Tanzu Kubernetes Grid 是我们非常出色的 Kubernetes 发行版,可以在本地或公共基础设施上运行。Harbor 是一个企业级容器注册表。Tanzu Mission Control 提供跨云的多集群 Kubernetes 管理。VMware 也是 Carvell 的重要贡献者,Carvell 提供了一套可靠、单一用途、可组合的工具,帮助您在 Kubernetes 上构建、配置和部署应用程序。我们有 Tanzu Build Service,它可以在企业规模上自动化容器的创建、管理和治理。我敢肯定,我遗漏了无数其他的东西。
我们甚至为我们的平台即服务产品 Cloud Foundry 进行了改造,使其能够在 Kubernetes 之上运行。与全脂 Kubernetes 容器编排一样,拥有同样顺滑、以开发者为中心的工作流程体验。
近年来,我们付出了巨大的努力,在 Kubernetes 等容器化云基础设施中,让 Java 和 Spring 更加 Relevant。
今年,Spring Boot 通过 CNCF Paketo Buildpacks 项目引入了对 Buildpacks 的内置支持。您是否有一个使用 2.3 或更高版本的 Spring Boot 项目?可以尝试一下:mvn spring-boot:build-image(也有 Gradle 版本),大约一分钟后,您就会得到一个容器化应用程序。然后,您可以对其进行 `docker tag` 并将该容器化应用程序 `docker push` 到您选择的 Kubernetes 集群。或者,实际上,任何支持 OCI/Docker 镜像的平台。
Spring Boot 本身现在可以从 *配置树* 中读取配置。配置树是在 Kubernetes 中将 Kubernetes ConfigMap 挂载为卷时获得的配置目录。它是另一种类型的配置源,就像类路径配置(application.properties、application.yaml 等)、环境变量、文件(file://${user.home}/config/my-config.properties)等等一样。
Spring Boot 的 Actuator 模块可以公开端点,用作 Kubernetes 的存活探针和就绪探针。就绪探针告诉 Kubernetes 一个刚启动的服务是否已准备好进入轮换。存活探针告诉 Kubernetes 服务是否仍然存活。如果服务因任何原因生病,它将被移出轮换。
那么,应用程序面临的问题是:Kubernetes 应该立即销毁应用程序,还是应该等待一个配置的间隔时间,以允许正在进行的事务完成?此行为在 Kubernetes 中是可配置的。Spring Boot 通过我们称为“优雅关机”的新功能,支持卸载任何进行中的事务并拒绝任何新请求。
Spring Boot 及其生态系统(包括 Spring Cloud for Kubernetes)是构建为云原生 Kubernetes 环境设计的软件的最佳方式,并且情况每天都在改善。然而,我们才刚刚起步,敬请关注!
响应式编程是一种编程范例,它带来了三个好处:资源效率、数据 API 的一致性和可组合性,以及健壮性。它通过使编写能够很好地释放其他空闲线程以供重用变得轻而易举,从而提高了资源效率。它提供了数据 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 凭借其当今的设计,将始终与您同在最前沿。我写了一本关于*这方面*的书并已经出版,所以请相信我,当我说它非常棒时。响应式编程是让我们在云中更好地表现(和扩展!)我们服务的一种强大方式。
原生镜像将长期存在,而且它们*很棒*。一切看起来都很简单。如果我们利用 Java 传奇的即时编译器(HotSpot)提前、主动地编译整个应用程序,会怎么样?这似乎非常简单。这个过程——将源代码转换为原生代码——在许多其他语言中就称为*编译*。编译成字节码引入的间接性迫使我们为这种新的直接转换过程采用一个新术语:*提前编译*(AOT)。哇。太棒了。
简单。除了,事实证明并非如此。因为一旦编译成原生镜像,应用程序将不再拥有在 JVM 中运行时相同的运行时。一旦编译成原生镜像,运行时将无法执行我们期望 JVM 拥有的一些更动态的功能。想将类加载到类加载器中?使用 CGlib 代理?在没有*事先*运行时感知的情况下对类进行反射?从类加载器加载资源(例如 banner.txt 文件)?在 GraalVM AOT 编译这个奇特而美好的世界里,所有这些都将失效。
Spring GraalVM 项目可以帮助您。它支持识别 Spring 应用程序可能想要执行这些操作的所有地方,并提供帮助来注册您可能需要配置的任何内容。该项目正在飞速发展,目标是到 Spring Boot 3 和 Spring Framework 6,所有这些都将内置并开箱即用。
GraalVM 在解决所有这些复杂性后,提供了启动速度的大幅提升和显着减少的内存占用。这使得 GraalVM 成为一个(好得多)的容器打包器,尤其是在资源消耗成本很高的容器化云环境中。我迫不及待地想看看 Project Leydon 的未来!
RSocket 是一个二进制协议,可以轻松实现微服务之间的消息交换。它将响应式流的概念重塑为网络通信,支持线上的背压。我喜欢 RSocket。它当然内置了对 Spring Framework 和 Spring Boot 的新支持,还有 Spring Security 支持和 Spring Batch 支持。
RSocket 是我们与阿里巴巴、Facebook 和 Lightbend 一起捐赠给新兴的 Reactive Foundation 的第一个项目。它比 HTTP 2 或 gRPC 更好,仅这一点就应该引起您的好奇心,但我同样对未来感到兴奋。最令人兴奋的前景之一是我们与其他人合作开发的新的 RSocket 代理。这个代理可以取代某些服务注册中心(如 Netflix Eureka)、消息总线(如 RabbitMQ)的用例。RSocket JVM 客户端使用 Reactor,这赋予了它超能力:轻松的重试、错误处理、背压等。
Facebook 和阿里巴巴等组织已经在规模化使用它,而 Spring 使其比以往任何时候都更容易。我迫不及待地想看到人们在未来几周、几个月和几年内用 RSocket 构建出什么。
我最近非常兴奋的最后一件事是 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 秒!请记住,这些芯片几个月前才发布!微软/Azul Systems 已经推出了一个可用的 OpenJDK 版本,这证明了生态系统的活力。Java 是出色技术和更出色社区的代名词,我热爱 Java。
Kotlin 对我来说也是今年的一个亮点。今年早些时候,我被任命为 Kotlin Google 开发者专家,所以这可能带有偏见。Kotlin 有一个协程的概念。Kotlin 中的协程是一个语言关键字,允许您将特定代码标记为执行异步操作,其线程可以由运行时重新调度。这非常容易。Spring 构建于此机制之上,通过协程集成响应式编程。这样,您就能获得两全其美:轻松的命令式编程,同时又能受益于响应式代码的非阻塞特性。在 Spring 支持响应式 API 的任何地方,Spring 和 Kotlin 现在都支持协程。
我的朋友们,我希望您已经认识到 2020 年所代表的机会。我期待在未来一年与大家交流。而且谁知道呢,也许,如果科学和后勤允许,我们甚至会见面。(为医生们欢呼!)这将是真正有趣的一年。我希望你们都照顾好自己,保持社交距离,戴口罩等等,我相信我代表整个 Spring 团队,祝愿您和您的家人新年快乐!