3.1 升级至 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
之后回滚到原来版本出现异常,极端场景下会导致服务调用失败。
此外,开启推空保护后在服务端地址真的为空的时候出现较多的心跳异常、日志异常等。
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.