| <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apache Dubbo – 参考手册</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/</link><description>Recent content in 参考手册 on Apache Dubbo</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><atom:link href="https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/index.xml" rel="self" type="application/rss+xml"/><item><title>Overview: 配置手册</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config/</guid><description/></item><item><title>Overview: 源码架构</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/architecture/</guid><description/></item><item><title>Overview: QOS 操作手册</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/qos/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/qos/</guid><description/></item><item><title>Overview: RPC 协议</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/</guid><description/></item><item><title>Overview: 配置中心</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config-center/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config-center/</guid><description> |
| <p>配置中心 (config-center) 在 Dubbo 中可承担两类职责:</p> |
| <ol> |
| <li><a href="../config/principle/#33-%E5%A4%96%E9%83%A8%E5%8C%96%E9%85%8D%E7%BD%AE">外部化配置</a>:启动配置的集中式存储 (简单理解为 dubbo.properties 的外部化存储)。</li> |
| <li>流量治理规则存储</li> |
| </ol> |
| <p>请参考具体扩展实现了解如何启用配置中心。</p> |
| <p>值得注意的是 Dubbo 动态配置中心定义了两个不同层次的隔离选项,分别是 namespace 和 group。</p> |
| <ul> |
| <li>namespace - 配置命名空间,默认值 <code>dubbo</code>。命名空间通常用于多租户隔离,即对不同用户、不同环境或完全不关联的一系列配置进行逻辑隔离,区别于物理隔离的点是不同的命名空间使用的还是同一物理集群。</li> |
| <li>group - 配置分组,默认值 <code>dubbo</code>。<code>group</code> 通常用于归类一组相同类型/目的的配置项,是对 <code>namespace</code> 下配置项的进一步隔离。</li> |
| </ul> |
| <p>参考 <a href="../config/properties/#config-center">配置说明 - 配置项手册</a> 了解 namespace 和 group 之外 config-center 开放的更多配置项。</p> |
| <blockquote> |
| <p>为了兼容 2.6.x 版本配置,在使用 Zookeeper 作为注册中心,且没有显式配置配置中心的情况下,Dubbo 框架会默认将此 Zookeeper 用作配置中心,但将只作服务治理用途。</p> |
| </blockquote></description></item><item><title>Overview: 元数据中心</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/metadata-center/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/metadata-center/</guid><description/></item><item><title>Overview: 注册中心</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/registry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/registry/</guid><description/></item><item><title>Overview: Mesh手册</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/mesh/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/mesh/</guid><description/></item><item><title>Overview: 性能参考手册</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/performance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/performance/</guid><description/></item><item><title>Overview: Dubbo 集成 Graalvm参考手册</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/graalvm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/graalvm/</guid><description> |
| <p>dubbo3.0支持native-image文档</p> |
| <h2 id="概述">概述</h2> |
| <p>本文档将介绍将dubbo3.0项目接入GraalVM,进行native-image编译为二进制的流程。</p> |
| <p>关于GraalVm的更多信息可以阅读 <a href="https://www.graalvm.org/docs/getting-started/container-images/">https://www.graalvm.org/docs/getting-started/container-images/</a> 此文档。</p> |
| <h2 id="使用样例">使用样例</h2> |
| <p>在编译我们的dubbo项目之前,需要确保我们正基于graalVm的环境。</p> |
| <ol> |
| <li>安装GraalVM</li> |
| </ol> |
| <p>进入https://www.graalvm.org/ 官网根据自己的系统选取最新版本安装:</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/graalvmgw.jpg" alt="img"></p> |
| <p>安装完成后,修改配置JAVA_HOME的路径,生效后查看本地jdk可以看到如下:</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/graalvm_env.jpg" alt="img"> |
| 这里我们使用的基于jdk1.8版本的GraalVM。</p> |
| <ul> |
| <li>安装native-image,只需执行gu install native-image即可。</li> |
| </ul> |
| <ol> |
| <li>拉取dubbo代码,切换到<a href="https://github.com/apache/dubbo">apache:3.0</a>分支。</li> |
| <li>手动执行生成SPI代码。</li> |
| </ol> |
| <p>由于目前编译native-image不支持代码动态生成编译,所以有关代码动态生成的部分需要我们手动先生成,这里提供了工具函数:</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/code_generator.jpg" alt="img"> |
| 执行CodeGenerator即可在dubbo-native模块下生成SPI代码。</p> |
| <ol> |
| <li>在根目录下执行install</li> |
| </ol> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span>MacdeMacBook<span style="color:#719e07">-</span>pro<span style="color:#719e07">-</span><span style="color:#2aa198">3</span>:incubator<span style="color:#719e07">-</span>dubbo mac$ pwd |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">/</span>Users<span style="color:#719e07">/</span>mac<span style="color:#719e07">/</span>Documents<span style="color:#719e07">/</span>Mi<span style="color:#719e07">/</span>project<span style="color:#719e07">/</span>incubator<span style="color:#719e07">-</span>dubbo |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>MacdeMacBook<span style="color:#719e07">-</span>pro<span style="color:#719e07">-</span><span style="color:#2aa198">3</span>:incubator<span style="color:#719e07">-</span>dubbo mac$ mvn clean <span style="color:#719e07">package</span> install <span style="color:#719e07">-</span>Dmaven.test.skip=<span style="color:#cb4b16">true</span> |
| </span></span></code></pre></div><ol> |
| <li>编译demo项目</li> |
| </ol> |
| <p>这里我们提供了可直接进行编译的示例项目,dubbo-demo/dubbo-demo-native。上面步骤install完成后,先到dubbo-demo-native的provider下,执行native-image编译:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span> mvn clean <span style="color:#719e07">package</span> <span style="color:#719e07">-</span>P native <span style="color:#719e07">-</span>Dmaven.test.skip=<span style="color:#cb4b16">true</span> |
| </span></span></code></pre></div><p>这里由于我们在maven中引入了native-image插件,所以直接-P native即可执行该插件。</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/native_image_build.jpg" alt="img"> |
| 编译成功后可以在target下看到已经生成的二进制文件,本地启动一个zookeeper,直接执行该二进制,可见启动成功如下:</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/run_provider.jpg" alt="img"> |
| consumer端同样执行编译,在consumer的target下也会生成二进制文件:demo-native-consumer,执行该二进制可以看到调用结果如下:</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/run_consumer.jpg" alt="img"></p> |
| <h3 id="具体步骤">具体步骤</h3> |
| <p>实际上在这个demo下我们做了一些工作来确保项目可以编译执行,主要有以下几个步骤</p> |
| <ul> |
| <li>引入dubbo-native依赖</li> |
| </ul> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&lt;dependency&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;groupId&gt;org.apache.dubbo&lt;/groupId&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;artifactId&gt;dubbo-native&lt;/artifactId&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;version&gt;${project.version}&lt;/version&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>&lt;/dependency&gt; |
| </span></span></code></pre></div><p>该模块下有我们生成的SPI代码。</p> |
| <ul> |
| <li>引入native-image插件</li> |
| </ul> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&lt;plugin&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;groupId&gt;org.graalvm.nativeimage&lt;/groupId&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;artifactId&gt;native-image-maven-plugin&lt;/artifactId&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;version&gt;21.0.0.2&lt;/version&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;executions&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;execution&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;goals&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;goal&gt;native-image&lt;/goal&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;/goals&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;phase&gt;package&lt;/phase&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;/execution&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;/executions&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;configuration&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;skip&gt;false&lt;/skip&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;imageName&gt;demo-native-provider&lt;/imageName&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;mainClass&gt;org.apache.dubbo.demo.graalvm.provider.Application&lt;/mainClass&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;buildArgs&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --no-fallback |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-build-time=org.slf4j.MDC |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-build-time=org.slf4j.LoggerFactory |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-build-time=org.slf4j.impl.StaticLoggerBinder |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-build-time=org.apache.log4j.helpers.Loader |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-build-time=org.apache.log4j.Logger |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-build-time=org.apache.log4j.helpers.LogLog |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-build-time=org.apache.log4j.LogManager |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-build-time=org.apache.log4j.spi.LoggingEvent |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-build-time=org.slf4j.impl.Log4jLoggerFactory |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-build-time=org.slf4j.impl.Log4jLoggerAdapter |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-build-time=org.eclipse.collections.api.factory.Sets |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.epoll.Epoll |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.epoll.Native |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.epoll.EpollEventLoop |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.epoll.EpollEventArray |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.DefaultFileRegion |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.kqueue.KQueueEventArray |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.kqueue.KQueueEventLoop |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.kqueue.Native |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.unix.Errors |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.unix.IovArray |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.unix.Limits |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.util.internal.logging.Log4JLogger |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.unix.Socket |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --initialize-at-run-time=io.netty.channel.ChannelHandlerMask |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --report-unsupported-elements-at-runtime |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --allow-incomplete-classpath |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> --enable-url-protocols=http |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> -H:+ReportExceptionStackTraces |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;/buildArgs&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> &lt;/configuration&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>&lt;/plugin&gt; |
| </span></span></code></pre></div><p>其中定义了生成的镜像名以及一些构建镜像的参数。</p> |
| <ul> |
| <li>挂载native-image-agent</li> |
| </ul> |
| <p>由于我们需要将一些反射、JNI等类先指定出来,我们需要先使用该agent以正常方式运行一遍生成这些类的json形式的信息。</p> |
| <p>在启动参数中添加:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>-agentlib:native-image-agent=config-output-dir=/tmp/config/,config-write-period-secs=300,config-write-initial-delay-secs=5 |
| </span></span></code></pre></div><p>以正常方式启动,在项目的resources下建立文件夹META-INF.native-image,把在本地目录中生成的文件粘进去:</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/dubbo3.0-graalvm-support/resources.jpg" alt="img"> |
| (可能会有缺漏没有生成的类信息,需要根据编译或运行时的报错信息手动添加。)</p> |
| <p><strong>完成以上几步后就可以进行项目的编译了。</strong></p></description></item><item><title>Overview: SPI 扩展使用手册</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/spi/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/spi/</guid><description/></item><item><title>Overview: 序列化</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/serialization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/serialization/</guid><description/></item></channel></rss> |