1个月前 (10-28)  相关技术 |   抢沙发  31 
文章评分 0 次,平均分 0.0

Spring“家族”是围绕Spring框架构建的,Spring框架是目前最流行的Java框架之一,Spring Boot是其旗舰产品。18年前首次发布,它不断成长和复兴。虽然出现了新的解决方案,但Spring仍处于领先地位。它仍然是一个轻量级、安全、易于定制和灵活的编程环境,已成为现代Java开发的标准助手。

但今天,我们要关注的是Spring“家庭”的最新成员ー Spring Native,即将上映。现在是beta版,它已经引起了全世界开发者的注意,并且可以进行测试。

请注意,我们自己的Liberica本机映像工具包即使现在仍处于测试阶段,也与Spring Boot完全兼容。

那么,什么是SpringNative?

Spring Native是Spring框架的一个版本,内置支持使用GraalVM将应用程序编译为本机映像。它允许在任何系统上运行基于Spring的代码,而无需传统的Java虚拟机,几乎可以即时启动、即时峰值性能和低内存消耗。使用AOT(提前)编译器,Spring Native生成一个小映像,其中包含操作系统层、运行代码所需的依赖项以及OpenJDK和Spring的部分,所有这些都打包到一个可执行文件中。

最后,为了更快的启动、更低的占用空间和更简单的容器结构,它需要更长的构建时间,可能还需要更少的运行时优化。这非常适合于云部署、Kubernetes等管理系统,甚至是无服务器方法。

Spring越来越凉了!

那么,这有什么关系呢?

很高兴你这么问!实际上有几个原因:

Spring正在追赶竞争对手,解决了框架中最关键的问题之一。GraalVM本机映像支持从一开始就在Quarkus中,Micronaut在很久以前就添加了它。现在Spring也与它兼容,可以在这方面竞争。

在云时代,微服务的规模比以往任何时候都更加重要。它节省时间和金钱。Spring应用程序往往会随着时间的推移而变得臃肿,Spring Native解决了这个问题。

尽管仍然是实验性的,但是Spring Native可以在开发者的官方网站上使用,并且使用它创建的图像已经显示出比Spring生成的JAR更快的启动时间和更低的内存占用。

随着未来基于Java17的Spring框架版本的发布,您可以预期会有很多变化,这些变化将增强Spring Native已经非常出色的性能。

由于Spring Boot和GraalVM的行为非常不同,实现这项技术花费了很长时间。AOT编译并不适合Spring非常动态、可插入的运行时行为。这个问题通过引导代码生成器(maven或gradle插件提供)解决。这是一个巨大的里程碑,使我们能够享受两个世界中最好的。

Spring Native+Liberica Native图像工具包:让我们试试吧!

正如我们已经提到的,SpringNative可用于测试。虽然我们可以期待基于JDK17的Spring最终版本会有更多的改进,但仍然有一种方法可以测试该特性的性能。

因此,让我们将一个jar转换为本机映像!我们将以petclinic项目为例,我们自己的LibericaJDK11作为运行时,Liberica原生映像工具包作为工具。

LIBERICA:https://bell-sw.com/pages/liberica-native-image-kit/

从SpringNative开始,最简单的方法是使用SpringInitializer创建一个工件,或者在https://github.com/spring-projects-experimental/spring-native/tree/main/samples. 在本例中,我们将使用petclinic jdbc应用程序。

如果您查看Maven项目中的主pom.xml和父pom.xml内容,那么有几个值得注意的特性:

依赖项包括SpringNative插件(当前为org.springframework.experimental:spring-native:0.10.3-SNAPSHOT)。

构建部分包括SpringAOTMaven插件和org.graalvm.buildtools:nativeMaven插件。

有一个单独的“本机”配置文件及其自己的本机maven插件配置。

springframework.boot:springbootmaven插件被配置为使用paketobuildpacks构建器(paketobuildpacks/builder:tiny),默认情况下该构建器处于BP_NATIVE_IMAGE=true模式。

