<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RPC 协议 on Apache Dubbo</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/</link><description>Recent content in RPC 协议 on Apache Dubbo</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/index.xml" rel="self" type="application/rss+xml"/><item><title>协议概述</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/overview/</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;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;br/> 支持 &lt;code>application/json&lt;/code> 格式 payload http 直接访问。&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;/tbody>
&lt;/table>
&lt;p>以下是 triple、dubbo 两个主要协议的具体开发、配置、运行态信息：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">协议名称&lt;/th>
 &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;span style="display:inline-block;width:250px">服务定义方式&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;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>triple&lt;/strong>&lt;/td>
 &lt;td style="text-align: left">tri&lt;/td>
 &lt;td style="text-align: left">- Java Interface &lt;br/> - Java Interface+SpringWeb注解 &lt;br/> - Java Interface+JaxRS注解 &lt;br/> - Protobuf(IDL)&lt;/td>
 &lt;td style="text-align: left">50051&lt;/td>
 &lt;td style="text-align: left">HTTP/1、HTTP/2&lt;/td>
 &lt;td style="text-align: left">Protobuf Binary、Protobuf-json&lt;/td>
 &lt;td style="text-align: left">否&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>dubbo&lt;/strong>&lt;/td>
 &lt;td style="text-align: left">dubbo&lt;/td>
 &lt;td style="text-align: left">- Java Interface&lt;/td>
 &lt;td style="text-align: left">20880&lt;/td>
 &lt;td style="text-align: left">TCP&lt;/td>
 &lt;td style="text-align: left">Hessian、Fastjson2、JSON、JDK、Avro、Kryo 等&lt;/td>
 &lt;td style="text-align: left">&lt;strong>是&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>

 &lt;ul>
&lt;li>自 3.3 版本开始，triple 协议支持以 rest 风格发布标准的 http 服务，因此框架中实际已不存在独立的 rest protocol 扩展实现，&lt;/li>
&lt;li>考虑到对过往版本的兼容性，当前 Dubbo 各个发行版本均默认使用 &lt;code>dubbo&lt;/code> 通信协议。&lt;strong>对于新用户而言，我们强烈建议在一开始就明确配置使用 &lt;code>triple&lt;/code> 协议&lt;/strong>，老用户也尽快参考文档 &lt;a href="https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/migration">实现协议的平滑迁移&lt;/a>。&lt;/li>
&lt;/ul>


&lt;/div>

