使用 GraalVM 打包 Native Image

    本文档将介绍将dubbo3.0项目接入GraalVM,进行native-image编译为二进制的流程。

    关于GraalVm的更多信息可以阅读 https://www.graalvm.org/docs/getting-started/container-images/ 此文档。

    使用样例

    在编译我们的dubbo项目之前,需要确保我们正基于graalVm的环境。

    进入https://www.graalvm.org/ 官网根据自己的系统选取最新版本安装:

    安装完成后,修改配置JAVA_HOME的路径,生效后查看本地jdk可以看到如下:

    Native Image - 图2 这里我们使用的基于jdk1.8版本的GraalVM。

    • 安装native-image,只需执行gu install native-image即可。
    1. 拉取dubbo代码,切换到分支。
    2. 手动执行生成SPI代码。

    执行CodeGenerator即可在dubbo-native模块下生成SPI代码。

    1. 编译demo项目

    这里我们提供了可直接进行编译的示例项目,dubbo-demo/dubbo-demo-native。上面步骤install完成后,先到dubbo-demo-native的provider下,执行native-image编译:

    这里由于我们在maven中引入了native-image插件,所以直接-P native即可执行该插件。

    Native Image - 图4 编译成功后可以在target下看到已经生成的二进制文件,本地启动一个zookeeper,直接执行该二进制,可见启动成功如下:

    consumer端同样执行编译,在consumer的target下也会生成二进制文件:demo-native-consumer,执行该二进制可以看到调用结果如下:

    Native Image - 图6

    实际上在这个demo下我们做了一些工作来确保项目可以编译执行,主要有以下几个步骤

    • 引入dubbo-native依赖
    • 引入native-image插件

    其中定义了生成的镜像名以及一些构建镜像的参数。

    由于我们需要将一些反射、JNI等类先指定出来,我们需要先使用该agent以正常方式运行一遍生成这些类的json形式的信息。

    在启动参数中添加:

    以正常方式启动,在项目的resources下建立文件夹META-INF.native-image,把在本地目录中生成的文件粘进去:

    (可能会有缺漏没有生成的类信息,需要根据编译或运行时的报错信息手动添加。)

    完成以上几步后就可以进行项目的编译了。