<?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-3203--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/serialization/</link><description>Recent content in 序列化 on Apache Dubbo</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://deploy-preview-3203--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/serialization/index.xml" rel="self" type="application/rss+xml"/><item><title>Dubbo 序列化机制介绍</title><link>https://deploy-preview-3203--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/serialization/serialization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3203--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/serialization/serialization/</guid><description>&lt;h2 id="支持的协议列表">支持的协议列表&lt;/h2>
&lt;p>以下是 Dubbo 框架支持的序列化协议列表，根据 &lt;code>triple&lt;/code>、&lt;code>dubbo&lt;/code> RPC 通信协议进行分类。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">&lt;span style="display:inline-block;width:100px">RPC协议&lt;/span>&lt;/th>
 &lt;th style="text-align: left">&lt;span style="display:inline-block;width:100px">编程模式&lt;/span>&lt;/th>
 &lt;th style="text-align: left">&lt;span style="display:inline-block;width:100px">序列化协议&lt;/span>&lt;/th>
 &lt;th style="text-align: left">&lt;span style="display:inline-block;width:200px">配置方式&lt;/span>&lt;/th>
 &lt;th style="text-align: left">JDK版本&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">IDL&lt;/td>
 &lt;td style="text-align: left">protobuf、&lt;br/>protobuf-json&lt;/td>
 &lt;td style="text-align: left">默认值&lt;/td>
 &lt;td style="text-align: left">8, 17, 21&lt;/td>
 &lt;td style="text-align: left">使用 IDL 时的默认序列化方式，client 也可以选择 protobuf-json 序列化通信，无需额外配置&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;/td>
 &lt;td style="text-align: left">Java接口&lt;/td>
 &lt;td style="text-align: left">protobuf-wrapper&lt;/td>
 &lt;td style="text-align: left">serialization=&amp;ldquo;hessian&amp;rdquo;&lt;/td>
 &lt;td style="text-align: left">8, 17, 21&lt;/td>
 &lt;td style="text-align: left">这种模式下采用的是两次序列化模式，即数据先被 hessian 序列化，再由 protobuf 序列化。&lt;br/>&lt;br/>为了支持与 IDL 同等的调用模型，易用性较好但性能略有下降&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">Java接口&lt;/td>
 &lt;td style="text-align: left">hessian&lt;/td>
 &lt;td style="text-align: left">默认值，serialization=&amp;ldquo;hessian&amp;rdquo;&lt;/td>
 &lt;td style="text-align: left">8, 17, 21&lt;/td>
 &lt;td style="text-align: left">dubbo 协议默认序列化方式，具备兼容性好、高性能、跨语言的优势(java、go、c/c++、php、python、.net)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;/td>
 &lt;td style="text-align: left">Java接口&lt;/td>
 &lt;td style="text-align: left">protostuff&lt;/td>
 &lt;td style="text-align: left">serialization=&amp;ldquo;protostuff&amp;rdquo;&lt;/td>
 &lt;td style="text-align: left">8&lt;/td>
 &lt;td style="text-align: left">A java serialization library with built-in support for forward-backward compatibility (schema evolution) and validation.&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;/td>
 &lt;td style="text-align: left">Java接口&lt;/td>
 &lt;td style="text-align: left">gson&lt;/td>
 &lt;td style="text-align: left">serialization=&amp;ldquo;gson&amp;rdquo;&lt;/td>
 &lt;td style="text-align: left">8, 17, 21&lt;/td>
 &lt;td style="text-align: left">谷歌推出的一款 json 序列化库&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;/td>
 &lt;td style="text-align: left">Java接口&lt;/td>
 &lt;td style="text-align: left">avro&lt;/td>
 &lt;td style="text-align: left">serialization=&amp;ldquo;avro&amp;rdquo;&lt;/td>
 &lt;td style="text-align: left">8, 17, 21&lt;/td>
 &lt;td style="text-align: left">一款 Java 高性能序列化库&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;/td>
 &lt;td style="text-align: left">Java接口&lt;/td>
 &lt;td style="text-align: left">msgpack&lt;/td>
 &lt;td style="text-align: left">serialization=&amp;ldquo;msgpack&amp;rdquo;&lt;/td>
 &lt;td style="text-align: left">8, 17, 21&lt;/td>
 &lt;td style="text-align: left">具备兼容性好，提供多语言（Java、C/C++、Python等）实现等优势&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;/td>
 &lt;td style="text-align: left">Java接口&lt;/td>
 &lt;td style="text-align: left">kryo&lt;/td>
 &lt;td style="text-align: left">serialization=&amp;ldquo;kryo&amp;rdquo;&lt;/td>
 &lt;td style="text-align: left">8, 17, 21&lt;/td>
 &lt;td style="text-align: left">Kryo是一种非常成熟的序列化实现，已经在Twitter、Groupon、Yahoo以及多个著名开源项目（如Hive、Storm）中广泛的使用。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;/td>
 &lt;td style="text-align: left">Java接口&lt;/td>
 &lt;td style="text-align: left">fastjson2&lt;/td>
 &lt;td style="text-align: left">serialization=&amp;ldquo;fastjson2&amp;rdquo;&lt;/td>
 &lt;td style="text-align: left">8, 17, 21&lt;/td>
 &lt;td style="text-align: left">fastjson&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;/td>
 &lt;td style="text-align: left">Java接口&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;a href="https://github.com/apache/dubbo-spi-extensions/tree/master/dubbo-serialization-extensions">dubbo-spi-extensions&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="性能对比报告">性能对比报告&lt;/h2>