&lt;h2 id="多协议扩展">多协议扩展&lt;/h2>
&lt;p>以下是当前 Dubbo 官方生态库提供的拓展协议实现。如果要扩展更多自定义协议，请参考 &lt;a href="https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/spi/">SPI 扩展手册&lt;/a> 或 &lt;a href="https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/tasks/extensibility/protocol/">使用教程 - 协议扩展&lt;/a>。&lt;/p></description></item><item><title>协议概述</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/</guid><description>&lt;p>请参考文档其他部分了解 &lt;a href="https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/reference/protocols/triple-spec/">triple 协议规范规范&lt;/a> 和 &lt;a href="https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/tasks/protocols/triple/">基本使用方式&lt;/a>。本文只展开 triple 协议 Java 实现中的一些具体细节内容。&lt;/p>
&lt;h2 id="编程模式">编程模式&lt;/h2>
&lt;p>使用 triple 协议时，开发者可以使用 &lt;code>Java Interface&lt;/code>、&lt;code>Protobuf(IDL)&lt;/code> 两种方式定义 RPC 服务，两种服务定义方式的协议能力是对等的，仅影响开发者的编程体验、序列化方式，具体选用那种开发模式，取决于使用者的业务背景。&lt;/p>
&lt;h3 id="java接口">Java接口&lt;/h3>
&lt;p>适合于 Dubbo 老用户、没有跨语言诉求的开发团队，具备学习成本低的优势，&lt;code>Dubbo2 老用户可以零成本切换到该协议&lt;/code>。&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-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;p>这种模式下，序列化方式可以选用 Hessian、JSON、Kryo、JDK、自定义扩展等任意编码协议。在使用体验上，可以说与老版本 dubbo 协议没有任何区别，只需要改一个 protocol 配置项即可，因此对于 dubbo 协议迁移到 triple 也会更平滑。&lt;/p>
&lt;p>请通过【进阶学习 - 通信协议】查看 &lt;code>java Interface + Triple 协议的具体使用示例&lt;/code>。&lt;/p>
&lt;h3 id="protobuf">Protobuf&lt;/h3>
&lt;p>使用 Protobuf(IDL) 的方式定义服务，&lt;strong>适合于当前或未来有跨语言诉求的开发团队，同一份 IDL 服务可同时用于 Java/Go/Node.js 等多语言微服务开发，劣势是学习成本较高&lt;/strong>。&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-Protobuf" data-lang="Protobuf">&lt;span style="display:flex;">&lt;span>syntax &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">&amp;#34;proto3&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">option&lt;/span> java_multiple_files &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#cb4b16">true&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">package&lt;/span> org&lt;span style="color:#719e07">.&lt;/span>apache.dubbo.springboot.demo.idl;
&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">message&lt;/span> &lt;span style="color:#268bd2">GreeterRequest&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#dc322f">string&lt;/span> name &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">1&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">message&lt;/span> &lt;span style="color:#268bd2">GreeterReply&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#dc322f">string&lt;/span> &lt;span style="color:#268bd2">message&lt;/span> &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">1&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>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">service&lt;/span> Greeter{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">rpc&lt;/span> greet(GreeterRequest) &lt;span style="color:#719e07">returns&lt;/span> (GreeterReply);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通过 &lt;a href="https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/tasks/protocols/triple/idl/#%E7%94%9F%E6%88%90%E7%9A%84%E4%BB%A3%E7%A0%81%E6%97%A0%E6%B3%95%E7%BC%96%E8%AF%91">Dubbo 提供的 protoc 编译插件&lt;/a>，将以上 IDL 服务定义预编译为相关 stub 代码，其中就包含 Dubbo 需要的 Interface 接口定义，因此在后续编码上区别并不大，只不过相比于前面的用户自定义 Java Interface 模式，这里由插件自动帮我们生成 Interface 定义。&lt;/p></description></item><item><title>Dubbo协议</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/dubbo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/dubbo/</guid><description>&lt;p>Dubbo 缺省协议采用单一长连接和 NIO 异步通讯，适合于小数据量大并发的服务调用，以及服务消费者机器数远大于服务提供者机器数的情况。dubbo RPC是dubbo体系中最核心的一种高性能、高吞吐量的远程调用方式，我喜欢称之为多路复用的TCP长连接调用。&lt;/p>
&lt;p>主要用于两个dubbo系统之间作远程调用，特别适合高并发、小数据的互联网场景。反之，Dubbo 缺省协议不适合传送大数据量的服务，比如传文件，传视频等，除非请求量很低。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>长连接：避免了每次调用新建TCP连接，提高了调用的响应速度。&lt;/strong>&lt;/li>
&lt;li>&lt;strong>多路复用：单个TCP连接可交替传输多个请求和响应的消息，降低了连接的等待闲置时间，从而减少了同样并发数下的网络连接数，提高了系统吞吐量。&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="dubbo-protocol.jpg" src="https://deploy-preview-3202--dubbo.netlify.app/imgs/user/dubbo-protocol.jpg">&lt;/p>
&lt;ul>
&lt;li>Transporter: mina, netty, grizzy&lt;/li>
&lt;li>Serialization: dubbo, hessian2, java, json&lt;/li>
&lt;li>Dispatcher: all, direct, message, execution, connection&lt;/li>
&lt;li>ThreadPool: fixed, cached&lt;/li>
&lt;/ul>
&lt;p>缺省协议，使用基于 netty &lt;code>3.2.5.Final&lt;/code> 和 hessian2 &lt;code>3.2.1-fixed-2(Alibaba embed version)&lt;/code> 的 tbremoting 交互。&lt;/p>
&lt;ul>
&lt;li>连接个数：单连接&lt;/li>
&lt;li>连接方式：长连接&lt;/li>
&lt;li>传输协议：TCP&lt;/li>
&lt;li>传输方式：NIO 异步传输&lt;/li>
&lt;li>序列化：Hessian 二进制序列化&lt;/li>
&lt;li>适用范围：传入传出参数数据包较小（建议小于100K），消费者比提供者个数多，单一消费者无法压满提供者，尽量不要用 dubbo 协议传输大文件或超大字符串。&lt;/li>
&lt;li>适用场景：常规远程服务方法调用&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>约束&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>参数及返回值需实现 &lt;code>Serializable&lt;/code> 接口&lt;/li>
&lt;li>参数及返回值不能自定义实现 &lt;code>List&lt;/code>, &lt;code>Map&lt;/code>, &lt;code>Number&lt;/code>, &lt;code>Date&lt;/code>, &lt;code>Calendar&lt;/code> 等接口，只能用 JDK 自带的实现，因为 hessian 会做特殊处理，自定义实现类中的属性值都会丢失。&lt;/li>
&lt;li>Hessian 序列化，只传成员属性值和值的类型，不传方法或静态变量，兼容情况由&lt;strong>吴亚军提供&lt;/strong>&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &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;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">A-&amp;gt;B&lt;/td>
 &lt;td style="text-align: left">类A多一种 属性（或者说类B少一种 属性）&lt;/td>
 &lt;td style="text-align: left">不抛异常，A多的那 个属性的值，B没有，其他正常&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">A-&amp;gt;B&lt;/td>
 &lt;td style="text-align: left">枚举A多一种 枚举（或者说B少一种 枚举）&lt;/td>
 &lt;td style="text-align: left">A使用多 出来的枚举进行传输&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">A-&amp;gt;B&lt;/td>
 &lt;td style="text-align: left">枚举A多一种 枚举（或者说B少一种 枚举）&lt;/td>
 &lt;td style="text-align: left">A不使用 多出来的枚举进行传输&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">A-&amp;gt;B&lt;/td>
 &lt;td style="text-align: left">A和B的属性 名相同，但类型不相同&lt;/td>
 &lt;td style="text-align: left">抛异常&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">A-&amp;gt;B&lt;/td>
 &lt;td style="text-align: left">serialId 不相同&lt;/td>
 &lt;td style="text-align: left">正常传输&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>接口增加方法，对客户端无影响，如果该方法不是客户端需要的，客户端不需要重新部署。输入参数和结果集中增加属性，对客户端无影响，如果客户端并不需要新属性，不用重新部署。&lt;/p></description></item><item><title>多协议</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/multi-protocols/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/multi-protocols/</guid><description>&lt;p>区别于普通的 RPC 框架，Dubbo 作为一款微服务框架提供了非常灵活的协议支持，它不绑定一个单一通信协议。因此你&lt;strong>可以发布在一个进程中同时发布多个 RPC 协议、调用不同的 RPC 协议&lt;/strong>。接下来我们就详细介绍多协议的具体使用场景与使用方式。&lt;/p>
