3.1 升级至 3.2 操作指南

快速了解 Dubbo 3.2 的升级步骤与兼容性

功能修改点

1. 传递依赖变更

  • Dubbo 3.2.0 版本开始默认不再在 dubbo-all 中 shade hessian-lite 的代码,而是使用传递依赖传递。如果你的应用中不需要使用 hessian-lite,可以将 hessian-lite 从依赖中移除。
  • Dubbo 3.2.0 版本开始在 dubbo-all 中不再传递 gsonfastjson 依赖,如果你的应用中需要使用 gsonfastjson,请手动将 gsonfastjson 依赖添加到应用中。
  • Dubbo 3.2.0 版本在 dubbo-all 中传递 fastjson2 依赖。

2. 默认序列化切换

  • Dubbo 3.2.0 版本开始默认序列化方式从 hessian2 切换为 fastjson2,对于升级到 3.2.0 的应用,Dubbo 会自动尝试采用 fastjson2 进行序列化。

FAQ

Q1:会不会影响和低版本的 Dubbo 互通?

不会。与低版本互通仍使用 hessian-lite。原理可参考序列化协议升级指南一文。

Q2:为什么要切换默认序列化方式?

fastjson2 是一款高性能的序列化框架,性能优于 hessian2,原生支持 JDK17、Native 等,以及完全向前兼容 hessian2 所有功能。 由于 hessian-lite 在未来维护难度越来越大,我们决定将默认序列化方式从 hessian2 切换为 fastjson2

Q3:和原生的 JSON 是什么关系?

Dubbo 中使用 fastjson2 的 JSONB 格式,而不是原生的 JSON 格式。JSONB 格式和JSON格式对应,能完全表示JSON,是一种二进制格式。 具体协议格式可以参考:JSONB 格式

Q4:如果我不想使用 fastjson2,怎么办?

如果你不想使用 fastjson2,可以配置 prefer-serializationhessian2 覆盖默认配置。(如 dubbo.provider.prefer-serialization=fastjson2,hessian2) 如果没有特殊的需求,我们不建议仍继续使用 hessian2

3. 默认内部序列化工具切换

  • Dubbo 3.2.0 版本开始默认内部序列化工具从 fastjson 切换为 fastjson2

FAQ

Q1:会不会影响 RPC 请求流量?

不会。内部序列化工具为 Dubbo 内部解析参数时使用,非 RPC 传输序列化协议。

Q2:为什么要切换默认内部序列化工具?

Dubbo 3.2.0 版本开始默认传递依赖不再传递 fastjsongson。出于兼容性考虑,默认内部序列化工具切换为 fastjson2

Q3:如果我的环境中没有 fastjson2,怎么办?

Dubbo 支持多种序列化框架自动切换,如果你的环境中没有 fastjson2,Dubbo 会自动尝试切换到 fastsjongson

Q4:我想指定 Dubbo 内部序列化工具,怎么办?

可以配置 dubbo.json-framework.prefer 参数,如 -Ddubbo.json-framework.prefer=gson

4. Triple 协议支持传递自定义异常

  • Dubbo 3.2.0 版本开始 Triple 协议支持回传自定义异常,而不是只能回传 RpcException。如果服务接口会抛出异常的,在 Dubbo 3.2.0 版本以后将默认按照 Dubbo 协议一样回传自定义异常对象。

5. 默认关闭推空保护

  • Dubbo 3.2.0 版本开始默认关闭推空保护,即使注册中心推送空地址,Dubbo 也将不会保留最后一批 provider 信息。 如果需要开启推空保护,可以配置 dubbo.application.enable-empty-protectiontrue

FAQ

Q1:关闭推空保护对我有什么影响?

在绝大部分场景下没有影响。 推空保护的目的是在注册中心出现故障并且主动推送空地址的时候,Dubbo 保留最后一批 provider 信息,以保证服务可用。 但是在大多数注册中心出现故障的时候,注册中心也不会推送空地址,只有一些特殊情况才会出现。 但如果开启推空保护,将对 Dubbo 的 Fallback 逻辑、心跳逻辑等造成较大的影响,给开发使用 Dubbo 带来困扰。

Q2:我想开启推空保护,怎么办?

如果在生产上为了高可用,需要开启推空保护,可以配置 dubbo.application.enable-empty-protectiontrue。 目前已知开启推空保护会导致服务端应用从 2.6.x2.7.x 等仅支持接口级服务发现的版本升级到 3.x 之后回滚到原来版本出现异常,极端场景下会导致服务调用失败。 此外,开启推空保护后在服务端地址真的为空的时候出现较多的心跳异常、日志异常等。

最后修改 December 16, 2022: Fix check (#1736) (97972c1)