likes
comments
collection
share

springboot native graalvm使用初识

作者站长头像
站长
· 阅读数 22

背景

Spring Boot 2.4 以后开始逐步提供对 GraalVM 的支持,旨在提升上文所述的 启动、内存、响应的使用体验。 Spring Native项目支持使用GraalVM将Spring应用程序打包为原生镜像。 与JVM可执行文件相比,原生镜像具有更快的启动时间( <100ms )和更低的内存消耗。但是,构建原生镜像比基于JVM的映像需要更多的时间。

环境搭建

硬件

使用的是mac

软件

安装docker

后面使用docker引擎编译镜像使用。 如何安装?直接docker官网下载安装即可,非常简单!

使用Spring Native引导应用程序

当从spring initializer引导项目时( start.spring.io/  ),可以将Spring Native添加到应用程序中 springboot native graalvm使用初识 生成的项目将包含对SpringNative项目和Spring AOT插件的依赖,Spring AOT插件用于将应用程序源代码编译为本机可执行文件,同时提高兼容性和占用空间

build.gradle 文件如下所示

plugins {
	id 'org.springframework.boot' version '2.6.1'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
	id 'org.springframework.experimental.aot' version '0.11.0-RC1'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	maven { url 'https://repo.spring.io/milestone' }
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

bootBuildImage {
	builder = 'paketobuildpacks/builder:tiny'
	environment = ['BP_NATIVE_IMAGE': 'true']
}

对比测试

可执行JAR运行

首先,打开一个终端窗口,导航到项目的根文件夹,然后运行以下命令。

$ ./gradlew bootRun

springboot native graalvm使用初识 **从上图可以看出,demo服务启动耗时 6.655s!!! **

如果没有Spring AOT,应用程序的启动速度将比相应的版本更快。让我们看看应用是否正常运行。

浏览器打开 http://localhost:8080

springboot native graalvm使用初识 由于我们没有配置任何资源,所以看到上面的界面则表示服务已经正常运行!!!

本机映像运行

让我们尝试使用Spring native和GraalVM构建并运行一个本机映像。

使用Spring Boot插件构建本机映像非常简单。确保Docker引擎正在运行,然后执行以下命令。请注意,这将需要几分钟,很大程度上取决于你的笔记本电脑的CPU和内存特性。

$ ./gradlew bootBuildImage

如果遇到 Builder lifecycle 'creator' failed with status code 145 报错!请将docker内存调大到16G,因为根据spring-native官网说明,native-img非常耗内存

springboot native graalvm使用初识

如果上述命令执行成功,结果将是一个docker.io/library/demo:0.0.1-SNAPSHOT 的镜像你可以和Docker一起跑。

$ docker run --name spring-native-graalvm -p 8080:8080 docker.io/library/demo:0.0.1-SNAPSHOT

使用Spring Native的应用程序通常在不到100ms的时间内启动,这取决于您机器的可用资源.

springboot native graalvm使用初识

结论

从上面对比测试可以看出springboot的启动确实快了非常多,就是编译的时候慢一些,在大规模部署发布成本比编译成本高很多的情况下可以接受,另外从服务监控看到gc和内存确实有优化,非常不错,接下来开始启动我们线上服务通过spring-native进行部署发布吧