关于如何构建和运行应用程序,有多个选项。

在任何情况下,我们都需要一个JDK来运行Maven。我在Linux系统上安装了Liberica JDK作为一个包,因此命令行中的JAVA_HOME部分被相应地设置。

Сlassical JAR

让我们从构建JAR文件开始。

JAVA_HOME=/usr/lib/jvm/bellsoft-java11-amd64/ ~/apache-maven-3.8.2/bin/mvn install

它产生一个24MB的目标/petclinic-jdbc-0.0.1-SNAPSHOT.jar。您可以像往常一样启动它:

java -jar target/petclinic-jdbc-0.0.1-SNAPSHOT.jar

我的笔记本电脑的启动时间大约是2.4秒。

默认本机映像容器

让我们构建一个容器。

请注意,如果使用Windows或macOS,则需要确保分配给Docker的内存至少为8GB。

运行以下命令:

JAVA_HOME=/usr/lib/jvm/bellsoft-java11-amd64/ ~/apache-maven-3.8.2/bin/mvn spring-boot:build-image

我们有一个容器图像,你可以用它启动

docker run -it docker.io/library/petclinic-jdbc:0.0.1-SNAPSHOT

由于它是基于本机映像的,因此启动时间大约只有0.1秒。与2.4秒相比有着巨大的差异!

为了使我们的工作更加方便,让我们通过使用docker-composedocker-compose.yml配置,获得一个具有选定数据库的功能齐全的应用程序:

docker-compose up

该方法还通过将BP_NATIVE_IMAGE更改为false(内部为JVM和.jar),将其转换为经典的分层容器映像组装。

本地映像

上一节中描述的Paketo buildpack使用特定版本的GraalVM和本机映像。例如,在当前版本中,它是GraalVM 21.0.0.2(Java版本1.8.0_282-b07)。但是我们可以使用前面提到的“本机”配置文件以任何方式构建本机映像。例如,让我们使用基于GraalVM 21.2.0和Liberica JDK 11.0.12的Liberica原生映像工具包。

首先,下载Liberica Native Image Kit Core(https://bell-sw.com/pages/downloads/native-image-kit/)。核心版本最适合Java本机映像,因为它包含Liberica VM和本机映像(从GraalVM派生),一开始就没有其他语言。然后选择您的平台和包装。在我的例子中,它是Linux x86_64和.tar.gz,Liberica NIK版本是21.2.0。

现在在JAVA_HOME中传递安装的完整路径,并为构建调用“本机”配置文件:

JAVA_HOME=$(pwd)/bellsoft-liberica-vm-core-openjdk11-21.2.0 ~/apache-maven-3.8.2/bin/mvn -Pnative install

这个过程大约需要10分钟才能完成(它使用8个CPU内核和大约8GB的RAM)。因此,我们得到了118MB的target/petclinicjdbc二进制文件。测试之后,我们看到它仅在十分之一秒内启动ー 我们今天取得了最好的成绩!在本例中,我们使用了比默认版本更新的本机映像工具。但有时需要在解决所有迁移问题之前一直使用特定的版本,所以这种方法可以反过来使用。

Liberica热爱Spring

正如你所看到的,即使在这个实验阶段,Spring和Liberica NIK也能很好地合作。

重要的一点是,如果您还没有准备好升级到新的Java 17,您将始终能够使用Liberica NIK的以前LTS版本。在本文中,我们讨论了最新OpenJDK中的所有不推荐和创新。如果您担心向后兼容性,您仍然可以使用LibericaJDK11,因为它将在2026年之前得到更新。

虽然目前,我们仍然需要大量定制,才能与GraalVM成为Spring Boot的朋友,但这一点即将改变。9月,Java17将面世,新版本的SpringBoot将在稍后发布,这使得创建本机映像的过程更加顺利。至于现在,我们建议您深入研究Spring Boot,测试它,并检查您的Spring应用程序如何以前所未有的速度运行!

原文地址:https://bell-sw.com/announcements/2021/08/26/the-new-spring-is-here/

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2483.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册