blob: 7e953f31fdbb367f300be8312f8c1fa16011f1bf [file] [log] [blame]
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apache Dubbo – graalvm support</title><link>https://dubbo.apache.org/en/docs/v3.0/references/graalvm/</link><description>Recent content in graalvm support on Apache Dubbo</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://dubbo.apache.org/en/docs/v3.0/references/graalvm/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs:</title><link>https://dubbo.apache.org/en/docs/v3.0/references/graalvm/support-graalvm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/en/docs/v3.0/references/graalvm/support-graalvm/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>This document will show you how to access GraalVM with a dubbo project and how to compile the project to a binary executable using native-image.&lt;/p>
&lt;p>For more information about GraalVM, read &lt;a href="https://www.graalvm.org/docs/getting-started/container-images/">https://www.graalvm.org/docs/getting-started/container-images/&lt;/a>.&lt;/p>
&lt;h2 id="demo">Demo&lt;/h2>
&lt;p>Before compiling the dubbo project, make sure that we are programming based on the GraalVM environment.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Install GraalVM&lt;/p>
&lt;p>Visite the official website (&lt;a href="https://www.graalvm.org/">https://www.graalvm.org/&lt;/a> ) and install the latest version based on your system:&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/graalvmgw.jpg" alt="img">&lt;/p>
&lt;p>After installation, configure the path of JAVA_HOME. You should see thr following in your local jdk after this step:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/graalvm_env.jpg" alt="img">&lt;/p>
&lt;p>GraalVM we use here is based on jdk version 1.8.
To install native-image, run &amp;lsquo;gu install native-image&amp;rsquo;.&lt;/p>
&lt;ol start="2">
&lt;li>
&lt;p>Pull dubbo code and switch to branch &lt;a href="https://github.com/apache/dubbo">apache:3.0&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Manually generate SPI code&lt;/p>
&lt;p>Currently native-image compiling does not support dynamic code generation. Therefore we need to first manually generate the part of the code that is generated dynamically. The tool function is provided here:&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/code_generator.jpg" alt="img">&lt;/p>
&lt;p>Execute CodeGenerator can generate SPI code under the dubbo-native module.&lt;/p>
&lt;ol start="4">
&lt;li>
&lt;p>Execute &amp;lsquo;install&amp;rsquo; under the root directory&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cb4b16">MacdeMacBook&lt;/span>&lt;span style="color:#719e07">-&lt;/span>pro&lt;span style="color:#719e07">-&lt;/span>&lt;span style="color:#2aa198">3&lt;/span>&lt;span style="color:#2aa198">:incubator&lt;/span>&lt;span style="color:#719e07">-&lt;/span>dubbo mac$ pwd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#dc322f">/Users/m&lt;/span>ac&lt;span style="color:#719e07">/&lt;/span>&lt;span style="color:#cb4b16">Documents&lt;/span>&lt;span style="color:#719e07">/&lt;/span>&lt;span style="color:#cb4b16">Mi&lt;/span>&lt;span style="color:#719e07">/&lt;/span>project&lt;span style="color:#719e07">/&lt;/span>incubator&lt;span style="color:#719e07">-&lt;/span>dubbo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cb4b16">MacdeMacBook&lt;/span>&lt;span style="color:#719e07">-&lt;/span>pro&lt;span style="color:#719e07">-&lt;/span>&lt;span style="color:#2aa198">3&lt;/span>&lt;span style="color:#2aa198">:incubator&lt;/span>&lt;span style="color:#719e07">-&lt;/span>dubbo mac$ mvn clean package install &lt;span style="color:#719e07">-&lt;/span>&lt;span style="color:#cb4b16">Dmaven&lt;/span>&lt;span style="color:#719e07">.&lt;/span>test&lt;span style="color:#719e07">.&lt;/span>skip&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#719e07">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Compile the project demo&lt;/p>
&lt;p>Here we provide a demo project that can be directly compiled: dubbo-demo / dubbo-demo-native. After installation, first go to the provider in dubbo-demo-native and execute native-image compilation:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span> mvn clean &lt;span style="color:#719e07">package&lt;/span> -P &lt;span style="color:#268bd2">native&lt;/span> &lt;span style="color:#719e07">-&lt;/span>Dmaven&lt;span style="color:#719e07">.&lt;/span>test&lt;span style="color:#719e07">.&lt;/span>skip&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#cb4b16">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Since we have imported native-image plugin in maven, here we can use &amp;lsquo;-P native&amp;rsquo; to execute the plugin.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/native_image_build.jpg" alt="img">&lt;/p>
&lt;p>After a success compilation, we can find the generated binary file under target. Succefully iniate a zookeeper locally and execute the binary executable file should show us this:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/run_provider.jpg" alt="img">&lt;/p>
&lt;p>Compile on consumer&amp;rsquo; side will generate a binary executable file &amp;lsquo;demo-native-consumer&amp;rsquo; under consumer&amp;rsquo;s target. Execute the file will give us the following output:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/run_consumer.jpg" alt="img">&lt;/p>
&lt;h3 id="additional-steps">Additional Steps&lt;/h3>
&lt;p>In this demo, we did extra work to make sure the project can be compiled. Here are the additional steps:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Import dependency dubbo-native&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#268bd2">dependency&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#268bd2">groupId&lt;/span>&amp;gt;org.apache.dubbo&amp;lt;/&lt;span style="color:#268bd2">groupId&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#268bd2">artifactId&lt;/span>&amp;gt;dubbo-native&amp;lt;/&lt;span style="color:#268bd2">artifactId&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#268bd2">version&lt;/span>&amp;gt;${project.version}&amp;lt;/&lt;span style="color:#268bd2">version&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#268bd2">dependency&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Our generated SPI code is in this module.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Import native-image plug-in&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-Lua" data-lang="Lua">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">&amp;lt;&lt;/span>plugin&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>groupId&lt;span style="color:#719e07">&amp;gt;&lt;/span>org.graalvm.nativeimage&lt;span style="color:#719e07">&amp;lt;/&lt;/span>groupId&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>artifactId&lt;span style="color:#719e07">&amp;gt;&lt;/span>native&lt;span style="color:#719e07">-&lt;/span>image&lt;span style="color:#719e07">-&lt;/span>maven&lt;span style="color:#719e07">-&lt;/span>plugin&lt;span style="color:#719e07">&amp;lt;/&lt;/span>artifactId&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>version&lt;span style="color:#719e07">&amp;gt;&lt;/span>&lt;span style="color:#2aa198">21.0.0.2&lt;/span>&lt;span style="color:#719e07">&amp;lt;/&lt;/span>version&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>executions&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>execution&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>goals&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>goal&lt;span style="color:#719e07">&amp;gt;&lt;/span>native&lt;span style="color:#719e07">-&lt;/span>image&lt;span style="color:#719e07">&amp;lt;/&lt;/span>goal&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;/&lt;/span>goals&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>phase&lt;span style="color:#719e07">&amp;gt;&lt;/span>package&lt;span style="color:#719e07">&amp;lt;/&lt;/span>phase&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;/&lt;/span>execution&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;/&lt;/span>executions&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>configuration&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>skip&lt;span style="color:#719e07">&amp;gt;&lt;/span>&lt;span style="color:#cb4b16">false&lt;/span>&lt;span style="color:#719e07">&amp;lt;/&lt;/span>skip&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>imageName&lt;span style="color:#719e07">&amp;gt;&lt;/span>demo&lt;span style="color:#719e07">-&lt;/span>native&lt;span style="color:#719e07">-&lt;/span>provider&lt;span style="color:#719e07">&amp;lt;/&lt;/span>imageName&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>mainClass&lt;span style="color:#719e07">&amp;gt;&lt;/span>org.apache.dubbo.demo.graalvm.provider.Application&lt;span style="color:#719e07">&amp;lt;/&lt;/span>mainClass&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>buildArgs&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--no-fallback&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-build-time=org.slf4j.MDC&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-build-time=org.slf4j.LoggerFactory&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-build-time=org.slf4j.impl.StaticLoggerBinder&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-build-time=org.apache.log4j.helpers.Loader&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-build-time=org.apache.log4j.Logger&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-build-time=org.apache.log4j.helpers.LogLog&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-build-time=org.apache.log4j.LogManager&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-build-time=org.apache.log4j.spi.LoggingEvent&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-build-time=org.slf4j.impl.Log4jLoggerFactory&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-build-time=org.slf4j.impl.Log4jLoggerAdapter&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-build-time=org.eclipse.collections.api.factory.Sets&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.epoll.Epoll&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.epoll.Native&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.epoll.EpollEventLoop&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.epoll.EpollEventArray&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.DefaultFileRegion&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.kqueue.KQueueEventArray&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.kqueue.KQueueEventLoop&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.kqueue.Native&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.unix.Errors&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.unix.IovArray&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.unix.Limits&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.util.internal.logging.Log4JLogger&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.unix.Socket&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--initialize-at-run-time=io.netty.channel.ChannelHandlerMask&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--report-unsupported-elements-at-runtime&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--allow-incomplete-classpath&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">--enable-url-protocols=http&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">-&lt;/span>H:&lt;span style="color:#719e07">+&lt;/span>ReportExceptionStackTraces
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;/&lt;/span>buildArgs&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">&amp;lt;/&lt;/span>configuration&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">&amp;lt;/&lt;/span>plugin&lt;span style="color:#719e07">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Generated image names and parameters used for generating image are defined.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Mount native-image-agent&lt;/p>
&lt;p>Since some classes, including reflection and JNI, need to be assigned, we have to use the agent to run the json information that generate these classes.&lt;/p>
&lt;p>Add the following to startup parameters:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-xml" data-lang="xml">&lt;span style="display:flex;">&lt;span>-agentlib:native-image-agent=config-output-dir=/tmp/config/,config-write-period-secs=300,config-write-initial-delay-secs=5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Launch in conventional way, create folder &amp;lsquo;META-INF.native-image&amp;rsquo; under the resources folder and paste the generated files in the local directory into the folder.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/resources.jpg" alt="img">&lt;/p>
&lt;p>(Missing classes&amp;rsquo; information may exist. These information need to be manually added according to the error message reported while compiling or running.)&lt;/p>
&lt;p>&lt;strong>Finished the steps above, now you can compile your project.&lt;/strong>&lt;/p></description></item></channel></rss>