<?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/reference/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/reference/protocols/index.xml" rel="self" type="application/rss+xml"/><item><title>Triple 协议设计理念与规范</title><link>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/reference/protocols/triple-spec/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/reference/protocols/triple-spec/</guid><description>&lt;h2 id="1-协议设计理念">1 协议设计理念&lt;/h2>
&lt;p>Triple 协议的设计参考了 gRPC、gRPC-Web、通用 HTTP 等多种协议模式，吸取每个协议各自的特性和优点，最终设计成为一个易于浏览器访问、完全兼容 gRPC 且支持 Streaming 通信的协议，Triple 支持同时运行在 HTTP/1、HTTP/2 协议之上。&lt;/p>
&lt;p>Triple 协议的设计目标如下：&lt;/p>
&lt;ul>
&lt;li>Triple 设计为对人类、开发调试友好的一款基于 HTTP 的协议，尤其是对 unary 类型的 RPC 请求。&lt;/li>
&lt;li>完全兼容基于 HTTP/2 的 gRPC 协议，因此 Dubbo Triple 协议实现可以 100% 与 gRPC 体系互调互通。&lt;/li>
&lt;li>仅依赖标准的、被广泛使用的 HTTP 特性，以便在实现层面可以直接依赖官方的标准 HTTP 网络库。&lt;/li>
&lt;/ul>
&lt;p>当与 Protocol Buffers 一起使用时（即使用 IDL 定义服务），Triple 协议可支持 unary、client-streaming、server-streaming 和 bi-streaming RPC 通信模式，支持二进制 Protobuf、JSON 两种数据格式 payload。 Triple 实现并不绑定 Protocol Buffers，比如你可以使用 Java 接口定义服务，Triple 协议有对这种模式的扩展 Content-type 支持。&lt;/p>
&lt;h2 id="2-示例">2 示例&lt;/h2>
&lt;h3 id="21-unary-请求">2.1 Unary 请求&lt;/h3>
&lt;p>以 HTTP/1 请求为例，目前 HTTP/1 协议仅支持 Unary RPC，支持使用 application/proto 和 application/json 编码类型，使用方式与 REST 风格请求保持一致，同时响应也包含常规的 HTTP 响应编码（如 200 OK）。&lt;/p></description></item><item><title>Triple 协议优势与目标</title><link>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/reference/protocols/triple/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/reference/protocols/triple/</guid><description>&lt;h2 id="简介">简介&lt;/h2>
&lt;p>Triple 协议是 Dubbo3 设计的基于 HTTP 的 RPC 通信协议规范，它完全兼容 gRPC 协议，支持 Request-Response、Streaming 流式等通信模型，可同时运行在 HTTP/1 和 HTTP/2 之上。&lt;/p>
&lt;p>Dubbo 框架提供了 Triple 协议的多种语言实现，它们可以帮助你构建浏览器、gRPC 兼容的 HTTP API 接口：你只需要定义一个标准的 Protocol Buffer 格式的服务并实现业务逻辑，Dubbo 负责帮助生成语言相关的 Server Stub、Client Stub，并将整个调用流程无缝接入如路由、服务发现等 Dubbo 体系。Go、Java 等语言的 Triple 协议实现原生支持 HTTP/1 传输层通信，相比于 gRPC 官方实现，Dubbo 框架提供的协议实现更简单、更稳定，帮助你更容易的开发和治理微服务应用。&lt;/p>
&lt;p>针对某些语言版本，Dubbo 框架还提供了更贴合语言特性的编程模式，即不绑定 IDL 的服务定义与开发模式，比如在 Dubbo Java 中，你可以选择使用 Java Interface 和 Pojo 类定义 Dubbo 服务，并将其发布为基于 Triple 协议通信的微服务。&lt;/p>
&lt;h2 id="协议规范specification">协议规范(Specification)&lt;/h2>
&lt;p>基于 Triple 协议，你可以实现以下目标：&lt;/p>
&lt;h3 id="当-dubbo-作为-client-时">当 Dubbo 作为 Client 时&lt;/h3>
&lt;p>Dubbo Client 可以访问 Dubbo 服务端 (Server) 发布的 Triple 协议服务，同时还可以访问标准的 gRPC 服务端。&lt;/p></description></item><item><title>Dubbo2 协议规范</title><link>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/reference/protocols/tcp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/reference/protocols/tcp/</guid><description>&lt;p>&lt;img alt="/dev-guide/images/dubbo_protocol_header.jpg" src="https://deploy-preview-3199--dubbo.netlify.app/imgs/dev/dubbo_protocol_header.png">&lt;/p>
&lt;h2 id="协议规范-specification">协议规范 Specification&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>Magic - Magic High &amp;amp; Magic Low (16 bits)&lt;/p>
&lt;p>标识协议版本号，Dubbo 协议：0xdabb&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Req/Res (1 bit)&lt;/p>
&lt;p>标识是请求或响应。请求： 1; 响应： 0。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>2 Way (1 bit)&lt;/p>
&lt;p>仅在 Req/Res 为1（请求）时才有用，标记是否期望从服务器返回值。如果需要来自服务器的返回值，则设置为1。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Event (1 bit)&lt;/p>
&lt;p>标识是否是事件消息，例如，心跳事件。如果这是一个事件，则设置为1。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Serialization ID (5 bit)&lt;/p>
&lt;p>标识序列化类型：比如 fastjson 的值为6。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Status (8 bits)&lt;/p>
&lt;p>仅在 Req/Res 为0（响应）时有用，用于标识响应的状态。&lt;/p>
&lt;ul>
&lt;li>20 - OK&lt;/li>
&lt;li>30 - CLIENT_TIMEOUT&lt;/li>
&lt;li>31 - SERVER_TIMEOUT&lt;/li>
&lt;li>40 - BAD_REQUEST&lt;/li>
&lt;li>50 - BAD_RESPONSE&lt;/li>
&lt;li>60 - SERVICE_NOT_FOUND&lt;/li>
&lt;li>70 - SERVICE_ERROR&lt;/li>
&lt;li>80 - SERVER_ERROR&lt;/li>
&lt;li>90 - CLIENT_ERROR&lt;/li>
&lt;li>100 - SERVER_THREADPOOL_EXHAUSTED_ERROR&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Request ID (64 bits)&lt;/p></description></item><item><title>HTTP 协议规范</title><link>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/reference/protocols/http/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3199--dubbo.netlify.app/zh-cn/overview/reference/protocols/http/</guid><description>&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">注意&lt;/h4>

 从 Dubbo 3.3 版本开始，Rest 协议已移至 Extensions 库，由 Triple 协议来对 Rest 提供更全面的支持，具体参见 &lt;a href="../../../mannual/java-sdk/reference-manual/protocol/tripe-rest-manual/">Triple Rest用户手册&lt;/a>，