&lt;p>序列化对于远程调用的响应速度、吞吐量、网络带宽消耗等起着至关重要的作用，是我们提升分布式系统性能的最关键因素之一。&lt;/p></description></item><item><title>序列化协议升级</title><link>https://deploy-preview-3203--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/serialization/serialization-upgrade/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3203--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/reference-manual/serialization/serialization-upgrade/</guid><description>&lt;p>在 &lt;code>3.1.0&lt;/code> 版本中，Dubbo 默认支持的序列化协议新增对 Fastjson2 的支持。部分用户可能会考虑在现有的系统中对序列化协议进行升级，但服务端和客户端版本的差异可能导致客户端并不支持服务端的序列化协议。&lt;/p>
&lt;p>在 &lt;code>3.2.0&lt;/code> 版本中, Dubbo 的服务端引入新的配置 &lt;code>prefer-serialization&lt;/code>，该特性可以完美解决服务端序列化升级过程中可能带来的风险。&lt;/p>
&lt;h3 id="最佳实践">最佳实践&lt;/h3>
&lt;p>序列化协议升级，需要分两步走：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>首先需要推动服务端的序列化协议升级，同时在服务端的暴露配置中需要添加 &lt;code>prefer-serialization&lt;/code> 配置。&lt;/strong>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>比如：升级前的序列化协议是 hessian2，升级之后的序列化协议是 Fastjson2 那么在服务端的暴露配置中就应该添加如下所示的配置。&lt;/p>
&lt;/blockquote>
&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>dubbo.provider.prefer-serialization=fastjson2,hessian2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dubbo.provider.serialization=hessian2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>其次，客户端需要升级至和服务端相同版本&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h3 id="实现原理">实现原理&lt;/h3>
&lt;p>dubbo 客户端序列化协议是根据服务端的注册配置来选择的（即服务端的&lt;code>serialization&lt;/code>配置）。在请求阶段 dubbo 会把客户端的序列化协议组装到请求头上，服务端在进行反序列化时会根据请求头来确定反序列化协议。所以，如果服务端和客户端的版本不一致就可能会出现客户端序列化不了的情况。&lt;/p>
&lt;p>为了解决这个情况，&lt;code>3.2.0&lt;/code> 在客户端序列化的时候会优先使用 &lt;code>prefer-serialization&lt;/code> 配置的协议，如果不支持 &lt;code>prefer-serialization&lt;/code> 相关的协议，才会使用 &lt;code>serialization&lt;/code> 配置的协议。（可以把 &lt;code>serialization&lt;/code> 理解为一个兜底的配置）&lt;/p></description></item></channel></rss>