领先一步
VMware 提供培训和认证,助您加速进步。
了解更多大家好,Spring的粉丝们!你们怎么样?我刚结束了在加州洛杉矶与家人度过的愉快的假期。今天晚些时候,我和孩子们将开车回家,回到加州旧金山。我非常享受在洛杉矶与人们的会面,尤其这是我们疫情前的第一次真正意义上的洛杉矶之行。
现在,(你敢相信吗?),新的一年已经近在眼前。一如既往,我将进行我年度的*今年Spring动态*回顾,所以请留意下面的内容,就在我们本周回顾之后。那么,废话不多说,这是2021年最后一期的*本周Spring动态*回顾。
现在,让我们来看看在我看来 2021 年一些最重要的事件。
您可能已经厌倦了我谈论 Spring Native,但我忍不住要说:它太棒了!GraalVM 是 OpenJDK 的直接替代品,它包含一个名为 native-image 的额外工具,您可以在安装 GraalVM 发行版后添加它。native-image 工具是一个预先(AOT)编译器,可以将您的 .class 文件转换为特定于体系结构的机器代码。这是一个本地镜像。这意味着您会失去可移植性的好处。这并不好。但是,这里有一个重要的“但是”:生成的二进制文件是自包含的,运行时占用最少的内存,并且启动速度比等效的 JRE 绑定的应用程序快 10 倍或更多。自包含的二进制文件是一件好事,因为它意味着您可以将其打包到极小的操作系统占用的空间中,非常适合在 Docker 镜像中分发。它占用的内存最少(或者更具体地说,是 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 团队和微软联合开发的平台即服务 (PaaS) 产品正在迅速发展,不断得到改进和加固,以便尽可能轻松地将 Spring Boot 应用程序投入生产。2021 年也不例外。今年,我们看到了托管虚拟网络和自动缩放的集成,改进的监控,简化的部署,Dynatrace 集成,出站公用 IP、Visual Studio Code 集成以及完整的 APM 功能,以及更多其他功能。当然,还有大量的参考资料。
Spring 提供了无与伦比的协议来支持想要与服务通信的客户端开发人员,支持 WebSocket、HTTP、REST、OAuth、RSocket 和 GraphQL 等。但集成机会每天都在改善。例如,我非常喜欢 Dr. Dave Syer 最近发布的这篇介绍一些集成可能性的文章。在这篇博客中,Dr. 探讨了 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 使用构建器来实现这一点,有很多生态系统可供选择。 Paketo 项目 提供了大量的开箱即用构建器。Buildpacks 本身就很棒,但我喜欢可以通过不同形式与 buildpacks API 进行交互。Spring Boot 通过其 Maven 和 Gradle 插件提供开箱即用的 buildpacks 支持:mvn spring-boot:build-image,然后您就可以开始容器化了!如果您不想为每个构建管道都进行设置,可以考虑使用 KPack,这是一个在集群中运行的 Kubernetes 操作符,当它检测到更新时就会将构建器应用于构件。您无需将集群的安全凭据泄露到 CI 管道中,也无需为每个新模块重新构建该容器发布管道。生活总会变得更好!还有一个用于构建 Spring Native 驱动的 GraalVM 镜像的 buildpack!只需访问 Spring Initializr (start.spring.io) 并构建一个带有 Spring Native 作为依赖项的新项目。它将自动重新配置对本地镜像的 buildpacks 支持。