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 之后回滚到原来版本出现异常,极端场景下会导致服务调用失败。
此外,开启推空保护后在服务端地址真的为空的时候出现较多的心跳异常、日志异常等。
