2021年春季回顾 - 2021年12月28日

工程 | Josh Long | 2021年12月28日 | ...

嗨,Spring 粉丝们!你们好吗?我刚刚结束在加利福尼亚州洛杉矶与家人共度的一个美好的假期。今天晚些时候,我和女儿们将开车返回加利福尼亚州旧金山。我很享受在洛杉矶与人们的会面,尤其是在大流行之前,这是我们第一次真正访问洛杉矶。

现在,(你能相信吗?),我们正迎接着新的一年。像往常一样,我将进行我每年的“这一年中的 Spring”总结,所以请继续关注下面的内容,在我们每周的总结之后。因此,事不宜迟,以下是 2021 年的最后一个“本周 Spring”回顾。

现在,让我们看看在我看来 2021 年的一些最重要的事件。

Spring Native 和 GraalVM

你可能已经厌倦了我谈论 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

Spring GraphQL

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

Java 17

今年,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 方法的支持之上
  • 匿名内部类的菱形运算符。菱形运算符出现在 Java 7 中,但直到最近才开始适用于匿名内部类。
  • 更智能的错误消息。例如,当你导致 NullPointerException 时,可以获得直观的错误。

开箱即用的 OpenJDK Java 17 发行版附带一个 ARM 和 Apple M1 兼容的端口,速度极快。它在各个方面都是一个更好的发行版。感谢 Oracle 和社区!

Azure Spring Cloud

这个由 Spring 团队和微软联合开发的平台即服务产品正在蓬勃发展,不断改进和强化,以尽可能轻松地将 Spring Boot 应用程序交付到生产环境中。2021 年也不例外。今年见证了 托管虚拟网络和自动缩放的集成改进的监控轻松部署Dynatrace 集成出站公网 IP、Visual Studio Code 集成和完整的 APM 功能等等。当然,还有很多 参考架构

客户端

Spring 提供了无与伦比的协议来补充希望与服务通信的客户端开发人员,支持诸如 WebSockets、HTTPRESTOAuthRSocketGraphQL 等内容。但集成机会与日俱增。例如,我非常喜欢 Dave Syer 博士最近发布的一篇博文,其中介绍了一些集成可能性。在这篇博文中,Dave 博士探讨了 Webjars、HTMX、Hotwired 等内容。

构建包

构建包 每天都在变得越来越好!构建包是 CNCF 规范,提供了一种获取应用程序并将其容器化的方法。不想编写 Dockerfile?我也是!90% 的时间里,它们都是重复的,除了浪费的冗余之外,对世界没有任何贡献。这不像以前没有人弄清楚如何将 Java 应用程序容器化!因此,构建包允许您获取应用程序工件(无论是 .jar.war、.NET 程序集、Ruby on Rails 应用程序、Node.js 应用程序还是……任何东西!),并将其转换为 Docker 镜像,然后您可以对其进行 docker tagdocker 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 作为依赖项构建新项目即可。它会自动为原生镜像重新调整构建包支持。

获取 Spring 时事通讯

与 Spring 时事通讯保持联系

订阅

抢先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部