当前位置: 首页 > 后端技术 > Java

GraalVM和SpringNative是尝鲜者,Springboot开始一步步飞起来,66ms完成启动

时间:2023-04-02 00:20:24 Java

介绍GraalVM是一个高性能的JDK,支持Java/Python/JavaScript等多种语言。它允许Java作为二进制文件执行,让程序在任何地方都可以更快地运行。也许这是Java和Go之间的战争?下载安装GraalVM安装GraalVM首先去官网下载。我直接从GitHub发布页面下载了它。请下载相应的系统包。我下载的是这样的:graalvm-ce-java11-darwin-amd64-22.3.0.tar.gz下载后解压到某个目录,我的是这样的:/Users/larry/Software/graalvm-ce-java11-22.3.0然后测试对应的程序是否可以正常执行,比如java--version。在Mac上会报错如下:isdamagedandcan'topened..所以需要执行如下语句:$sudoxattr-r-dcom.apple.quarantine/Users/larry/Software/graalvm-ce-java11-22.3.0注意修改对应目录。然后就可以执行:$./java--versionopenjdk11.0.172022-10-18OpenJDKRuntimeEnvironmentGraalVMCE22.3.0(build11.0.17+8-jvmci-22.3-b08)OpenJDK64-BitServerVMGraalVMCE22.3.0(build11.0.17+8-jvmci-22.3-b08,混合模式,共享)安装native-image,用于将Java程序转换为本地二进制包的工具,安装如下:$./guinstallnative-imageDownloading:Componentcatalogfromwww.graalvm.orgProcessingComponent:NativeImageDownloading:Componentnative-image:NativeImagefromgithub.com安装新组件:NativeImage(org.graalvm.native-image,version22.3.0)配置环境配置环境变量因为这个GraalVM还不够成熟,不想一直用,所以通过命令切换,配置如下:exportGraalVM_HOME=/Users/larry/Software/graalvm-ce-java11-22.3.0/Contents/HomealiasswitchOnGraalVM='exportPATH=$GraalVM_HOME:$PATH'aliasswitchOnGraalVMJavaHome='exportJAVA_HOME=/Users/larry/Software/graalvm-ce-java11-22.3.0/Contents/Home'别名switchOffGraalVM='导出路径=`echo$PATH|tr":""\n"|grep-v“graalvm”|tr"\n"":"`'aliasswitchOffGraalVMJavaHome='exportJAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home'配置IDEA可以在IDEA上配置对应的JDK,方便开发时使用:IntegrateSpringNative用SpringBoot普通的SpringBoot程序创建一个普通的SpringBootweb程序,主要Java代码如下:@SpringBootApplication@RestController@RequestMapping("/")publicclassSpringbootNativeGraalVMMain{publicstaticvoidmain(String[]args){SpringApplication.run(SpringbootNativeGraalVMMain.class,args);}@GetMapping("/hi-graalvm")publicStringhi(){return"ThismessageisfromSpringBootbuilt/runbyGraalVM/SpringNative";}}The启动时间是1.193秒,不错我的电脑还不错。集成SpringNative添加依赖:org.springframework.experimentalspring-native${spring-native.version}添加一个插件,这个插件很重要,否则会出现各种错误:org.springframework.experimentalspring-aot-maven-plugin0.11.5test-generatetest-generategenerategenerate添加以下插件来打包生成可执行程序:nativeexec0.9.11org.junit.platformjunit-platform-launcher测试org.graalvm.buildtoolsnative-maven-plugin${native-buildtools.version}<版本>${native-buildtools.version}version>truetest-nativetesttestbuild-nativepackagebuild然后使用以下命令构建包,时间会长很多,因为需要转成二进制可执行文件:$mvncleanpackage-Pnative两分多钟后生成一个可执行文件,执行如下:$target/spring-boot-native-graalvm结果只用了0.066秒,也就是66毫秒就够了,太快了访问接口也正常:先用Docker启动本地Docker,然后添加依赖如下:><配置>${repackage.classifier}paketobuildpacks/builder:tinytrue使用如下命令构建Docker镜像:mvnspring-boot:build-image可能需要较长时间,需要下载一些工具和镜像。打包成功后多出镜像:$dockerimages|grepgraalvmspring-boot-native-graalvm1.0-SNAPSHOTd2c8d5c52a3c42年前85.8MB启动如下:$dockerrun--rmspring-boot-native-graalvm:1.0-SNAPSHOT-p8080:8080开机时间为59ms,甚至更短。注意直接通过native-image命令将jar包转为可执行文件。如果你遇到各种问题,我劝你放弃尝试。这也是SpringNative的价值所在。别问我为什么知道,哈哈~~注意切换对应的Java程序和JavaHome,不然build包会报错。看SpringNative的包名是experimental,应该离production比较远,所以不要轻易在production中使用。代码代码见GitHub:https://github.com/LarryDpk/p...参考:快速入门指南GraalVM快速参考GraalVMNativeImageQuickReferencev1更接近云原生|体验GraalVM静态编译字节码,试试《超声波Java》——Quarkus