&lt;h2 id="使用场景">使用场景&lt;/h2>
&lt;p>有很多场景可能会用到不同的协议，包括安全性、性能、与第三方系统互调等业务诉求。本文我们不分析具体的业务需求，而是从 Dubbo 框架提供的多协议能力出发分析框架能提供的多协议能力：&lt;/p>
&lt;ul>
&lt;li>作为服务提供者（provider），同一个服务发布为多个协议，供不同消费端调用&lt;/li>
&lt;li>作为服务提供者（provider），多个服务分别发布为不同协议，供不同消费端调用&lt;/li>
&lt;li>作为服务消费者（consumer），指定以某个特定协议调用某一个服务&lt;/li>
&lt;/ul>
&lt;h2 id="使用方式">使用方式&lt;/h2>
&lt;h3 id="同一个服务发布为多个协议">同一个服务发布为多个协议&lt;/h3>
&lt;p>如果使用 Spring Boot，可以修改 application.yml 或 application.properties 如下：&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-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">dubbo&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">protocols&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">dubbo-id&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">name&lt;/span>: dubbo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">port&lt;/span>: &lt;span style="color:#2aa198">20880&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">tri-id&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">name&lt;/span>: tri
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">port&lt;/span>: &lt;span style="color:#2aa198">50051&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>对于 Spring XML：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-xml" data-lang="xml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;dubbo:protocol&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;dubbo-id&amp;#34;&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;dubbo&amp;#34;&lt;/span> port=&lt;span style="color:#2aa198">&amp;#34;20880&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;dubbo:protocol&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;triple-id&amp;#34;&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;tri&amp;#34;&lt;/span> port=&lt;span style="color:#2aa198">&amp;#34;50051&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
&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-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">@DubboService&lt;/span>(protocol&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;dubbo-id,triple-id&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">private&lt;/span> DemoServiceImpl &lt;span style="color:#268bd2">implements&lt;/span> DemoService {}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="多个服务分别发布为不同协议">多个服务分别发布为不同协议&lt;/h3>
&lt;p>如果使用 Spring Boot，可以修改 application.yml 或 application.properties 如下：&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-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">dubbo&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">protocols&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">dubbo-id&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">name&lt;/span>: dubbo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">port&lt;/span>: &lt;span style="color:#2aa198">20880&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">tri-id&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">name&lt;/span>: tri
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">port&lt;/span>: &lt;span style="color:#2aa198">50051&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>接下来为不同的服务分别配置不同的协议引用：&lt;/p></description></item><item><title>Tripe 3.3 新特性</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple-3.3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple-3.3/</guid><description>&lt;p>&lt;a name="lipv5">&lt;/a>&lt;/p>
&lt;h2 id="全新的-rest-支持">全新的 Rest 支持&lt;/h2>
&lt;p>&lt;a name="BrKuK">&lt;/a>&lt;/p>
&lt;h3 id="特性">特性&lt;/h3>
&lt;p>在3.3版本中，基于现有 HTTP 协议栈，triple实现了全面的 REST 风格服务导出能力，无需使用泛化或网关层协议转换，无需配置，用户即可通过 HTTP 协议去中心化直接访问后端的 Triple 协议服务。同时，针对高级
REST 用法，如路径定制、输出格式定制和异常处理，提供了丰富的注解和
SPI 扩展支持。其主要特性包括：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Triple协议融合&lt;/strong>&lt;br>
重用Triple原有HTTP协议栈， 无需额外配置或新增端口，即可同时支持 HTTP/1、HTTP/2 和 HTTP/3 协议的访问。&lt;/li>
&lt;li>&lt;strong>去中心化&lt;/strong>&lt;br>
可直接对外暴露 Rest API，不再依赖网关应用进行流量转发，从而提升性能，并降低因网关引发的稳定性风险。安全问题可通过应用内部扩展解决，这一实践已在淘宝内部的 MTOP 中得到验证。&lt;/li>
&lt;li>&lt;strong>支持已有servlet设施&lt;/strong>&lt;br>
支持 Servlet API 和 Filter，用户可以重用现有基于 Servlet API 的安全组件。通过实现一个 Servlet Filter，即可集成 OAuth 和 Spring Security 等安全框架。&lt;/li>
&lt;li>&lt;strong>多种方言&lt;/strong>&lt;br>
考虑到大部分用户习惯使用 SpringMVC 或 JAX-RS 进行 REST API 开发，Triple Rest 允许继续沿用这些方式定义服务，并支持大部分扩展和异常处理机制（具备原框架 80% 以上的功能）。对于追求轻量级的用户，可使用
Basic 方言，Triple 的开箱即用
REST 访问能力即基于此方言导出服务。&lt;/li>
&lt;li>&lt;strong>扩展能力强&lt;/strong>&lt;br>
提供超过 20 个 扩展点，用户不仅可以轻松实现自定义方言，还能灵活定制参数获取、类型转换、错误处理等逻辑。&lt;/li>
&lt;li>&lt;strong>开箱即用&lt;/strong>&lt;br>
REST 能力开箱即用，只需启用 Triple 协议，即具备 REST 直接访问服务能力。&lt;/li>
&lt;li>&lt;strong>高性能路由&lt;/strong>&lt;br>
路由部分采用优化的 &lt;a href="https://github.com/apache/dubbo/blob/3.3/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RadixTree.java">Radix Tree&lt;/a> 和
Zero Copy 技术，提升路由性能。&lt;/li>
&lt;li>&lt;strong>OpenAPI无缝集成(TBD)&lt;/strong>&lt;br>
即将完成 OpenAPI 集成，开箱即用支持导出 OpenAPI Schema， 引入 Swagger 依赖可直接使用 Web UI 来进行服务测试。有了 OpenAPI Schema
可使用 &lt;a href="https://www.postman.com/">Postman&lt;/a>、&lt;a href="https://apifox.com/">Apifox&lt;/a> 等API工具来管理和测试
API，利用 OpenAPI 生态可轻松实现跨语言调用。未来会进一步支持 Schema First 的方式，先和前端团队一起定义 OpenAPI, 前端基于 OpenAPI 来生成调用代码和 Mock，后端基于 OpenAPI 来生成 Stub
来开发服务，极大提升协同效率。
&lt;a name="eyypL">&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="示例">示例&lt;/h3>
&lt;p>&lt;a name="tiFyi">&lt;/a>&lt;/p></description></item><item><title>Triple 协议背压机制</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple-backpress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple-backpress/</guid><description>&lt;h2 id="概述">概述&lt;/h2>
&lt;p>背压（Backpressure）是流式通信中的核心机制，用于协调数据生产者和消费者之间的速率差异。当消费者处理数据的速度跟不上生产者发送数据的速度时，背压机制能够通知生产者放慢发送速度，从而防止内存溢出和系统崩溃。&lt;/p>
&lt;p>Triple 协议基于 HTTP/2 构建，天然支持流式通信。在 Dubbo 3.3.7 版本中，Triple 协议新增了完整的背压支持，提供了与 gRPC 兼容的 API，使开发者能够精细控制流式调用中的数据发送和接收速率。&lt;/p>
&lt;h2 id="核心概念">核心概念&lt;/h2>
&lt;h3 id="背压类型">背压类型&lt;/h3>
&lt;p>Triple 协议支持两种类型的背压控制：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &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;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>发送端背压（Send-Side Backpressure）&lt;/strong>&lt;/td>
 &lt;td style="text-align: left">控制数据发送速率，避免发送方发送过快导致接收方缓冲区溢出&lt;/td>
 &lt;td style="text-align: left">出站流量控制&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;strong>接收端背压（Receive-Side Backpressure）&lt;/strong>&lt;/td>
 &lt;td style="text-align: left">控制数据接收速率，让接收方按自己的处理能力请求数据&lt;/td>
 &lt;td style="text-align: left">入站流量控制&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="核心-api">核心 API&lt;/h3>