如需继续使用原 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="什么是-dubbo-http">什么是 Dubbo Http&lt;/h2>
&lt;p>基于 spring web 和 resteasy 注解编码风格，通过http协议进行服务间调用互通，dubbo protocol扩展实现的协议&lt;/p>
&lt;h2 id="为什么选择dubbo-http">为什么选择Dubbo Http&lt;/h2>
&lt;ul>
&lt;li>dubbo http 可以实现微服务与dubbo之间的互通&lt;/li>
&lt;li>多协议发布服务，可以实现服务协议的平滑迁移&lt;/li>
&lt;li>http的通用性，解决跨语言互通&lt;/li>
&lt;li>最新版本的http 无需添加其他组件，更轻量&lt;/li>
&lt;li>resteasy以及spring web的编码风格，上手更快&lt;/li>
&lt;/ul>
&lt;h2 id="协议规范">协议规范&lt;/h2>
&lt;ul>
&lt;li>Request&lt;/li>
&lt;/ul>
&lt;p>相对于原生的http协议dubbo http 请求增加version和group两个header用于确定服务的唯一,
如果provider一端没有声明group和version,http请求时就不需要传递这连个header,反之必须要传递目标
服务的group和version, 如果使用dubbo http的RestClient这两个header将会默认通过attachment传递
为区别于其他的header，attachment将会增加rest-service-前缀，因此通过其他形式的http client调用
dubbo http服务需要传递 rest-service-version 和 rest-service-group 两个header&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-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>POST /test/path HTTP/1.1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Host: localhost:8080
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Content-type: application/json
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Accept: text/html
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rest-service-version: 1.0.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rest-service-group: dubbo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&amp;#34;name&amp;#34;:&amp;#34;dubbo&amp;#34;,&amp;#34;age&amp;#34;:10,&amp;#34;address&amp;#34;:&amp;#34;hangzhou&amp;#34;}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Response&lt;/li>
&lt;/ul>
&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-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>HTTP/1.1 200
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Content-Type: text/html
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Content-Length: 4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Date: Fri, 28 Apr 2023 14:16:42 GMT
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;#34;success&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>content-type支持
&lt;ul>
&lt;li>application/json&lt;/li>
&lt;li>application/x-www-form-urlencoded&lt;/li>
&lt;li>text/plain&lt;/li>
&lt;li>text/xml&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>目前支持以上media，后面还会对type进行扩展&lt;/p></description></item></channel></rss>