This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch cn-site
in repository https://gitbox.apache.org/repos/asf/dubbo-website.git


The following commit(s) were added to refs/heads/cn-site by this push:
     new 961a534d9f deploy: d16a1c5aa0bb7ade04fcc45eb55b5b04c8f2082a
961a534d9f is described below

commit 961a534d9fafff9255a59e4c93f492a94f3113a4
Author: chickenlj <[email protected]>
AuthorDate: Wed Mar 8 08:37:52 2023 +0000

    deploy: d16a1c5aa0bb7ade04fcc45eb55b5b04c8f2082a
---
 ...ubbo-samples-extensibility-protocol-output1.png | Bin 0 -> 2529283 bytes
 ...ubbo-samples-extensibility-protocol-output2.jpg | Bin 0 -> 1168285 bytes
 sitemap.xml                                        |   2 +-
 zh-cn/overview/tasks/extensibility/index.xml       | 215 ++++++++++++++++++++-
 .../tasks/extensibility/protocol/index.html        | 173 ++++++++++++++++-
 zh-cn/sitemap.xml                                  |   2 +-
 6 files changed, 385 insertions(+), 7 deletions(-)

diff --git 
a/imgs/v3/tasks/extensibility/dubbo-samples-extensibility-protocol-output1.png 
b/imgs/v3/tasks/extensibility/dubbo-samples-extensibility-protocol-output1.png
new file mode 100644
index 0000000000..7f42604bde
Binary files /dev/null and 
b/imgs/v3/tasks/extensibility/dubbo-samples-extensibility-protocol-output1.png 
differ
diff --git 
a/imgs/v3/tasks/extensibility/dubbo-samples-extensibility-protocol-output2.jpg 
b/imgs/v3/tasks/extensibility/dubbo-samples-extensibility-protocol-output2.jpg
new file mode 100644
index 0000000000..8380bcd466
Binary files /dev/null and 
b/imgs/v3/tasks/extensibility/dubbo-samples-extensibility-protocol-output2.jpg 
differ
diff --git a/sitemap.xml b/sitemap.xml
index 7a84891bf3..2af492a953 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?><sitemapindex 
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9";><sitemap><loc>https://cn.dubbo.apache.org/zh-cn/sitemap.xml</loc><lastmod>2023-03-08T16:33:51+08:00</lastmod></sitemap><sitemap><loc>https://cn.dubbo.apache.org/en/sitemap.xml</loc><lastmod>2023-03-03T06:59:49+08:00</lastmod></sitemap></sitemapindex>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8" standalone="yes"?><sitemapindex 
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9";><sitemap><loc>https://cn.dubbo.apache.org/zh-cn/sitemap.xml</loc><lastmod>2023-03-08T16:34:37+08:00</lastmod></sitemap><sitemap><loc>https://cn.dubbo.apache.org/en/sitemap.xml</loc><lastmod>2023-03-03T06:59:49+08:00</lastmod></sitemap></sitemapindex>
\ No newline at end of file
diff --git a/zh-cn/overview/tasks/extensibility/index.xml 
b/zh-cn/overview/tasks/extensibility/index.xml
index bd80c8adcc..9cfb841122 100644
--- a/zh-cn/overview/tasks/extensibility/index.xml
+++ b/zh-cn/overview/tasks/extensibility/index.xml
@@ -123,7 +123,220 @@
 &lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.provider.filter&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">appended&lt;/span>
 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="运行结果">运行结果&lt;/h2>
 &lt;p>以&lt;strong>使用本地IDE&lt;/strong>的方式来运行任务,结果如下:&lt;/p>
-&lt;p>&lt;img 
src="https://cn.dubbo.apache.org/imgs/v3/tasks/extensibility/dubbo-samples-extensibility-filter-output.jpg";
 
alt="dubbo-samples-extensibility-filter-output.jpg">&lt;/p></description></item><item><title>Overview:
 
Protocol</title><link>https://cn.dubbo.apache.org/zh-cn/overview/tasks/extensibility/protocol/</link><pubDate>Mon,
 01 Jan 0001 00:00:00 
+0000</pubDate><guid>https://cn.dubbo.apache.org/zh-cn/overview/tasks/extensibility/protocol/</guid><description/></item><item><tit
 [...]
+&lt;p>&lt;img 
src="https://cn.dubbo.apache.org/imgs/v3/tasks/extensibility/dubbo-samples-extensibility-filter-output.jpg";
 
alt="dubbo-samples-extensibility-filter-output.jpg">&lt;/p></description></item><item><title>Overview:
 
Protocol</title><link>https://cn.dubbo.apache.org/zh-cn/overview/tasks/extensibility/protocol/</link><pubDate>Mon,
 01 Jan 0001 00:00:00 
+0000</pubDate><guid>https://cn.dubbo.apache.org/zh-cn/overview/tasks/extensibility/protocol/</guid><description>
+&lt;p>Dubbo 
通过协议扩展实现了很多内置的功能,同时也支持很多常用的协议。所有的自定义协议在&lt;code>org.apache.dubbo.rpc.Protocol&lt;/code>文件中可以看到,以Dubbo
 3为例,具体如下:&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-properties" data-lang="properties">&lt;span 
style="display:flex;">&lt;span>&lt;span style="color:#586e75"># 
Dubbo通过协议扩展实现的内置功能&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>filter&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.rpc.cluster.filter.ProtocolFilterWrapper&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>qos&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.qos.protocol.QosProtocolWrapper&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>registry&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>service-discovery-registry&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.registry.integration.RegistryProtocol&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>listener&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.rpc.protocol.ProtocolListenerWrapper&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mock&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.rpc.support.MockProtocol&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>serializationwrapper&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.rpc.protocol.ProtocolSerializationWrapper&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>securitywrapper&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.rpc.protocol.ProtocolSecurityWrapper&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"># Dubbo对外支持的常用协议&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dubbo&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>injvm&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rest&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.rpc.protocol.rest.RestProtocol&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>grpc&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.rpc.protocol.grpc.GrpcProtocol&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tri&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.rpc.protocol.tri.TripleProtocol&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>我们可以看到,在Dubbo中通过协议扩展的能力实现了过滤、监控数据采集、服务发现、监听器、mock、序列化、安全等一系列能力,同时对外提供了&lt;code>dubbo&lt;/code>,&lt;code>injvm&lt;/code>,&lt;code>rest&lt;/code>,&lt;code>grpc&lt;/code>和&lt;code>tri&lt;/code>协议。&lt;/p>
+&lt;p>自定义一套私有协议有两种方式,第一种是对原有的协议进行包装,添加一些特定的业务逻辑。另外一种是完全自定义一套协议。前者实现简单,在&lt;code>dubbo&lt;/code>中也是有广泛的使用,比如:&lt;code>ProtocolFilterWrapper&lt;/code>,
 &lt;code>QosProtocolWrapper&lt;/code>, 
