3.1 升级至 3.2 操作指南
快速了解 Dubbo 3.2 的升级步骤与兼容性
功能修改点
1. 传递依赖变更
- Dubbo 3.2.0 版本开始默认不再在
dubbo-all
中 shadehessian-lite
的代码,而是使用传递依赖传递。如果你的应用中不需要使用hessian-lite
,可以将hessian-lite
从依赖中移除。 - Dubbo 3.2.0 版本开始在
dubbo-all
中不再传递gson
、fastjson
依赖,如果你的应用中需要使用gson
、fastjson
,请手动将gson
、fastjson
依赖添加到应用中。 - 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-serialization
为 hessian2
覆盖默认配置。(如 dubbo.provider.prefer-serialization=fastjson2,hessian2
) 如果没有特殊的需求,我们不建议仍继续使用 hessian2
。
3. 默认内部序列化工具切换
- Dubbo 3.2.0 版本开始默认内部序列化工具从
fastjson
切换为fastjson2
。
FAQ
Q1:会不会影响 RPC 请求流量?
不会。内部序列化工具为 Dubbo 内部解析参数时使用,非 RPC 传输序列化协议。
Q2:为什么要切换默认内部序列化工具?
Dubbo 3.2.0 版本开始默认传递依赖不再传递 fastjson
和 gson
。出于兼容性考虑,默认内部序列化工具切换为 fastjson2
。
Q3:如果我的环境中没有 fastjson2
,怎么办?
Dubbo 支持多种序列化框架自动切换,如果你的环境中没有 fastjson2
,Dubbo 会自动尝试切换到 fastsjon
或 gson
。
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-protection
为true
。
FAQ
Q1:关闭推空保护对我有什么影响?
在绝大部分场景下没有影响。 推空保护的目的是在注册中心出现故障并且主动推送空地址的时候,Dubbo 保留最后一批 provider 信息,以保证服务可用。 但是在大多数注册中心出现故障的时候,注册中心也不会推送空地址,只有一些特殊情况才会出现。 但如果开启推空保护,将对 Dubbo 的 Fallback 逻辑、心跳逻辑等造成较大的影响,给开发使用 Dubbo 带来困扰。
Q2:我想开启推空保护,怎么办?
如果在生产上为了高可用,需要开启推空保护,可以配置 dubbo.application.enable-empty-protection
为 true
。 目前已知开启推空保护会导致服务端应用从 2.6.x
、2.7.x
等仅支持接口级服务发现的版本升级到 3.x
之后回滚到原来版本出现异常,极端场景下会导致服务调用失败。 此外,开启推空保护后在服务端地址真的为空的时候出现较多的心跳异常、日志异常等。
最后修改 December 16, 2022: Fix check (#1736) (97972c1)