Spring 这一年 - 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 文件转换为特定架构的机器码。它是一个本地镜像(native image)。这意味着你失去了可移植性的好处。这不太好。但是,这里有一个很大的“但是”:生成的二进制文件是自包含的,运行时占用最少的 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 的方式,可以根据请求获取所需的数据,或多或少。你可以在服务的图结构(graph)上构建 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's(太好了!我简直不敢相信这个特性终于出现在 Java 中了!)这样你就可以告别过去繁琐的 String` 字符串拼接了。
  • sealed-types 是一种约束给定类型子类的方式,当你想要详尽地切换类型层次结构中的所有排列时,这特别有用。
  • 接口中的 private 方法。这基于 Java 8 中引入的 default 方法支持。
  • 用于匿名内部类的钻石操作符。钻石操作符在 Java 7 中就已经出现,但最近才开始支持匿名内部类。
  • 更智能的错误消息。例如,当你引发 NullPointerException 时,可以获得直观的错误提示。

开箱即用的 OpenJDK Java 17 分发版提供了兼容 ARM 和 Apple M1 的移植版本,速度飞快。它在各方面都是一个更好的分发版。感谢 Oracle 和社区!

Azure Spring Cloud

这个由 Spring 团队和 Microsoft 联合开发的平台即服务产品正在蓬勃发展,不断改进和强化,以便尽可能轻松地将 Spring Boot 应用交付到生产环境。2021 年也不例外。今年,该平台集成了托管虚拟网络和自动扩缩容改进了监控简化了部署,集成了Dynatrace,提供了出站公共 IP、Visual Studio Code 集成以及完整的 APM 功能等等。当然,还有大量的参考资料可供查阅。

客户端

Spring 提供了无与伦比的协议,以补充希望与服务通信的客户端开发者,支持 WebSockets、HTTPRESTOAuthRSocketGraphQL 等。而集成的机会正在日益增多。例如,我非常喜欢 Dave Syer 博士最近发表的这篇博文,其中介绍了一些可能的集成方案。在这篇博客中,Dave 博士探讨了 Webjars、HTMX、Hotwired 等。

Buildpacks

Buildpacks 每天都在变得越来越好!Buildpacks 是一个 CNCF 规范,提供了一种将应用容器化的方法。不想写 Dockerfile?我也不想!90% 的时间里,它们是重复的,除了浪费冗余之外没有任何意义。将 Java 应用容器化又不是什么新鲜事!所以,buildpacks 允许你获取应用制品,无论是 .jar.war、.NET 程序集、Ruby on Rails 应用、Node.js 应用还是...任何东西!... 并将其转换为一个 Docker 镜像,然后你可以 docker tagdocker push 到你选择的容器注册表。(我能推荐 VMware Harbor 吗?)Buildpacks 使用 builders 来实现这一点,你可以从整个生态系统中选择。 Paketo 项目提供了大量的开箱即用 builders。Buildpacks 本身就很棒,但我更喜欢你可以通过不同的方式与 buildpacks API 交互。Spring Boot 通过其 Maven 和 Gradle 插件提供了开箱即用的 buildpacks 支持:mvn spring-boot:build-image,然后你就可以进入容器化的世界了!如果你不想为每个构建流水线都设置这些,可以考虑使用 KPack,这是一个在集群中运行的 Kubernetes operator,每当检测到更新时,它就会将 builders 应用于制品。你无需将集群的安全凭据泄露到 CI 流水线中,也无需为每个新模块重新构建容器发布流水线。一切都变得更好了!还有一个 buildpack 可以构建基于 Spring Native 的 GraalVM 镜像!只需访问 Spring Initializr (start.spring.io) 并创建一个新的项目,将 Spring Native 作为依赖项。它会自动调整 buildpacks 支持以适应本地镜像。

订阅 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

抢先一步

VMware 提供培训和认证,助您加速前行。

了解更多

获取支持

Tanzu Spring 通过一份简单的订阅即可提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

近期活动

查看 Spring 社区的所有近期活动。

查看全部