抢先一步
VMware 提供培训和认证,以加速您的进步。
了解更多嗨,Spring 粉丝们!你们好吗?我刚刚结束在加利福尼亚州洛杉矶与家人共度的一个美好的假期。今天晚些时候,我和女儿们将开车返回加利福尼亚州旧金山。我很享受在洛杉矶与人们的会面,尤其是在大流行之前,这是我们第一次真正访问洛杉矶。
现在,(你能相信吗?),我们正迎接着新的一年。像往常一样,我将进行我每年的“这一年中的 Spring”总结,所以请继续关注下面的内容,在我们每周的总结之后。因此,事不宜迟,以下是 2021 年的最后一个“本周 Spring”回顾。
现在,让我们看看在我看来 2021 年的一些最重要的事件。
你可能已经厌倦了我谈论 Spring Native,但我忍不住:它太棒了!GraalVM 是 OpenJDK 的直接替代品,其中包含一个名为 native-image
的额外工具,你可以在安装 GraalVM 发行版后添加它。native-image
工具是一个提前 (AOT) 编译器,它将你的 .class
文件转换为特定于体系结构的机器代码。它是一个本机映像。这意味着你将失去可移植性的好处。这不太好。但是,有一个很大的但是:生成的二进制文件是自包含的,在运行时占用最少的 RAM,并且启动速度是等效的 JRE 绑定应用程序的 10 倍或更多。自包含的二进制文件是一件好事,因为它意味着你可以将其打包到一个微小的操作系统环境中,非常适合在 Docker 镜像中分发。它占用最少的 RAM(或更具体地说,是RSS),在运行时需要很少的内存。这对于在 Docker 镜像和 Kubernetes 等容器编排器中分发也非常理想,因为它意味着你可以部署更多倍的应用程序实例,而这些实例所需的资源本来需要在 JRE 上运行应用程序。最后,它启动很快。非常快。我的 Spring Boot 应用程序通常在 20-75 毫秒内启动,具体取决于应用程序执行的操作。例如,你可以想象这在无服务器上下文中将多么有用。使用 GraalVM 也有一些其他好处。你知道你可以使用 GraalVM 将你的应用程序转换为链接库吗?就像 .dll
、.dylib
或 .so
?这意味着你可以将其他应用程序链接到 Spring Boot 代码提供的功能。查看我最近在 Spring Tips (@SpringTipsLive) 中做的 介绍 Spring Native 0.11.x 的视频。你现在就可以开始使用,访问 Spring Initializr (start.spring.io) 并选择 Spring Native
。
2012 年,Facebook 试图弄清楚在构建其客户端时如何践行微服务。这里存在自然的张力:客户端希望一次性获取所有相关数据,而服务希望保持独立和模块化。那么,双方如何才能获得他们想要的东西呢?他们创建了 GraphQL,以提供一种查询 API 并获取所需数据(全部或部分)的方法。你可以根据服务的图形构建 API,但客户端不必知道这一点。他们不必关心解析给定形状的有效负载请求所需的网络调用。所有这些都隐藏在 API 后面。Facebook 于 2015 年开源了 GraphQL,这项工作已在各个社区中变得非常流行,尤其是 Java 社区。社区需要一个针对 Spring 用户的流畅集成,因此我们 - Spring 团队 - 与 GraphQL Java 项目取得联系,看看我们是否可以合作进行集成。GraphQL Java 是 Spring GraphQL 项目的基础。它是一个闪电般快速的 GraphQL 集成,现在为 Twitter.com 等网站提供支持。它速度快且经过实战检验。Spring GraphQL 在这个坚实的基础上构建,为 Spring 开发人员提供了一个对话式的组件模型,对于使用 Spring 支持构建基于 MVC、REST、RSocket 和 WebSocket 的控制器的开发人员来说,会感觉很自然。
我制作了一个 Spring Tips 视频,在这里介绍 Spring GraphQL。
今年,Oracle 和 Java 社区发布了 Java 17,这是 Java 的下一个长期支持版本。它很棒。它也是 Java 的最新长期支持版本,这意味着如果你比较保守并且希望坚持使用稳定且支持良好的 Java 版本,那么这个版本适合你。如果你想要最新最好的版本,这个版本也适合你(直到 Java 18 发布)。我喜欢 Java 17。而且,现在 GraalVM 支持 Java 17,所以无论你针对哪个 OpenJDK 发行版,都没有理由不将其作为你的主要版本。Java 8 是一个不可原谅的旧版本且不相关的 Java 版本。除了可能出于研究古代的目的,今天没有理由使用它。根据版本号,Java 17 比 Java 8 好两倍多。
以下是自 Java 8 以来我最喜欢的功能列表。
records
是一种描述类型的绝佳方法,这些类型只不过是这些类型中的状态。这类似于 Scala 中的 case
类和 Kotlin 中的 data
类。它们可以将大量的样板代码减少到一行。var
和自动类型推断。String
(万岁!我简直不敢相信这终于出现在 Java 中了!),这样你就可以让过去繁琐的 String
连接方法休息一下了。private
方法。这建立在 Java 8 中引入的 default
方法的支持之上NullPointerException
时,可以获得直观的错误。开箱即用的 OpenJDK Java 17 发行版附带一个 ARM 和 Apple M1 兼容的端口,速度极快。它在各个方面都是一个更好的发行版。感谢 Oracle 和社区!
这个由 Spring 团队和微软联合开发的平台即服务产品正在蓬勃发展,不断改进和强化,以尽可能轻松地将 Spring Boot 应用程序交付到生产环境中。2021 年也不例外。今年见证了 托管虚拟网络和自动缩放的集成、改进的监控、轻松部署、Dynatrace 集成、出站公网 IP、Visual Studio Code 集成和完整的 APM 功能等等。当然,还有很多 参考架构。
Spring 提供了无与伦比的协议来补充希望与服务通信的客户端开发人员,支持诸如 WebSockets、HTTP、REST、OAuth、RSocket 和 GraphQL 等内容。但集成机会与日俱增。例如,我非常喜欢 Dave Syer 博士最近发布的一篇博文,其中介绍了一些集成可能性。在这篇博文中,Dave 博士探讨了 Webjars、HTMX、Hotwired 等内容。
构建包 每天都在变得越来越好!构建包是 CNCF 规范,提供了一种获取应用程序并将其容器化的方法。不想编写 Dockerfile
?我也是!90% 的时间里,它们都是重复的,除了浪费的冗余之外,对世界没有任何贡献。这不像以前没有人弄清楚如何将 Java 应用程序容器化!因此,构建包允许您获取应用程序工件(无论是 .jar
、.war
、.NET 程序集、Ruby on Rails 应用程序、Node.js 应用程序还是……任何东西!),并将其转换为 Docker 镜像,然后您可以对其进行 docker tag
和 docker push
操作到您选择的容器注册表。(我可以推荐 VMware Harbor 吗?)构建包使用构建器来执行此操作,其中有整个生态系统可供选择。Paketo 项目 提供了大量的开箱即用构建器。构建包本身就很棒,但我喜欢您可以在不同版本中与构建包 API 交互。Spring Boot 通过其 Maven 和 Gradle 插件为构建包提供了开箱即用的支持:mvn spring-boot:build-image
,然后您就可以开始容器化了!如果您不想为每个构建管道都设置这些内容,请考虑使用 KPack,这是一种在集群内运行的 Kubernetes 运算符,并在感知到更新时将构建器应用于工件。您不必将集群的安全凭据泄露到您的 CI 管道中,也不必为每个新模块重新构建该容器发布管道。生活各方面都变得更好了!还有一个构建包可以构建 Spring Native 支持的 GraalVM 镜像!只需访问 Spring Initializr (start.spring.io) 并使用 Spring Native
作为依赖项构建新项目即可。它会自动为原生镜像重新调整构建包支持。