<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>通信协议 on Apache Dubbo</title><link>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/tasks/protocols/</link><description>Recent content in 通信协议 on Apache Dubbo</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/tasks/protocols/index.xml" rel="self" type="application/rss+xml"/><item><title>Dubbo 支持的 RPC 通信协议</title><link>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/tasks/protocols/protocol/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/tasks/protocols/protocol/</guid><description>&lt;p>Dubbo 作为一款 RPC 框架内置了高效的 RPC 通信协议，帮助解决服务间的编码与通信问题，目前支持的协议包括：&lt;/p>
&lt;ul>
&lt;li>triple，基于 HTTP/1、HTTP/2 的高性能通信协议，100% 兼容 gRPC，支持 Unary、Streming 等通信模式；支持发布 REST 风格的 HTTP 服务。&lt;/li>
&lt;li>dubbo，基于 TCP 的高性能私有通信协议，缺点是通用性较差，更适合在 Dubbo SDK 间使用；&lt;/li>
&lt;li>任意协议扩展，通过扩展 protocol 可以之前任意 RPC 协议，官方生态库提供 JsonRPC、thrift 等支持。&lt;/li>
&lt;/ul>
&lt;h2 id="协议概览">协议概览&lt;/h2>
&lt;h3 id="使用哪个协议">使用哪个协议？&lt;/h3>
&lt;p>&lt;strong>开发者该如何确定使用哪一种协议那？&lt;/strong> 以下是我们从使用场景、性能、编程易用性、多语言互通等方面对多个主流协议的对比分析：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">&lt;span style="display:inline-block;width:50px">协议&lt;/span>&lt;/th>
 &lt;th style="text-align: left">性能&lt;/th>
 &lt;th style="text-align: left">网关友好&lt;/th>
 &lt;th style="text-align: left">流式通信&lt;/th>
 &lt;th style="text-align: left">多语言支持&lt;/th>
 &lt;th style="text-align: left">编程API&lt;/th>
 &lt;th style="text-align: left">说明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">triple&lt;/td>
 &lt;td style="text-align: left">高&lt;/td>
 &lt;td style="text-align: left">高&lt;/td>
 &lt;td style="text-align: left">支持，客户端流、服务端流、双向流&lt;/td>
 &lt;td style="text-align: left">支持（Java、Go、Node.js、JavaScript、Rust）&lt;/td>
 &lt;td style="text-align: left">Java Interface、Protobuf(IDL)&lt;/td>
 &lt;td style="text-align: left">在多语言兼容、性能、网关、Streaming、gRPC 等方面最均衡的协议实现，官方推荐。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">dubbo&lt;/td>
 &lt;td style="text-align: left">高&lt;/td>
 &lt;td style="text-align: left">低&lt;/td>
 &lt;td style="text-align: left">不支持&lt;/td>
 &lt;td style="text-align: left">支持（Java、Go）&lt;/td>
 &lt;td style="text-align: left">Java Interface&lt;/td>
 &lt;td style="text-align: left">性能最高的私有协议，但前端流量接入、多语言支持等成本较高&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">rest&lt;/td>
 &lt;td style="text-align: left">低&lt;/td>
 &lt;td style="text-align: left">高&lt;/td>
 &lt;td style="text-align: left">不支持&lt;/td>
 &lt;td style="text-align: left">支持&lt;/td>
 &lt;td style="text-align: left">Java Interface&lt;/td>
 &lt;td style="text-align: left">rest 协议在前端接入、互通等方面具备最高的灵活性，但对比 rpc 存在性能、弱类型等缺点。&lt;strong>注意，rest 在 dubbo3 中仅是 triple 协议的一种发布形式&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>


&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">注意&lt;/h4>

 自 3.3 版本开始，triple 协议支持以 rest 风格发布标准的 http 服务，因此框架中实际已不存在独立的 rest protocol 扩展实现。只是在文档说明上，我们依然选择将 triple 与 rest 作为独立的协议实现分开讲解，请大家注意。

&lt;/div>

&lt;h3 id="协议默认值">协议默认值&lt;/h3>
&lt;p>以下是几个主要协议的具体开发、配置、运行态信息：&lt;/p></description></item><item><title>基于 TCP 的 RPC 通信协议 - dubbo</title><link>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/tasks/protocols/dubbo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/tasks/protocols/dubbo/</guid><description>&lt;p>本示例演示了如何开发基于 &lt;code>dubbo&lt;/code> 协议通信的服务，可在此查看 &lt;a href="https://github.com/apache/dubbo-samples/tree/master/2-advanced/dubbo-samples-dubbo">本示例的完整代码&lt;/a>：&lt;/p>


&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">注意&lt;/h4>

 为了保证老版本兼容性，Dubbo 3.3.0 及之前版本的默认协议都是 &lt;code>dubbo&lt;/code>。但如果您是新用户，正在考虑使用 Dubbo 构建一套全新的微服务系统，我们推荐您在应用中明确配置使用 &lt;code>triple&lt;/code> 协议。

&lt;/div>

