Dubbo AOT — 如何使用 GraalVM Native Image 实现 Dubbo 应用静态化

Dubbo AOT 技术详解,如何使用 GraalVM Native Image 实现 Dubbo 应用静态化。

在 Dubbo 3.3.0 版本中,我们正式发布了 Dubbo AOT 静态化解决方案。本文档将介绍将介绍如何借助 Dubbo AOT 技术将应用接入 GraalVM Native Image,将应用编译为 Native 二进制包的流程以及目前支持的组件。

Dubbo GraalVM 适配文档可能更新滞后

由于 Dubbo AOT 技术发展迅速,本文档内容可能无法总是保持及时更新,请结合以下内容了解最新内容与使用方式:

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

使用场景

  • 本机映像编译:将应用程序预编译为本机映像,缩短启动时间并减少内存使用。

  • 语言互操作:GraalVM 能够用多种语言编写代码,在同一应用程序中进行互操作。

  • 优化:GraalVM 为用 Java、JavaScript 和其他语言编写的应用程序提供优化,提高 Dubbo 应用程序的性能。

  • Polyglot 调试:GraalVM 能够在同一会话中调试用多种语言编写的代码,对复杂 Dubbo 应用程序中的问题进行故障排除时非常有用。

  • Java 运行时:可以在 GraalVM 上运行,提供更快、更高效的 Java 运行时环境。

  • 开发微服务:可以与 GraalVM 结合,创建高性能、低资源利用率的微服务。

使用方式

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

第一步:安装GraalVM

  1. 在Graalvm官网根据自己的系统选取对应Graalvm版本:https://www.graalvm.org/downloads/
  2. 根据官方文档安装native-image:https://www.graalvm.org/latest/reference-manual/native-image/#install-native-image

第二步:配置profiles

其中包括maven-compiler-plugin、spring-boot-maven-plugin、native-maven-plugin、dubbo-maven-plugin,修改dubbo-maven-plugin中的mainClass为所需的启动类全路径。(其中API使用方式无需添加spring-boot-maven-plugin依赖。)

  1. <profiles>
  2. <profile>
  3. <id>native</id>
  4. <build>
  5. <plugins>
  6. <plugin>
  7. <artifactId>maven-compiler-plugin</artifactId>
  8. <configuration>
  9. <release>17</release>
  10. <fork>true</fork>
  11. <verbose>true</verbose>
  12. </configuration>
  13. </plugin>
  14. <plugin>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-maven-plugin</artifactId>
  17. <executions>
  18. <execution>
  19. <id>process-aot</id>
  20. <goals>
  21. <goal>process-aot</goal>
  22. </goals>
  23. </execution>
  24. </executions>
  25. </plugin>
  26. <plugin>
  27. <groupId>org.graalvm.buildtools</groupId>
  28. <artifactId>native-maven-plugin</artifactId>
  29. <version>0.9.25</version>
  30. <configuration>
  31. <classesDirectory>${project.build.outputDirectory}</classesDirectory>
  32. <metadataRepository>
  33. <enabled>true</enabled>
  34. </metadataRepository>
  35. <requiredVersion>22.3</requiredVersion>
  36. </configuration>
  37. <executions>
  38. <execution>
  39. <id>add-reachability-metadata</id>
  40. <goals>
  41. <goal>add-reachability-metadata</goal>
  42. </goals>
  43. </execution>
  44. </executions>
  45. </plugin>
  46. <plugin>
  47. <groupId>org.apache.dubbo</groupId>
  48. <artifactId>dubbo-maven-plugin</artifactId>
  49. <version>${dubbo.version}</version>
  50. <configuration>
  51. <mainClass>com.example.nativedemo.NativeDemoApplication</mainClass>
  52. </configuration>
  53. <executions>
  54. <execution>
  55. <phase>process-sources</phase>
  56. <goals>
  57. <goal>dubbo-process-aot</goal>
  58. </goals>
  59. </execution>
  60. </executions>
  61. </plugin>
  62. </plugins>
  63. </build>
  64. </profile>
  65. </profiles>

第三步:在Pom依赖中添加native相关的依赖:

其中API使用方式无需添加dubbo-config-spring6依赖

  1. <dependency>
  2. <groupId>org.apache.dubbo</groupId>
  3. <artifactId>dubbo-config-spring6</artifactId>
  4. <version>${dubbo.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.dubbo</groupId>
  8. <artifactId>dubbo-native</artifactId>
  9. <version>${dubbo.version}</version>
  10. </dependency>

第四步:配置应用

示例配置如下:

  1. dubbo:
  2. application:
  3. name: ${spring.application.name}
  4. logger: slf4j
  5. protocol:
  6. name: dubbo
  7. port: -1
  8. serialization: fastjson2
  9. registry:
  10. id: zk-registry
  11. address: zookeeper://127.0.0.1:2181
  12. config-center:
  13. address: zookeeper://127.0.0.1:2181
  14. metadata-report:
  15. address: zookeeper://127.0.0.1:2181
  16. provider:
  17. serialization: fastjson2
  18. consumer:
  19. serialization: fastjson2

第五步:编译

在项目根路径下执行以下编译命令:

  • API方式直接执行
  1. mvn clean install -P native -Dmaven.test.skip=true
  • 注解和xml方式(Springboot3集成的方式)
  1. mvn clean install -P native native:compile -Dmaven.test.skip=true

第六步:执行二进制文件即可

二进制文件在target/目录下,一般以工程名称为二进制包的名称,比如target/native-demo

支持的组件以及对应的版本

日志组件

组件名称所需的插件插件版本备注
Apache Commons Loggingnative-maven-plugin0.9.24 及其以上
JDK Loggernative-maven-plugin0.9.24 及其以上
slf4jspring-boot-maven-plugin3.x.x (用最新版本即可)
Log4jnative-maven-plugin0.10.0 及其以上
Log4j2

序列化组件

组件名称所需的插件插件版本备注
FastJson2dubbo-maven-plugin3.3.0 及其以上
JDKnative-maven-plugin0.9.24 及其以上
Hessian-Lite对JDK 17支持不友好,暂不支持

注册中心组件

组件名称所需的插件插件版本备注
Zookeeperdubbo-maven-plugin3.3.0仅支持Zookeeper Curator5

元数据中心组件

组件名称所需的插件插件版本备注
Zookeeperdubbo-maven-plugin3.3.0仅支持Zookeeper Curator5

配置中心组件

组件名称所需的插件插件版本备注
Zookeeperdubbo-maven-plugin3.3.0仅支持Zookeeper Curator5

可观测性组件

组件名称所需的插件插件版本备注
Micrometer

最后修改 September 13, 2024: Refactor website structure (#2860) (1a4b998f54b)