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/ 官网根据自己的系统选取最新版本安装:
-
-![img](/imgs/blog/dubbo3.0-graalvm-support/graalvmgw.jpg)
-
-安装完成后,修改配置 JAVA_HOME 的路径,生效后查看本地 jdk 可以看到如下:
-
-![img](/imgs/blog/dubbo3.0-graalvm-support/graalvm_env.jpg)
-这里我们使用的基于jdk1.8版本的GraalVM。
-
-- 安装native-image,只需执行gu install native-image即可。
-
-1. 拉取dubbo代码,切换到[apache:3.0](https://github.com/apache/dubbo)分支。
-2. 手动执行生成SPI代码。
-
-由于目前编译native-image不支持代码动态生成编译,所以有关代码动态生成的部分需要我们手动先生成,这里提供了工具函数:
-
-![img](/imgs/blog/dubbo3.0-graalvm-support/code_generator.jpg)
-执行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即可执行该插件。
-
-![img](/imgs/blog/dubbo3.0-graalvm-support/native_image_build.jpg)
-编译成功后可以在target下看到已经生成的二进制文件,本地启动一个zookeeper,直接执行该二进制,可见启动成功如下:
 
-![img](/imgs/blog/dubbo3.0-graalvm-support/run_provider.jpg)
-consumer端同样执行编译,在consumer的target下也会生成二进制文件:demo-native-consumer,执行该二进制可以看到调用结果如下:
 
-![img](/imgs/blog/dubbo3.0-graalvm-support/run_consumer.jpg)
-### 具体步骤
+### 第三步:在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,把在本地目录中生成的文件粘进去:
-
-![img](/imgs/blog/dubbo3.0-graalvm-support/resources.jpg)
-(可能会有缺漏没有生成的类信息,需要根据编译或运行时的报错信息手动添加。)
+- 注解和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

Reply via email to