This is an automated email from the ASF dual-hosted git repository.
crazyhzm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-website.git
The following commit(s) were added to refs/heads/master by this push:
new 2f02d34cd4 Update native image doc (#2518)
2f02d34cd4 is described below
commit 2f02d34cd42980c4dd031a1b7e2a0b3dbfe12437
Author: huazhongming <[email protected]>
AuthorDate: Thu Apr 13 20:14:22 2023 +0800
Update native image doc (#2518)
* update native image doc
* fix typo
---
.../performance/support-graalvm.md | 302 +++++++++------------
1 file changed, 127 insertions(+), 175 deletions(-)
diff --git
a/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/support-graalvm.md
b/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/support-graalvm.md
index 96a8fbe82e..2467ff2fd3 100644
---
a/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/support-graalvm.md
+++
b/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/support-graalvm.md
@@ -12,12 +12,8 @@ weight: 40
-
-
-
-
## 功能说明
-Dubbo3.0 支持 Native-Image 文档, 本文档将介绍将 dubbo3.0 项目接入 GraalVM,进行 native-image
编译为二进制的流程。
+Dubbo3.2 支持 Native-Image 文档, 本文档将介绍将 dubbo3.0 项目接入 GraalVM,进行 native-image
编译为二进制的流程。
关于 GraalVm 的更多信息可以阅读
https://www.graalvm.org/docs/getting-started/container-images/ 此文档。
@@ -32,196 +28,152 @@ Dubbo3.0 支持 Native-Image 文档, 本文档将介绍将 dubbo3.0 项目接入
## 使用方式
在编译我们的dubbo项目之前,需要确保我们正基于graalVm的环境。
-### 安装GraalVM
-进入 https://www.graalvm.org/ 官网根据自己的系统选取最新版本安装:
-
-
-
-安装完成后,修改配置 JAVA_HOME 的路径,生效后查看本地 jdk 可以看到如下:
-
-
-这里我们使用的基于jdk1.8版本的GraalVM。
-
-- 安装native-image,只需执行gu install native-image即可。
-
-1. 拉取dubbo代码,切换到[apache:3.0](https://github.com/apache/dubbo)分支。
-2. 手动执行生成SPI代码。
-
-由于目前编译native-image不支持代码动态生成编译,所以有关代码动态生成的部分需要我们手动先生成,这里提供了工具函数:
-
-
-执行CodeGenerator即可在dubbo-native模块下生成SPI代码。
-
-### 在根目录下执行install
-
-```
-MacdeMacBook-pro-3:incubator-dubbo mac$ pwd
-
-/Users/mac/Documents/Mi/project/incubator-dubbo
-
-MacdeMacBook-pro-3:incubator-dubbo mac$ mvn clean package install
-Dmaven.test.skip=true
+### 第一步:安装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依赖。)
+
+```xml
+ <profiles>
+ <profile>
+ <id>native</id>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <release>17</release>
+ <fork>true</fork>
+ <verbose>true</verbose>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>process-aot</id>
+ <goals>
+ <goal>process-aot</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.graalvm.buildtools</groupId>
+ <artifactId>native-maven-plugin</artifactId>
+ <version>0.9.20</version>
+ <configuration>
+
<classesDirectory>${project.build.outputDirectory}</classesDirectory>
+ <metadataRepository>
+ <enabled>true</enabled>
+ </metadataRepository>
+ <requiredVersion>22.3</requiredVersion>
+ </configuration>
+ <executions>
+ <execution>
+ <id>add-reachability-metadata</id>
+ <goals>
+ <goal>add-reachability-metadata</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.dubbo</groupId>
+ <artifactId>dubbo-maven-plugin</artifactId>
+ <version>${dubbo.version}</version>
+ <configuration>
+
<mainClass>com.example.nativedemo.NativeDemoApplication</mainClass>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>process-sources</phase>
+ <goals>
+ <goal>dubbo-process-aot</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
```
-### 编译demo项目
-
-这里我们提供了可直接进行编译的示例项目,dubbo-demo/dubbo-demo-native。上面步骤install完成后,先到dubbo-demo-native的provider下,执行native-image编译:
-
-```
- mvn clean package -P native -Dmaven.test.skip=true
-```
-
-这里由于我们在maven中引入了native-image插件,所以直接-P native即可执行该插件。
-
-
-编译成功后可以在target下看到已经生成的二进制文件,本地启动一个zookeeper,直接执行该二进制,可见启动成功如下:
-
-consumer端同样执行编译,在consumer的target下也会生成二进制文件:demo-native-consumer,执行该二进制可以看到调用结果如下:
-
-### 具体步骤
+### 第三步:在Pom依赖中添加native相关的依赖:
-实际上在这个demo下我们做了一些工作来确保项目可以编译执行,主要有以下几个步骤
+其中API使用方式无需添加dubbo-config-spring6依赖。
-- 引入dubbo-native依赖
-
-```
+```xml
+<dependency>
+ <groupId>org.apache.dubbo</groupId>
+ <artifactId>dubbo-config-spring6</artifactId>
+ <version>${dubbo.version}</version>
+</dependency>
<dependency>
-
<groupId>org.apache.dubbo</groupId>
-
<artifactId>dubbo-native</artifactId>
-
- <version>${project.version}</version>
-
+ <version>${dubbo.version}</version>
</dependency>
```
-该模块下有我们生成的SPI代码。
-
-- 引入native-image插件
-
-```
-<plugin>
-
- <groupId>org.graalvm.nativeimage</groupId>
-
- <artifactId>native-image-maven-plugin</artifactId>
-
- <version>21.0.0.2</version>
-
- <executions>
-
- <execution>
-
- <goals>
-
- <goal>native-image</goal>
-
- </goals>
-
- <phase>package</phase>
-
- </execution>
-
- </executions>
-
- <configuration>
-
- <skip>false</skip>
-
- <imageName>demo-native-provider</imageName>
-
-
<mainClass>org.apache.dubbo.demo.graalvm.provider.Application</mainClass>
-
- <buildArgs>
-
- --no-fallback
-
- --initialize-at-build-time=org.slf4j.MDC
-
- --initialize-at-build-time=org.slf4j.LoggerFactory
-
- --initialize-at-build-time=org.slf4j.impl.StaticLoggerBinder
-
- --initialize-at-build-time=org.apache.log4j.helpers.Loader
-
- --initialize-at-build-time=org.apache.log4j.Logger
-
- --initialize-at-build-time=org.apache.log4j.helpers.LogLog
-
- --initialize-at-build-time=org.apache.log4j.LogManager
-
- --initialize-at-build-time=org.apache.log4j.spi.LoggingEvent
-
- --initialize-at-build-time=org.slf4j.impl.Log4jLoggerFactory
-
- --initialize-at-build-time=org.slf4j.impl.Log4jLoggerAdapter
-
- --initialize-at-build-time=org.eclipse.collections.api.factory.Sets
-
- --initialize-at-run-time=io.netty.channel.epoll.Epoll
-
- --initialize-at-run-time=io.netty.channel.epoll.Native
-
- --initialize-at-run-time=io.netty.channel.epoll.EpollEventLoop
-
- --initialize-at-run-time=io.netty.channel.epoll.EpollEventArray
-
- --initialize-at-run-time=io.netty.channel.DefaultFileRegion
-
- --initialize-at-run-time=io.netty.channel.kqueue.KQueueEventArray
-
- --initialize-at-run-time=io.netty.channel.kqueue.KQueueEventLoop
-
- --initialize-at-run-time=io.netty.channel.kqueue.Native
-
- --initialize-at-run-time=io.netty.channel.unix.Errors
-
- --initialize-at-run-time=io.netty.channel.unix.IovArray
-
- --initialize-at-run-time=io.netty.channel.unix.Limits
-
- --initialize-at-run-time=io.netty.util.internal.logging.Log4JLogger
-
- --initialize-at-run-time=io.netty.channel.unix.Socket
-
- --initialize-at-run-time=io.netty.channel.ChannelHandlerMask
-
-
-
- --report-unsupported-elements-at-runtime
-
- --allow-incomplete-classpath
-
- --enable-url-protocols=http
-
- -H:+ReportExceptionStackTraces
-
- </buildArgs>
-
- </configuration>
-
-</plugin>
+### 第四步:调整compiler、proxy、serialization和logger
+
+- 序列化方式目前支持的比较好的是Fastjson2
+- compiler、proxy目前只能选择jdk
+- logger目前需要配置slf4j,目前仅支持logback
+
+示例配置如下:
+
+```yaml
+dubbo:
+ application:
+ name: ${spring.application.name}
+ logger: slf4j
+ compiler: jdk
+ protocol:
+ name: dubbo
+ port: -1
+ serialization: fastjson2
+ registry:
+ id: zk-registry
+ address: zookeeper://127.0.0.1:2181
+ config-center:
+ address: zookeeper://127.0.0.1:2181
+ metadata-report:
+ address: zookeeper://127.0.0.1:2181
+ provider:
+ proxy: jdk
+ serialization: fastjson2
+ consumer:
+ proxy: jdk
+ serialization: fastjson2
```
-其中定义了生成的镜像名以及一些构建镜像的参数。
-
-- 挂载native-image-agent
+### 第五步:编译
-由于我们需要将一些反射、JNI等类先指定出来,我们需要先使用该agent以正常方式运行一遍生成这些类的json形式的信息。
+在项目根路径下执行以下编译命令:
-在启动参数中添加:
+- API方式直接执行
```
--agentlib:native-image-agent=config-output-dir=/tmp/config/,config-write-period-secs=300,config-write-initial-delay-secs=5
+ mvn clean install -P native -Dmaven.test.skip=true
```
-以正常方式启动,在项目的resources下建立文件夹META-INF.native-image,把在本地目录中生成的文件粘进去:
-
-
-(可能会有缺漏没有生成的类信息,需要根据编译或运行时的报错信息手动添加。)
+- 注解和xml方式(Springboot3集成的方式)
+```shell
+ mvn clean install -P native native:compile -Dmaven.test.skip=true
+```
+### 第六步:执行二进制文件即可
-**完成以上几步后就可以进行项目的编译了。**
\ No newline at end of file
+二进制文件在target/目录下,一般以工程名称为二进制包的名称,比如target/native-demo
\ No newline at end of file