&lt;h2 id="运行示例">运行示例&lt;/h2>
&lt;p>你可以跟随以下步骤，尝试运行本文档对应的示例源码。&lt;/p>
&lt;p>首先，可通过以下命令下载示例源码&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-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>git clone --depth&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">1&lt;/span> https://github.com/apache/dubbo-samples.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进入示例源码目录：&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-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#b58900">cd&lt;/span> dubbo-samples/2-advanced/dubbo-samples-dubbo
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>使用 maven 打包示例：&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-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>mvn clean install -DskipTests
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="启动提供者">启动提供者&lt;/h3>
&lt;p>运行以下命令启动提供者：&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-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>java -jar ./dubbo-samples-dubbo-provider/target/dubbo-samples-dubbo-provider-1.0-SNAPSHOT.jar
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="启动消费者">启动消费者&lt;/h3>
&lt;p>运行以下命令：&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-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>java -jar ./dubbo-samples-dubbo-consumer/target/dubbo-samples-dubbo-consumer-1.0-SNAPSHOT.jar
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="源码讲解">源码讲解&lt;/h2>
&lt;h3 id="定义服务">定义服务&lt;/h3>
&lt;p>首先是服务定义，使用 &lt;code>dubbo&lt;/code> 协议时，我们首选需要通过 Java Interface 定义 Dubbo 服务。&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>&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">DemoService&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> String &lt;span style="color:#268bd2">sayHello&lt;/span>(String name);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="服务提供者">服务提供者&lt;/h3>
&lt;p>其次，对于提供者一侧而言，需要提供服务的具体实现。&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>&lt;span style="color:#268bd2">@DubboService&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">DemoServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> DemoService {
&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> String &lt;span style="color:#268bd2">sayHello&lt;/span>(String name) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;Hello &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>配置使用 &lt;code>dubbo&lt;/code> 协议：&lt;/p></description></item><item><title>发布 REST 风格的服务</title><link>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/tasks/protocols/rest/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/tasks/protocols/rest/</guid><description>&lt;div class="alert alert-primary" role="alert">


 本文要讲的 &amp;ldquo;rest 协议&amp;rdquo; 实际上并不是一个真正的协议实现，而是关于如何使得 triple 协议支持以 rest 风格的 http 请求直接访问。
我们将演示如何使用 rest 请求访问标准 triple 协议的 Dubbo 服务。

&lt;/div>



&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">注意&lt;/h4>

 从 Dubbo 3.3 版本开始，rest 协议已移至 extensions 库，由 triple 协议来对 Rest 提供更全面的支持，新版本的内置协议实现只剩下 triple 和 dubbo。
&lt;br>因此，当我们提到 rest 时，都是指 triple 协议的 rest 访问支持能力，具体参见 &lt;a href="https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/tripe-rest-manual/">Triple Rest用户手册&lt;/a>

&lt;/div>

&lt;p>在讲解 &lt;a href="../triple/interface/#curl">triple 协议示例&lt;/a> 时，我们曾提到 triple 协议支持以 &lt;code>application/json&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-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>curl &lt;span style="color:#cb4b16">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cb4b16">&lt;/span> --header &lt;span style="color:#2aa198">&amp;#34;Content-Type: application/json&amp;#34;&lt;/span> &lt;span style="color:#cb4b16">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cb4b16">&lt;/span> --data &lt;span style="color:#2aa198">&amp;#39;[&amp;#34;Dubbo&amp;#34;]&amp;#39;&lt;/span> &lt;span style="color:#cb4b16">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cb4b16">&lt;/span> http://localhost:50052/org.apache.dubbo.samples.api.GreetingsService/sayHi/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果你认为以上
&lt;code>http://localhost:50052/org.apache.dubbo.samples.api.GreetingsService/sayHi&lt;/code> 格式的 path 请求不够友好，还可以通过注解自定义 http 请求的路径和方法等参数，
目前已支持 内置，Spring Web和JAX-RS 三种注解格式。以下示例的完整代码请参见 &lt;a href="https://github.com/apache/dubbo-samples/tree/master/2-advanced/dubbo-samples-triple-rest">dubbo-samples-triple-rest&lt;/a>。&lt;/p>
&lt;h3 id="下载并运行示例">下载并运行示例&lt;/h3>
&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-bash" data-lang="bash">&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>git clone --depth&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">1&lt;/span> https://github.com/apache/dubbo-samples.git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#b58900">cd&lt;/span> dubbo-samples/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic
&lt;/span>&lt;/span>&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>mvn spring-boot:run
&lt;/span>&lt;/span>&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>mvn clean package -DskipTests
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>java -jar target/dubbo-samples-triple-rest-basic-1.0.0-SNAPSHOT.jar
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>当然，也可以直接用IDE导入工程后直接执行
&lt;code>org.apache.dubbo.rest.demo.BasicRestApplication#main&lt;/code> 来运行，并通过下断点 debug 的方式来深入理解原理。
&lt;a name="DBA0D">&lt;/a>&lt;/p></description></item></channel></rss>