月度归档: 2021 年 3 月

  • Spring Native的使用

    Spring Native的使用

    Spring Native本质上其实是依赖于GraalVM的native image功能,所以要先安装相关依赖。

    安装graalvm

    MacOS的安装依赖brew,官方有一个tap。

    brew install --cask graalvm/tap/graalvm-ce-lts-java11

    安装以后使用gu工具安装native-image工具

    gu install native-image

    SpringNative构建

    首先进行的是AOT插件,插件会根据上下文进行一些优化,主要是为了增强native image的兼容性。

    其次会进行jar包构建,构建后的jar包也是可以在JVM环境下正常运行。

    最后就是build-image这一步,其实启用native与否的关键主要在buildpacks上。首先会自动探测需要应用的buildpacks。如果系统变量BP_NATIVE_IMAGE是true的话就会激活paketo-buildpacks/native-image

    这个插件的native目录包含了对应的GO文件,会调用native-image进行生成操作。生成后会放入image中。

    构建本身还是比较快的。

    出错情况

    最常见的出错就是native-image没有安装或者没有使用graalvm,一般提示native-image找不到。

    目前spring-native要求GraalVM 21.0.0,版本如果低了可能有部分参数不支持,比InlineBeforeAnalysis等。

    可以通过BP_NATIVE_IMAGE_BUILD_ARGUMENTS指定一些特殊参数,常见的如下:

    • –verbose
    • -H:+PrintAnalysisCallTree
    • -H:+TraceClassInitialization
    • -H:+ReportExceptionStackTraces
    • –enable-all-security-services
  • 通过Spring Native构建本地镜像

    Spring Native目前已经在start.spring.io开放使用了。GraalVM在之前已经支持了本地镜像的构建,即不要求JVM安装(不是简单的集成JVM,还有AOT等特性),只生成单一分发文件。现在Spring也可以使用快速使用这个特性了,命令行使用

    mvn spring-boot:build-image

    这个特性比较适合以下场景:

    • Serverless
    • 微服务
    • 分发更高性能和容量的镜像

    参考

    https://www.graalvm.org/reference-manual/native-image/

    https://spring.io/blog/2021/03/11/announcing-spring-native-beta