springboot native graalvm使用初识
背景
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添加到应用程序中
生成的项目将包含对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
**从上图可以看出,demo服务启动耗时 6.655s!!! **
如果没有Spring AOT,应用程序的启动速度将比相应的版本更快。让我们看看应用是否正常运行。
浏览器打开 http://localhost:8080
由于我们没有配置任何资源,所以看到上面的界面则表示服务已经正常运行!!!
本机映像运行
让我们尝试使用Spring native和GraalVM构建并运行一个本机映像。
使用Spring Boot插件构建本机映像非常简单。确保Docker引擎正在运行,然后执行以下命令。请注意,这将需要几分钟,很大程度上取决于你的笔记本电脑的CPU和内存特性。
$ ./gradlew bootBuildImage
如果遇到 Builder lifecycle 'creator' failed with status code 145 报错!请将docker内存调大到16G,因为根据spring-native官网说明,native-img非常耗内存
如果上述命令执行成功,结果将是一个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的启动确实快了非常多,就是编译的时候慢一些,在大规模部署发布成本比编译成本高很多的情况下可以接受,另外从服务监控看到gc和内存确实有优化,非常不错,接下来开始启动我们线上服务通过spring-native进行部署发布吧
转载自:https://juejin.cn/post/7036718933180678152