&lt;p>Dubbo 提供了一套与 gRPC 兼容的背压 API，位于 &lt;code>org.apache.dubbo.common.stream&lt;/code> 包下：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &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">&lt;code>CallStreamObserver&amp;lt;T&amp;gt;&lt;/code>&lt;/td>
 &lt;td style="text-align: left">背压控制的基础接口，提供 &lt;code>isReady()&lt;/code>、&lt;code>setOnReadyHandler()&lt;/code> 等方法&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;code>ClientCallStreamObserver&amp;lt;ReqT&amp;gt;&lt;/code>&lt;/td>
 &lt;td style="text-align: left">客户端背压控制接口，继承自 &lt;code>CallStreamObserver&lt;/code>，增加 &lt;code>disableAutoRequestWithInitial()&lt;/code> 方法&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;code>ServerCallStreamObserver&amp;lt;RespT&amp;gt;&lt;/code>&lt;/td>
 &lt;td style="text-align: left">服务端背压控制接口，继承自 &lt;code>CallStreamObserver&lt;/code>，增加 &lt;code>disableAutoRequest()&lt;/code> 方法&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;code>ClientResponseObserver&amp;lt;ReqT, RespT&amp;gt;&lt;/code>&lt;/td>
 &lt;td style="text-align: left">客户端响应观察者，通过 &lt;code>beforeStart()&lt;/code> 回调配置背压&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="api-分类">API 分类&lt;/h3>
