抢先一步
VMware 提供培训和认证,助您加速前行。
了解更多嘿,Spring 粉丝们!你们过得怎么样?我刚在加利福尼亚州洛杉矶与家人度过了一个愉快的假期。今天晚些时候,我和女儿们将开车回家到加利福尼亚州旧金山。我非常喜欢在洛杉矶与人们的会面,特别是这是我们在疫情前第一次真正来到洛杉矶。
现在,(你能相信吗?),我们正迎来新年。像往常一样,我将进行年度的《Spring 这一年》回顾,敬请关注下面的内容,就在我们每周回顾之后。那么,事不宜迟,以下是 2021 年最后一期《Spring 本周回顾》的摘要。
现在,让我们来看看在我看来 2021 年一些最重要的事件。
你们可能已经厌倦了我谈论 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
。
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。
今年,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` 字符串拼接了。private
方法。这基于 Java 8 中引入的 default
方法支持。NullPointerException
时,可以获得直观的错误提示。开箱即用的 OpenJDK Java 17 分发版提供了兼容 ARM 和 Apple M1 的移植版本,速度飞快。它在各方面都是一个更好的分发版。感谢 Oracle 和社区!
这个由 Spring 团队和 Microsoft 联合开发的平台即服务产品正在蓬勃发展,不断改进和强化,以便尽可能轻松地将 Spring Boot 应用交付到生产环境。2021 年也不例外。今年,该平台集成了托管虚拟网络和自动扩缩容,改进了监控,简化了部署,集成了Dynatrace,提供了出站公共 IP、Visual Studio Code 集成以及完整的 APM 功能等等。当然,还有大量的参考资料可供查阅。
Spring 提供了无与伦比的协议,以补充希望与服务通信的客户端开发者,支持 WebSockets、HTTP、REST、OAuth、RSocket 和 GraphQL 等。而集成的机会正在日益增多。例如,我非常喜欢 Dave Syer 博士最近发表的这篇博文,其中介绍了一些可能的集成方案。在这篇博客中,Dave 博士探讨了 Webjars、HTMX、Hotwired 等。
Buildpacks 每天都在变得越来越好!Buildpacks 是一个 CNCF 规范,提供了一种将应用容器化的方法。不想写 Dockerfile
?我也不想!90% 的时间里,它们是重复的,除了浪费冗余之外没有任何意义。将 Java 应用容器化又不是什么新鲜事!所以,buildpacks 允许你获取应用制品,无论是 .jar
、.war
、.NET 程序集、Ruby on Rails 应用、Node.js 应用还是...任何东西!... 并将其转换为一个 Docker 镜像,然后你可以 docker tag
并 docker 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 支持以适应本地镜像。