&lt;code>ProtocolListenerWrapper&lt;/code>等。后者实现复杂,一般常见的协议&lt;code>dubbo&lt;/code>都实现了,并且通过了大量生产实践的验证。&lt;/p>
+&lt;p>本文会通过示例演示如何通过现有协议实现一套自定义协议。&lt;/p>
+&lt;h2 id="开始之前">开始之前&lt;/h2>
+&lt;p>有两种部署运行方式,二选一&lt;/p>
+&lt;h3 id="基于kubernetes">基于Kubernetes&lt;/h3>
+&lt;ul>
+&lt;li>安装&lt;a 
href="https://kubernetes.io/docs/tasks/tools/";>Kubernetes&lt;/a>环境&lt;/li>
+&lt;li>修改&lt;a 
href="https://github.com/apache/dubbo-samples/blob/master/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-protocol-provider/src/main/resources/application.properties";>Provider&lt;/a>中的配置文件,启用Kubernetes中部署的nacos的地址
+&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-properties" data-lang="properties">&lt;span 
style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Specify the 
application name of Dubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.application.name&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">extensibility-protocol-provider&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"># Enable token verification for each invocation&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.provider.token&lt;span 
style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">true&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"># Specify the registry address&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#586e75"># 
dubbo.registry.address=nacos://localhost:8848?username=nacos&amp;amp;password=nacos&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.registry.address&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">nacos://${nacos.address:localhost}:8848?username=nacos&amp;amp;password=nacos&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"># 自定义协议edubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.provider.protocol&lt;span 
style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">edubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;li>修改&lt;a 
href="https://github.com/apache/dubbo-samples/blob/master/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-protocol-consumer/src/main/resources/application.properties";>Consumer&lt;/a>中的配置文件,启用Kubernetes中部署的nacos的地址
+&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-properties" data-lang="properties">&lt;span 
style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Specify the 
application name of Dubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.application.name&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">extensibility-protocol-consumer&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"># Enable token verification for each invocation&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.provider.token&lt;span 
style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">true&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"># Specify the registry address&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#586e75"># 
dubbo.registry.address=nacos://localhost:8848?username=nacos&amp;amp;password=nacos&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.registry.address&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">nacos://${nacos.address:localhost}:8848?username=nacos&amp;amp;password=nacos&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"># 自定义协议edubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.consumer.protocol&lt;span 
style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">edubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;li>部署&lt;code>[Extensibility Protocol 
Task](https://github.com/apache/dubbo-samples/blob/master/10-task/dubbo-samples-extensibility/deploy/All.yml)&lt;/code>&lt;/li>
+&lt;/ul>
+&lt;h3 id="使用本地ide">使用本地IDE&lt;/h3>
+&lt;ul>
+&lt;li>部署&lt;a 
href="https://nacos.io/zh-cn/docs/quick-start.html";>Nacos&lt;/a>2.2.0版本&lt;/li>
+&lt;li>修改&lt;a 
href="https://github.com/apache/dubbo-samples/blob/master/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-protocol-provider/src/main/resources/application.properties";>Provider&lt;/a>中的配置文件,启用本地nacos的地址
+&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-properties" data-lang="properties">&lt;span 
style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Specify the 
application name of Dubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.application.name&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">extensibility-protocol-provider&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"># Enable token verification for each invocation&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.provider.token&lt;span 
style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">true&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"># Specify the registry address&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#586e75"># 启用本地nacos的地址&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.registry.address&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">nacos://localhost:8848?username=nacos&amp;amp;password=nacos&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#586e75"># 
dubbo.registry.address=nacos://${nacos.address:localhost}:8848?username=nacos&amp;amp;password=nacos&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"># 自定义协议edubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.provider.protocol&lt;span 
style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">edubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;li>修改&lt;a 
href="https://github.com/apache/dubbo-samples/blob/master/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-protocol-consumer/src/main/resources/application.properties";>Consumer&lt;/a>中的配置文件,启用本地nacos的地址
+&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-properties" data-lang="properties">&lt;span 
style="display:flex;">&lt;span>&lt;span style="color:#586e75"># Specify the 
application name of Dubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.application.name&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">extensibility-protocol-consumer&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"># Enable token verification for each invocation&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.provider.token&lt;span 
style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">true&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"># Specify the registry address&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#586e75"># 启用本地nacos的地址&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.registry.address&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">nacos://localhost:8848?username=nacos&amp;amp;password=nacos&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#586e75"># 
dubbo.registry.address=nacos://${nacos.address:localhost}:8848?username=nacos&amp;amp;password=nacos&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"># 自定义协议edubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.consumer.protocol&lt;span 
style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">edubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;/ul>
+&lt;h2 id="任务详情">任务详情&lt;/h2>
+&lt;p>基于现有的&lt;code>dubbo&lt;/code>协议来实现自定义协议&lt;code>edubbo&lt;/code>。&lt;/p>
+&lt;h2 id="实现方式">实现方式&lt;/h2>
+&lt;p>通过对&lt;code>dubbo&lt;/code>协议进行包装来实现&lt;code>edubbo&lt;/code>协议。&lt;/p>
+&lt;h4 id="代码结构">代码结构&lt;/h4>
+&lt;h5 id="common">Common&lt;/h5>
+&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-properties" data-lang="properties">&lt;span 
style="display:flex;">&lt;span>src
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-main
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-java
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-org
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-apache
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-dubbo
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-samples
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-extensibility
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-protocol
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-common
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
|-EnhancedProtocol.java &lt;span style="color:#2aa198">(实现Protocol接口)&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 
id="provider">Provider&lt;/h5>
+&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-properties" data-lang="properties">&lt;span 
style="display:flex;">&lt;span>src
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-main
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-java
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-org
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-apache
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-dubbo
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-samples
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-extensibility
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-protocol
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-provider
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
|-ExtensibilityProtocolProviderApplication.java
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
|-ExtensibilityProtocolServiceImpl.java
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-resources
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-META-INF
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
|-application.properties &lt;span style="color:#2aa198">(Dubbo 
Provider配置文件)&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-dubbo
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
|-org.apache.dubbo.rpc.Protocol &lt;span style="color:#2aa198">(纯文本文件)&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 
id="consumer">Consumer&lt;/h5>
+&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-properties" data-lang="properties">&lt;span 
style="display:flex;">&lt;span>src
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-main
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-java
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-org
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-apache
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-dubbo
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-samples
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-extensibility
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-protocol
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-consumer
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
|-ExtensibilityProtocolConsumerApplication.java
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
|-ExtensibilityProtocolConsumerTask.java
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-resources
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-META-INF
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
|-application.properties &lt;span style="color:#2aa198">(Dubbo 
Consumer配置文件)&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> |-dubbo
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
|-org.apache.dubbo.rpc.Protocol &lt;span style="color:#2aa198">(纯文本文件)&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="代码详情">代码详情&lt;/h4>
+&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>&lt;span style="color:#719e07">package&lt;/span> 
org.apache.dubbo.samples.extensibility.protocol.common&lt;span 
style="color:#719e07">;&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:#719e07">import&lt;/span> org.apache.dubbo.common.URL&lt;span 
style="color:#719e07">;&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#719e07">import&lt;/span> org.apache.dubbo.rpc.Protocol&lt;span 
style="color:#719e07">;&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#719e07">import&lt;/span> org.apache.dubbo.rpc.Invoker&lt;span 
style="color:#719e07">;&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#719e07">import&lt;/span> org.apache.dubbo.rpc.Exporter&lt;span 
style="color:#719e07">;&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#719e07">import&lt;/span> 
org.apache.dubbo.rpc.ProtocolServer&lt;span style="color:#719e07">;&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#719e07">import&lt;/span> 
org.apache.dubbo.rpc.RpcException&lt;span style="color:#719e07">;&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#719e07">import&lt;/span> 
org.apache.dubbo.rpc.model.FrameworkModel&lt;span 
style="color:#719e07">;&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#719e07">import&lt;/span> 
org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol&lt;span 
style="color:#719e07">;&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:#719e07">import&lt;/span> java.util.List&lt;span 
style="color:#719e07">;&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:#268bd2">public&lt;/span> &lt;span 
style="color:#268bd2">class&lt;/span> &lt;span 
style="color:#268bd2">EnhancedProtocol&lt;/span> &lt;span 
style="color:#268bd2">implements&lt;/span> Protocol &lt;span 
style="color:#719e07">{&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:#268bd2">public&lt;/span> &lt;span 
style="color:#268bd2">EnhancedProtocol&lt;/span>&lt;span 
style="color:#719e07">(&lt;/span>FrameworkModel frameworkModel&lt;span 
style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#719e07">this&lt;/span>&lt;span 
style="color:#719e07">.&lt;/span>protocol &lt;span 
style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> 
DubboProtocol&lt;span style="color:#719e07">(&lt;/span>frameworkModel&lt;span 
style="color:#719e07">);&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#719e07">}&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:#268bd2">private&lt;/span> &lt;span 
style="color:#268bd2">final&lt;/span> Protocol protocol&lt;span 
style="color:#719e07">;&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:#268bd2">@Override&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#268bd2">public&lt;/span> &lt;span 
style="color:#dc322f">int&lt;/span> &lt;span 
style="color:#268bd2">getDefaultPort&lt;/span>&lt;span 
style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#719e07">return&lt;/span> &lt;span 
style="color:#719e07">this&lt;/span>&lt;span 
style="color:#719e07">.&lt;/span>protocol&lt;span 
style="color:#719e07">.&lt;/span>getDefaultPort&lt;span 
style="color:#719e07">();&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#719e07">}&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:#268bd2">@Override&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#268bd2">public&lt;/span> &lt;span 
style="color:#719e07">&amp;lt;&lt;/span>T&lt;span 
style="color:#719e07">&amp;gt;&lt;/span> Exporter&lt;span 
style="color:#719e07">&amp;lt;&lt;/span>T&lt;span 
style="color:#719e07">&amp;gt;&lt;/span> &lt;span 
style="color:#268bd2">export&lt;/span>&lt;span 
style="color:#719e07">(&lt;/span>Invoker&lt;span 
style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07 [...]
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#586e75">// do something
+&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#586e75">&lt;/span> &lt;span 
style="color:#719e07">return&lt;/span> &lt;span 
style="color:#719e07">this&lt;/span>&lt;span 
style="color:#719e07">.&lt;/span>protocol&lt;span 
style="color:#719e07">.&lt;/span>export&lt;span 
style="color:#719e07">(&lt;/span>invoker&lt;span 
style="color:#719e07">);&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#719e07">}&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:#268bd2">@Override&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#268bd2">public&lt;/span> &lt;span 
style="color:#719e07">&amp;lt;&lt;/span>T&lt;span 
style="color:#719e07">&amp;gt;&lt;/span> Invoker&lt;span 
style="color:#719e07">&amp;lt;&lt;/span>T&lt;span 
style="color:#719e07">&amp;gt;&lt;/span> &lt;span 
style="color:#268bd2">refer&lt;/span>&lt;span 
style="color:#719e07">(&lt;/span>Class&lt;span 
style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&a [...]
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#586e75">// do something
+&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#586e75">&lt;/span> &lt;span 
style="color:#719e07">return&lt;/span> &lt;span 
style="color:#719e07">this&lt;/span>&lt;span 
style="color:#719e07">.&lt;/span>protocol&lt;span 
style="color:#719e07">.&lt;/span>refer&lt;span 
style="color:#719e07">(&lt;/span>type&lt;span style="color:#719e07">,&lt;/span> 
url&lt;span style="color:#719e07">);&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#719e07">}&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:#268bd2">@Override&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#268bd2">public&lt;/span> &lt;span 
style="color:#dc322f">void&lt;/span> &lt;span 
style="color:#268bd2">destroy&lt;/span>&lt;span 
style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#719e07">this&lt;/span>&lt;span 
style="color:#719e07">.&lt;/span>protocol&lt;span 
style="color:#719e07">.&lt;/span>destroy&lt;span 
style="color:#719e07">();&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#719e07">}&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:#268bd2">@Override&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#268bd2">public&lt;/span> List&lt;span 
style="color:#719e07">&amp;lt;&lt;/span>ProtocolServer&lt;span 
style="color:#719e07">&amp;gt;&lt;/span> &lt;span 
style="color:#268bd2">getServers&lt;/span>&lt;span 
style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#719e07">return&lt;/span> protocol&lt;span 
style="color:#719e07">.&lt;/span>getServers&lt;span 
style="color:#719e07">();&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span 
style="color:#719e07">}&lt;/span>
+&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span 
style="color:#719e07">}&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="spi配置">SPI配置&lt;/h4>
+&lt;h5 id="provider-1">Provider&lt;/h5>
+&lt;p>在&lt;code>resources/META-INF/dubbo/org.apache.dubbo.rpc.Protocol&lt;/code>文件中添加如下配置:&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-properties" data-lang="properties">&lt;span 
style="display:flex;">&lt;span>edubbo&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.samples.extensibility.protocol.common.EnhancedProtocol&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 
id="consumer-1">Consumer&lt;/h5>
+&lt;p>在&lt;code>resources/META-INF/dubbo/org.apache.dubbo.rpc.Protocol&lt;/code>文件中添加如下配置:&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-properties" data-lang="properties">&lt;span 
style="display:flex;">&lt;span>edubbo&lt;span 
style="color:#719e07">=&lt;/span>&lt;span 
style="color:#2aa198">org.apache.dubbo.samples.extensibility.protocol.common.EnhancedProtocol&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="配置文件">配置文件&lt;/h4>
+&lt;h5 id="provider-2">Provider&lt;/h5>
+&lt;p>在&lt;code>resources/application.properties&lt;/code>文件中添加如下配置:&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-properties" data-lang="properties">&lt;span 
style="display:flex;">&lt;span>&lt;span style="color:#586e75"># 自定义协议&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.provider.protocol&lt;span 
style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">edubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 
id="consumer-2">Consumer&lt;/h5>
+&lt;p>在&lt;code>resources/application.properties&lt;/code>文件中添加如下配置:&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-properties" data-lang="properties">&lt;span 
style="display:flex;">&lt;span>&lt;span style="color:#586e75"># 自定义协议&lt;/span>
+&lt;/span>&lt;/span>&lt;span 
style="display:flex;">&lt;span>dubbo.consumer.protocol&lt;span 
style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">edubbo&lt;/span>
+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="运行结果">运行结果&lt;/h2>
+&lt;p>以&lt;strong>使用本地IDE&lt;/strong>的方式来运行任务,结果如下:&lt;/p>
+&lt;h4 id="注册协议">注册协议&lt;/h4>
+&lt;p>&lt;img 
src="https://cn.dubbo.apache.org/imgs/v3/tasks/extensibility/dubbo-samples-extensibility-protocol-output2.jpg";
 alt="dubbo-samples-extensibility-protocol-output2.jpg">&lt;/p>
+&lt;h4 id="输出结果">输出结果&lt;/h4>
+&lt;p>&lt;img 
src="https://cn.dubbo.apache.org/imgs/v3/tasks/extensibility/dubbo-samples-extensibility-protocol-output1.png";
 
alt="dubbo-samples-extensibility-protocol-output1.png">&lt;/p></description></item><item><title>Overview:
 
Registry</title><link>https://cn.dubbo.apache.org/zh-cn/overview/tasks/extensibility/registry/</link><pubDate>Mon,
 01 Jan 0001 00:00:00 
+0000</pubDate><guid>https://cn.dubbo.apache.org/zh-cn/overview/tasks/extensibility/registry/</guid><description/></item><ite
 [...]
 &lt;p>通过自定义路由,可以根据业务场景的特点来实现特定的路由方式。&lt;/p>
 &lt;h2 id="开始之前">开始之前&lt;/h2>
 &lt;p>有两种部署运行方式,二选一&lt;/p>
diff --git a/zh-cn/overview/tasks/extensibility/protocol/index.html 
b/zh-cn/overview/tasks/extensibility/protocol/index.html
index 6766bfc7ce..a22e2ecd82 100644
--- a/zh-cn/overview/tasks/extensibility/protocol/index.html
+++ b/zh-cn/overview/tasks/extensibility/protocol/index.html
@@ -1,4 +1,4 @@
-<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS 
content="INDEX, FOLLOW"><link rel=canonical 
href=https://cn.dubbo.apache.org/zh-cn/overview/tasks/extensibility/protocol/><script>var
 _hmt=_hmt||[];(function(){var 
e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e.parentNode.insertBefore(t,e)})()</script><meta
 charset=utf-8><meta name=viewport content="width=device-width [...]
+<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS 
content="INDEX, FOLLOW"><link rel=canonical 
href=https://cn.dubbo.apache.org/zh-cn/overview/tasks/extensibility/protocol/><script>var
 _hmt=_hmt||[];(function(){var 
e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e.parentNode.insertBefore(t,e)})()</script><meta
 charset=utf-8><meta name=viewport content="width=device-width [...]
 <link rel=preload 
href=/scss/main.min.578ffe330fde90c98ec1a836a78e3a4f7ea2a73a72f353cdd331fc3f8dd3a3cd.css
 as=style><link 
href=/scss/main.min.578ffe330fde90c98ec1a836a78e3a4f7ea2a73a72f353cdd331fc3f8dd3a3cd.css
 rel=stylesheet integrity><script src=/js/jquery-3.5.1.min.js 
integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" 
crossorigin=anonymous></script>
 <link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@docsearch/css@3><meta 
name=theme-color content="#326ce5"><link rel=stylesheet 
href=/css/feature-states.css><meta name=description content="自定义协议"><meta 
property="og:description" content="自定义协议"><meta name=twitter:description 
content="自定义协议"><meta property="og:url" 
content="https://cn.dubbo.apache.org/zh-cn/overview/tasks/extensibility/protocol/";><meta
 property="og:title" content="Protocol"><meta name=twitter:title 
content="Protocol" [...]
 <link href=/css/community.css rel=stylesheet><link href=/css/contactus.css 
rel=stylesheet><link href=/css/language.css rel=stylesheet><script 
src=/js/script.js></script></head><body class="td-page 
td-documentation"><header><nav class="js-navbar-scroll navbar navbar-expand 
navbar-dark flex-column flex-md-row td-navbar" data-auto-burger=primary><a 
class=navbar-brand href=/zh-cn/><span class=navbar-logo></span><span 
class="text-uppercase font-weight-bold">Apache Dubbo</span></a><div class=" 
[...]
@@ -717,11 +717,176 @@
 <label for=m-zh-cnoverviewreferenceproposalsadmin-check><a 
href=/zh-cn/overview/reference/proposals/admin/ title="Dubbo Admin 控制面总体架构设计" 
class="align-left pl-0 td-sidebar-link td-sidebar-link__page" 
id=m-zh-cnoverviewreferenceproposalsadmin><span>Admin 
架构设计</span></a></label></li><li class="td-sidebar-nav__section-title 
td-sidebar-nav__section without-child" 
id=m-zh-cnoverviewreferenceproposalsmetrics-li><input type=checkbox 
id=m-zh-cnoverviewreferenceproposalsmetrics-check>
 <label for=m-zh-cnoverviewreferenceproposalsmetrics-check><a 
href=/zh-cn/overview/reference/proposals/metrics/ class="align-left pl-0 
td-sidebar-link td-sidebar-link__page" 
id=m-zh-cnoverviewreferenceproposalsmetrics><span>指标埋点</span></a></label></li><li
 class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" 
id=m-zh-cnoverviewreferenceproposalsheuristic-flow-control-li><input 
type=checkbox id=m-zh-cnoverviewreferenceproposalsheuristic-flow-control-check>
 <label for=m-zh-cnoverviewreferenceproposalsheuristic-flow-control-check><a 
href=/zh-cn/overview/reference/proposals/heuristic-flow-control/ 
title=自适应负载均衡与限流 class="align-left pl-0 td-sidebar-link td-sidebar-link__page" 
id=m-zh-cnoverviewreferenceproposalsheuristic-flow-control><span>服务柔性</span></a></label></li><li
 class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" 
id=m-zh-cnoverviewreferenceproposalsservice-discovery-li><input type=checkbox 
id=m-zh-cnoverviewref [...]
-<label for=m-zh-cnoverviewreferenceproposalsservice-discovery-check><a 
href=/zh-cn/overview/reference/proposals/service-discovery/ title="Dubbo3 
应用级服务发现设计" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" 
id=m-zh-cnoverviewreferenceproposalsservice-discovery><span>应用级服务发现</span></a></label></li></ul></li></ul></li></ul></li></ul></nav></div></div><main
 class="col-12 col-md-9 col-xl-8 pl-md-5" role=main><nav aria-label=breadcrumb 
class=td-breadcrumbs><ol class=breadcrumb><li  [...]
-<button class="btn btn-primary mb-4 
feedback--no">否</button></div><script>const 
yes=document.querySelector(".feedback--yes"),no=document.querySelector(".feedback--no");document.querySelectorAll(".feedback--link").forEach(e=>{e.href=e.href+window.location.pathname});const
 
sendFeedback=e=>{gtag||console.log("!gtag"),gtag("event","click",{event_category:"Helpful",event_label:window.location.pathname,value:e})},disableButtons=()=>{yes.disabled=!0,yes.classList.add("feedback--button__disabled
 [...]
+<label for=m-zh-cnoverviewreferenceproposalsservice-discovery-check><a 
href=/zh-cn/overview/reference/proposals/service-discovery/ title="Dubbo3 
应用级服务发现设计" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" 
id=m-zh-cnoverviewreferenceproposalsservice-discovery><span>应用级服务发现</span></a></label></li></ul></li></ul></li></ul></li></ul></nav></div></div><main
 class="col-12 col-md-9 col-xl-8 pl-md-5" role=main><nav aria-label=breadcrumb 
class=td-breadcrumbs><ol class=breadcrumb><li  [...]
+</span></span><span style=display:flex><span>filter<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.rpc.cluster.filter.ProtocolFilterWrapper</span>
+</span></span><span style=display:flex><span>qos<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.qos.protocol.QosProtocolWrapper</span>
+</span></span><span style=display:flex><span>registry<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol</span>
+</span></span><span style=display:flex><span>service-discovery-registry<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.registry.integration.RegistryProtocol</span>
+</span></span><span style=display:flex><span>listener<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.rpc.protocol.ProtocolListenerWrapper</span>
+</span></span><span style=display:flex><span>mock<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.rpc.support.MockProtocol</span>
+</span></span><span style=display:flex><span>serializationwrapper<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.rpc.protocol.ProtocolSerializationWrapper</span>
+</span></span><span style=display:flex><span>securitywrapper<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.rpc.protocol.ProtocolSecurityWrapper</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
Dubbo对外支持的常用协议</span>
+</span></span><span style=display:flex><span>dubbo<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol</span>
+</span></span><span style=display:flex><span>injvm<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol</span>
+</span></span><span style=display:flex><span>rest<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.rpc.protocol.rest.RestProtocol</span>
+</span></span><span style=display:flex><span>grpc<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.rpc.protocol.grpc.GrpcProtocol</span>
+</span></span><span style=display:flex><span>tri<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.rpc.protocol.tri.TripleProtocol</span>
+</span></span></code></pre></div><p>我们可以看到,在Dubbo中通过协议扩展的能力实现了过滤、监控数据采集、服务发现、监听器、mock、序列化、安全等一系列能力,同时对外提供了<code>dubbo</code>,<code>injvm</code>,<code>rest</code>,<code>grpc</code>和<code>tri</code>协议。</p><p>自定义一套私有协议有两种方式,第一种是对原有的协议进行包装,添加一些特定的业务逻辑。另外一种是完全自定义一套协议。前者实现简单,在<code>dubbo</code>中也是有广泛的使用,比如:<code>ProtocolFilterWrapper</code>,
 <code>QosProtocolWrapper</code>, 
<code>ProtocolListenerWrapper</code>等。后者实现复杂,一般常见的协议<code>dubbo</code>都实现了,并且通过了大量生产实践的验证。</p><p>本文会通过示例演示如何通过现有协议实现一套自定义
 [...]
+</span></span><span style=display:flex><span>dubbo.application.name<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>extensibility-protocol-provider</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
Enable token verification for each invocation</span>
+</span></span><span style=display:flex><span>dubbo.provider.token<span 
style=color:#719e07>=</span><span style=color:#2aa198>true</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
Specify the registry address</span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
dubbo.registry.address=nacos://localhost:8848?username=nacos&amp;password=nacos</span>
+</span></span><span style=display:flex><span>dubbo.registry.address<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>nacos://${nacos.address:localhost}:8848?username=nacos&amp;password=nacos</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
自定义协议edubbo</span>
+</span></span><span style=display:flex><span>dubbo.provider.protocol<span 
style=color:#719e07>=</span><span style=color:#2aa198>edubbo</span>
+</span></span></code></pre></div></li><li>修改<a 
href=https://github.com/apache/dubbo-samples/blob/master/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-protocol-consumer/src/main/resources/application.properties>Consumer</a>中的配置文件,启用Kubernetes中部署的nacos的地址<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-properties data-lang=properties><span 
style=display:flex><span><span style=co [...]
+</span></span><span style=display:flex><span>dubbo.application.name<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>extensibility-protocol-consumer</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
Enable token verification for each invocation</span>
+</span></span><span style=display:flex><span>dubbo.provider.token<span 
style=color:#719e07>=</span><span style=color:#2aa198>true</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
Specify the registry address</span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
dubbo.registry.address=nacos://localhost:8848?username=nacos&amp;password=nacos</span>
+</span></span><span style=display:flex><span>dubbo.registry.address<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>nacos://${nacos.address:localhost}:8848?username=nacos&amp;password=nacos</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
自定义协议edubbo</span>
+</span></span><span style=display:flex><span>dubbo.consumer.protocol<span 
style=color:#719e07>=</span><span style=color:#2aa198>edubbo</span>
+</span></span></code></pre></div></li><li>部署<code>[Extensibility Protocol 
Task](https://github.com/apache/dubbo-samples/blob/master/10-task/dubbo-samples-extensibility/deploy/All.yml)</code></li></ul><h3
 id=使用本地ide>使用本地IDE</h3><ul><li>部署<a 
href=https://nacos.io/zh-cn/docs/quick-start.html>Nacos</a>2.2.0版本</li><li>修改<a 
href=https://github.com/apache/dubbo-samples/blob/master/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-protocol-provider/src/main/resources/application.pr
 [...]
+</span></span><span style=display:flex><span>dubbo.application.name<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>extensibility-protocol-provider</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
Enable token verification for each invocation</span>
+</span></span><span style=display:flex><span>dubbo.provider.token<span 
style=color:#719e07>=</span><span style=color:#2aa198>true</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
Specify the registry address</span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
启用本地nacos的地址</span>
+</span></span><span style=display:flex><span>dubbo.registry.address<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>nacos://localhost:8848?username=nacos&amp;password=nacos</span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
dubbo.registry.address=nacos://${nacos.address:localhost}:8848?username=nacos&amp;password=nacos</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
自定义协议edubbo</span>
+</span></span><span style=display:flex><span>dubbo.provider.protocol<span 
style=color:#719e07>=</span><span style=color:#2aa198>edubbo</span>
+</span></span></code></pre></div></li><li>修改<a 
href=https://github.com/apache/dubbo-samples/blob/master/10-task/dubbo-samples-extensibility/dubbo-samples-extensibility-protocol-consumer/src/main/resources/application.properties>Consumer</a>中的配置文件,启用本地nacos的地址<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-properties data-lang=properties><span 
style=display:flex><span><span style=color:#586e75> [...]
+</span></span><span style=display:flex><span>dubbo.application.name<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>extensibility-protocol-consumer</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
Enable token verification for each invocation</span>
+</span></span><span style=display:flex><span>dubbo.provider.token<span 
style=color:#719e07>=</span><span style=color:#2aa198>true</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
Specify the registry address</span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
启用本地nacos的地址</span>
+</span></span><span style=display:flex><span>dubbo.registry.address<span 
style=color:#719e07>=</span><span 
style=color:#2aa198>nacos://localhost:8848?username=nacos&amp;password=nacos</span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
dubbo.registry.address=nacos://${nacos.address:localhost}:8848?username=nacos&amp;password=nacos</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#586e75># 
自定义协议edubbo</span>
+</span></span><span style=display:flex><span>dubbo.consumer.protocol<span 
style=color:#719e07>=</span><span style=color:#2aa198>edubbo</span>
+</span></span></code></pre></div></li></ul><h2 
id=任务详情>任务详情</h2><p>基于现有的<code>dubbo</code>协议来实现自定义协议<code>edubbo</code>。</p><h2
 
id=实现方式>实现方式</h2><p>通过对<code>dubbo</code>协议进行包装来实现<code>edubbo</code>协议。</p><h4 
id=代码结构>代码结构</h4><h5 id=common>Common</h5><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-properties data-lang=properties><span 
style=display:flex><span>src
+</span></span><span style=display:flex><span> |-main
+</span></span><span style=display:flex><span>    |-java
+</span></span><span style=display:flex><span>        |-org
+</span></span><span style=display:flex><span>            |-apache
+</span></span><span style=display:flex><span>                |-dubbo
+</span></span><span style=display:flex><span>                    |-samples
+</span></span><span style=display:flex><span>                        
|-extensibility
+</span></span><span style=display:flex><span>                            
|-protocol
+</span></span><span style=display:flex><span>                                
|-common
+</span></span><span style=display:flex><span>                                  
  |-EnhancedProtocol.java <span style=color:#2aa198>(实现Protocol接口)</span>
+</span></span></code></pre></div><h5 id=provider>Provider</h5><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-properties data-lang=properties><span 
style=display:flex><span>src
+</span></span><span style=display:flex><span> |-main
+</span></span><span style=display:flex><span>    |-java
+</span></span><span style=display:flex><span>        |-org
+</span></span><span style=display:flex><span>            |-apache
+</span></span><span style=display:flex><span>                |-dubbo
+</span></span><span style=display:flex><span>                    |-samples
+</span></span><span style=display:flex><span>                        
|-extensibility
+</span></span><span style=display:flex><span>                            
|-protocol
+</span></span><span style=display:flex><span>                                
|-provider
+</span></span><span style=display:flex><span>                                  
  |-ExtensibilityProtocolProviderApplication.java
+</span></span><span style=display:flex><span>                                  
  |-ExtensibilityProtocolServiceImpl.java
+</span></span><span style=display:flex><span>    |-resources
+</span></span><span style=display:flex><span>        |-META-INF
+</span></span><span style=display:flex><span>            
|-application.properties <span style=color:#2aa198>(Dubbo Provider配置文件)</span>
+</span></span><span style=display:flex><span>            |-dubbo
+</span></span><span style=display:flex><span>                
|-org.apache.dubbo.rpc.Protocol <span style=color:#2aa198>(纯文本文件)</span>
+</span></span></code></pre></div><h5 id=consumer>Consumer</h5><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-properties data-lang=properties><span 
style=display:flex><span>src
+</span></span><span style=display:flex><span> |-main
+</span></span><span style=display:flex><span>    |-java
+</span></span><span style=display:flex><span>        |-org
+</span></span><span style=display:flex><span>            |-apache
+</span></span><span style=display:flex><span>                |-dubbo
+</span></span><span style=display:flex><span>                    |-samples
+</span></span><span style=display:flex><span>                        
|-extensibility
+</span></span><span style=display:flex><span>                            
|-protocol
+</span></span><span style=display:flex><span>                                
|-consumer
+</span></span><span style=display:flex><span>                                  
  |-ExtensibilityProtocolConsumerApplication.java
+</span></span><span style=display:flex><span>                                  
  |-ExtensibilityProtocolConsumerTask.java
+</span></span><span style=display:flex><span>    |-resources
+</span></span><span style=display:flex><span>        |-META-INF
+</span></span><span style=display:flex><span>            
|-application.properties <span style=color:#2aa198>(Dubbo Consumer配置文件)</span>
+</span></span><span style=display:flex><span>            |-dubbo
+</span></span><span style=display:flex><span>                
|-org.apache.dubbo.rpc.Protocol <span style=color:#2aa198>(纯文本文件)</span>
+</span></span></code></pre></div><h4 id=代码详情>代码详情</h4><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-java data-lang=java><span style=display:flex><span><span 
style=color:#719e07>package</span> 
org.apache.dubbo.samples.extensibility.protocol.common<span 
style=color:#719e07>;</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span 
style=color:#719e07>import</span> org.apache.dubbo.common.URL<span 
style=color:#719e07>;</span>
+</span></span><span style=display:flex><span><span 
style=color:#719e07>import</span> org.apache.dubbo.rpc.Protocol<span 
style=color:#719e07>;</span>
+</span></span><span style=display:flex><span><span 
style=color:#719e07>import</span> org.apache.dubbo.rpc.Invoker<span 
style=color:#719e07>;</span>
+</span></span><span style=display:flex><span><span 
style=color:#719e07>import</span> org.apache.dubbo.rpc.Exporter<span 
style=color:#719e07>;</span>
+</span></span><span style=display:flex><span><span 
style=color:#719e07>import</span> org.apache.dubbo.rpc.ProtocolServer<span 
style=color:#719e07>;</span>
+</span></span><span style=display:flex><span><span 
style=color:#719e07>import</span> org.apache.dubbo.rpc.RpcException<span 
style=color:#719e07>;</span>
+</span></span><span style=display:flex><span><span 
style=color:#719e07>import</span> 
org.apache.dubbo.rpc.model.FrameworkModel<span style=color:#719e07>;</span>
+</span></span><span style=display:flex><span><span 
style=color:#719e07>import</span> 
org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol<span 
style=color:#719e07>;</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span 
style=color:#719e07>import</span> java.util.List<span 
style=color:#719e07>;</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span 
style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span 
style=color:#268bd2>EnhancedProtocol</span> <span 
style=color:#268bd2>implements</span> Protocol <span 
style=color:#719e07>{</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span>    <span 
style=color:#268bd2>public</span> <span 
style=color:#268bd2>EnhancedProtocol</span><span 
style=color:#719e07>(</span>FrameworkModel frameworkModel<span 
style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+</span></span><span style=display:flex><span>        <span 
style=color:#719e07>this</span><span style=color:#719e07>.</span>protocol <span 
style=color:#719e07>=</span> <span style=color:#719e07>new</span> 
DubboProtocol<span style=color:#719e07>(</span>frameworkModel<span 
style=color:#719e07>);</span>
+</span></span><span style=display:flex><span>    <span 
style=color:#719e07>}</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span>    <span 
style=color:#268bd2>private</span> <span style=color:#268bd2>final</span> 
Protocol protocol<span style=color:#719e07>;</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span>    <span 
style=color:#268bd2>@Override</span>
+</span></span><span style=display:flex><span>    <span 
style=color:#268bd2>public</span> <span style=color:#dc322f>int</span> <span 
style=color:#268bd2>getDefaultPort</span><span style=color:#719e07>()</span> 
<span style=color:#719e07>{</span>
+</span></span><span style=display:flex><span>        <span 
style=color:#719e07>return</span> <span style=color:#719e07>this</span><span 
style=color:#719e07>.</span>protocol<span 
style=color:#719e07>.</span>getDefaultPort<span style=color:#719e07>();</span>
+</span></span><span style=display:flex><span>    <span 
style=color:#719e07>}</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span>    <span 
style=color:#268bd2>@Override</span>
+</span></span><span style=display:flex><span>    <span 
style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span 
style=color:#719e07>&gt;</span> Exporter<span 
style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span 
style=color:#268bd2>export</span><span style=color:#719e07>(</span>Invoker<span 
style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> 
invoker<span style=color:#719e07>)</span> <span 
style=color:#268bd2>throws</span> RpcEx [...]
+</span></span><span style=display:flex><span>        <span 
style=color:#586e75>// do something
+</span></span></span><span style=display:flex><span><span 
style=color:#586e75></span>        <span style=color:#719e07>return</span> 
<span style=color:#719e07>this</span><span 
style=color:#719e07>.</span>protocol<span 
style=color:#719e07>.</span>export<span 
style=color:#719e07>(</span>invoker<span style=color:#719e07>);</span>
+</span></span><span style=display:flex><span>    <span 
style=color:#719e07>}</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span>    <span 
style=color:#268bd2>@Override</span>
+</span></span><span style=display:flex><span>    <span 
style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span 
style=color:#719e07>&gt;</span> Invoker<span 
style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span 
style=color:#268bd2>refer</span><span style=color:#719e07>(</span>Class<span 
style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> type<span 
style=color:#719e07>,</span> URL url<span style=color:#719e07>)</span> <span 
styl [...]
+</span></span><span style=display:flex><span>        <span 
style=color:#586e75>// do something
+</span></span></span><span style=display:flex><span><span 
style=color:#586e75></span>        <span style=color:#719e07>return</span> 
<span style=color:#719e07>this</span><span 
style=color:#719e07>.</span>protocol<span 
style=color:#719e07>.</span>refer<span style=color:#719e07>(</span>type<span 
style=color:#719e07>,</span> url<span style=color:#719e07>);</span>
+</span></span><span style=display:flex><span>    <span 
style=color:#719e07>}</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span>    <span 
style=color:#268bd2>@Override</span>
+</span></span><span style=display:flex><span>    <span 
style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span 
style=color:#268bd2>destroy</span><span style=color:#719e07>()</span> <span 
style=color:#719e07>{</span>
+</span></span><span style=display:flex><span>        <span 
style=color:#719e07>this</span><span style=color:#719e07>.</span>protocol<span 
style=color:#719e07>.</span>destroy<span style=color:#719e07>();</span>
+</span></span><span style=display:flex><span>    <span 
style=color:#719e07>}</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span>    <span 
style=color:#268bd2>@Override</span>
+</span></span><span style=display:flex><span>    <span 
style=color:#268bd2>public</span> List<span 
style=color:#719e07>&lt;</span>ProtocolServer<span 
style=color:#719e07>&gt;</span> <span 
style=color:#268bd2>getServers</span><span style=color:#719e07>()</span> <span 
style=color:#719e07>{</span>
+</span></span><span style=display:flex><span>        <span 
style=color:#719e07>return</span> protocol<span 
style=color:#719e07>.</span>getServers<span style=color:#719e07>();</span>
+</span></span><span style=display:flex><span>    <span 
style=color:#719e07>}</span>
+</span></span><span style=display:flex><span><span style=color:#719e07>}</span>
+</span></span></code></pre></div><h4 id=spi配置>SPI配置</h4><h5 
id=provider-1>Provider</h5><p>在<code>resources/META-INF/dubbo/org.apache.dubbo.rpc.Protocol</code>文件中添加如下配置:</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-properties data-lang=properties><span 
style=display:flex><span>edubbo<span style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.samples.extensibility.protocol [...]
+</span></span></code></pre></div><h5 
id=consumer-1>Consumer</h5><p>在<code>resources/META-INF/dubbo/org.apache.dubbo.rpc.Protocol</code>文件中添加如下配置:</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-properties data-lang=properties><span 
style=display:flex><span>edubbo<span style=color:#719e07>=</span><span 
style=color:#2aa198>org.apache.dubbo.samples.extensibility.protocol.common.EnhancedProtoco
 [...]
+</span></span></code></pre></div><h4 id=配置文件>配置文件</h4><h5 
id=provider-2>Provider</h5><p>在<code>resources/application.properties</code>文件中添加如下配置:</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-properties data-lang=properties><span 
style=display:flex><span><span style=color:#586e75># 自定义协议</span>
+</span></span><span style=display:flex><span>dubbo.provider.protocol<span 
style=color:#719e07>=</span><span style=color:#2aa198>edubbo</span>
+</span></span></code></pre></div><h5 
id=consumer-2>Consumer</h5><p>在<code>resources/application.properties</code>文件中添加如下配置:</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-properties data-lang=properties><span 
style=display:flex><span><span style=color:#586e75># 自定义协议</span>
+</span></span><span style=display:flex><span>dubbo.consumer.protocol<span 
style=color:#719e07>=</span><span style=color:#2aa198>edubbo</span>
+</span></span></code></pre></div><h2 
id=运行结果>运行结果</h2><p>以<strong>使用本地IDE</strong>的方式来运行任务,结果如下:</p><h4 
id=注册协议>注册协议</h4><p><img 
src=/imgs/v3/tasks/extensibility/dubbo-samples-extensibility-protocol-output2.jpg
 alt=dubbo-samples-extensibility-protocol-output2.jpg></p><h4 
id=输出结果>输出结果</h4><p><img 
src=/imgs/v3/tasks/extensibility/dubbo-samples-extensibility-protocol-output1.png
 alt=dubbo-samples-extensibility-protocol-output1.png></p><div 
id=pre-footer><h2>反馈</h2><p class=feedback--prompt> [...]
+<button class="btn btn-primary mb-4 
feedback--no">否</button></div><script>const 
yes=document.querySelector(".feedback--yes"),no=document.querySelector(".feedback--no");document.querySelectorAll(".feedback--link").forEach(e=>{e.href=e.href+window.location.pathname});const
 
sendFeedback=e=>{gtag||console.log("!gtag"),gtag("event","click",{event_category:"Helpful",event_label:window.location.pathname,value:e})},disableButtons=()=>{yes.disabled=!0,yes.classList.add("feedback--button__disabled
 [...]
 <a 
href="https://github.com/apache/dubbo-website/new/master/content/zh-cn/overview/tasks/extensibility/protocol.md?filename=change-me.md&amp;value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+m
 [...]
 <a href="https://github.com/apache/dubbo-website/issues/new?title=Protocol"; 
target=_blank><i class="fab fa-github fa-fw"></i> 登记问题</a>
-<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas 
fa-tasks fa-fw"></i> 提交项目问题</a></div></div></div></div></div><footer 
class="bg-dark py-5 row d-print-none footer-margin-0"><div 
class="container-fluid mx-sm-5"><div class=row><div class="col-6 col-sm-4 
text-xs-center order-sm-2"><ul class="list-inline mb-0"><li 
class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top 
title="Dubbo mailing list archive" aria-label="Dubbo mailing list archive"><a c 
[...]
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas 
fa-tasks fa-fw"></i> 提交项目问题</a></div><nav id=TableOfContents><ul><li><a 
href=#开始之前>开始之前</a><ul><li><a href=#基于kubernetes>基于Kubernetes</a></li><li><a 
href=#使用本地ide>使用本地IDE</a></li></ul></li><li><a href=#任务详情>任务详情</a></li><li><a 
href=#实现方式>实现方式</a><ul><li></li></ul></li><li><a 
href=#运行结果>运行结果</a><ul><li></li></ul></li></ul></nav></div></div></div></div><footer
 class="bg-dark py-5 row d-print-none footer-margin-0 [...]
 <script src=/js/bootstrap.min.js 
integrity=sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy
 crossorigin=anonymous></script>
 <script 
src=/js/main.min.b075178d232d3b0039b3cb6af2fc2e9d90071820167a60f4eea3a79169975ee8.js
 integrity="sha256-sHUXjSMtOwA5s8tq8vwunZAHGCAWemD07qOnkWmXXug=" 
crossorigin=anonymous></script>
 <script src=https://cdn.jsdelivr.net/npm/@docsearch/js@3></script>
diff --git a/zh-cn/sitemap.xml b/zh-cn/sitemap.xml
index 7db2bde1f7..8812080b8a 100644
--- a/zh-cn/sitemap.xml
+++ b/zh-cn/sitemap.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?><urlset 
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml";><url><loc>https://cn.dubbo.apache.org/zh-cn/blog/2023/01/16/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E5%8D%87%E7%BA%A7-dubbo3-%E5%85%A8%E9%9D%A2%E5%8F%96%E4%BB%A3-hsf2/</loc><lastmod>2023-02-22T15:03:22+08:00</lastmod><changefreq>monthly</changefreq><priority>0.5</priority></url><url><loc>https://cn.dubbo.apache.org/zh-cn/overview/mannu
 [...]
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8" standalone="yes"?><urlset 
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml";><url><loc>https://cn.dubbo.apache.org/zh-cn/blog/2023/01/16/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E5%8D%87%E7%BA%A7-dubbo3-%E5%85%A8%E9%9D%A2%E5%8F%96%E4%BB%A3-hsf2/</loc><lastmod>2023-02-22T15:03:22+08:00</lastmod><changefreq>monthly</changefreq><priority>0.5</priority></url><url><loc>https://cn.dubbo.apache.org/zh-cn/overview/mannu
 [...]
\ No newline at end of file

Reply via email to