&lt;p>背压 API 按使用场景分为高级 API 和低级 API：&lt;/p>
&lt;p>&lt;strong>高级 API（发送端背压）&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;code>isReady()&lt;/code> - 检查流是否准备好接收更多数据&lt;/li>
&lt;li>&lt;code>setOnReadyHandler(Runnable)&lt;/code> - 设置流变为可写状态时的回调&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>低级 API（接收端背压）&lt;/strong>&lt;/p></description></item><item><title>Triple Rest 用户手册</title><link>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/tripe-rest-manual/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3202--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/tripe-rest-manual/</guid><description>&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">注意&lt;/h4>

 从 Dubbo 3.3 版本开始，原 Rest 协议已移至 Extensions 库，由 Triple 协议来对 Rest 提供更全面的支持，如需继续使用原 Rest 协议，
可引入对应 &lt;a href="https://github.com/apache/dubbo-spi-extensions/tree/master/dubbo-rpc-extensions/dubbo-rpc-rest">dubbo-spi-extensions&lt;/a> 库依赖

&lt;/div>

&lt;h2 id="前言">前言&lt;/h2>
&lt;p>从 Dubbo 3.3 版本开始，Triple 协议重用已有的 HTTP 协议栈，实现了全面的 REST 风格服务导出能力。无需使用泛化或网关层协议转换，无需配置，用户即可通过 HTTP 协议去中心化直接访问后端的 Triple
协议服务。同时，针对高级 REST 用法，如路径定制、输出格式定制和异常处理，提供了丰富的注解和
SPI 扩展支持。其主要特性包括：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Triple协议融合&lt;/strong>&lt;br>
重用Triple原有HTTP协议栈， 无需额外配置或新增端口，即可同时支持 HTTP/1、HTTP/2 和 HTTP/3 协议的访问。&lt;/li>
&lt;li>&lt;strong>去中心化&lt;/strong>&lt;br>
可直接对外暴露 Rest API，不再依赖网关应用进行流量转发，从而提升性能，并降低因网关引发的稳定性风险。安全问题可通过应用内部扩展解决，这一实践已在淘宝内部的 MTOP 中得到验证。&lt;/li>
&lt;li>&lt;strong>支持已有servlet设施&lt;/strong>&lt;br>
支持 Servlet API 和 Filter，用户可以重用现有基于 Servlet API 的安全组件。通过实现一个 Servlet Filter，即可集成 OAuth 和 Spring Security 等安全框架。&lt;/li>
&lt;li>&lt;strong>多种方言&lt;/strong>&lt;br>
考虑到大部分用户习惯使用 SpringMVC 或 JAX-RS 进行 REST API 开发，Triple Rest 允许继续沿用这些方式定义服务，并支持大部分扩展和异常处理机制（具备原框架 80% 以上的功能）。对于追求轻量级的用户，可使用
Basic 方言，Triple 的开箱即用
REST 访问能力即基于此方言导出服务。&lt;/li>
&lt;li>&lt;strong>扩展能力强&lt;/strong>&lt;br>
提供超过 20 个 扩展点，用户不仅可以轻松实现自定义方言，还能灵活定制参数获取、类型转换、错误处理等逻辑。&lt;/li>
&lt;li>&lt;strong>开箱即用&lt;/strong>&lt;br>
REST 能力开箱即用，只需启用 Triple 协议，即具备 REST 直接访问服务能力。&lt;/li>
&lt;li>&lt;strong>高性能路由&lt;/strong>&lt;br>
路由部分采用优化的 &lt;a href="https://github.com/apache/dubbo/blob/3.3/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RadixTree.java">Radix Tree&lt;/a> 和
Zero Copy 技术，提升路由性能。&lt;/li>
&lt;li>&lt;strong>OpenAPI无缝集成(TBD)&lt;/strong>&lt;br>
即将完成 OpenAPI 集成，开箱即用支持导出 OpenAPI Schema， 引入 Swagger 依赖可直接使用 Web UI 来进行服务测试。有了 OpenAPI Schema
可使用 &lt;a href="https://www.postman.com/">Postman&lt;/a>、&lt;a href="https://apifox.com/">Apifox&lt;/a> 等API工具来管理和测试
API，利用 OpenAPI 生态可轻松实现跨语言调用。未来会进一步支持 Schema First 的方式，先和前端团队一起定义 OpenAPI, 前端基于 OpenAPI 来生成调用代码和 Mock，后端基于 OpenAPI 来生成 Stub
来开发服务，极大提升协同效率。
&lt;a name="eyypL">&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="快速开始">快速开始&lt;/h2>
&lt;p>让我们从一个简单的例子开始了解 Triple Rest。您可以直接下载已有的示例项目以快速上手，假设您已经安装好 Java、Maven 和 Git
&lt;a name="uXTNI">&lt;/a>&lt;/p></description></item></channel></rss>