dubbo2.x 每次ReferenceBean初始化完成后都执行ReferenceBean#prepareDubboConfigBeans
在Dubbo3.0中有一个关于这块内容的优化,主要是为了修复功能缺陷,而不是为了解决性问题,这个性能问题其实也只有在ReferenceBean数量足够多的时候才会出现。但按照这个思路,应该是可以顺便解决性能问题的。 Improve dubbo config beans and bootstrap initialization、Dubbo3 Spring相关优化
全新通信协议Triple 让跨语言RPC迈了一大步,支持点对点调用、stream 流式调用。写proto IDL 文件可生成各类客户端代码,完全兼容grpc
dubbo2.x 默认使用的是hessian2序列化方式, dubbo3.2 中默认使用的是fastjson2序列化,
原因:可能是认为fastjson2性能比较高,
官方序列化协议变更方案: 序列化协议升级
Protostuff序列化的maven坐标变更, 放在了单独的github 仓库,
https://github.com/apache/dubbo-spi-extensions/tree/master/dubbo-serialization-extensions
<dependency>
<groupId>org.apache.dubbo.extensionsgroupId>
<artifactId>dubbo-serialization-protostuffartifactId>
<version>1.0.1version>
dependency>
dubbo.nacos-service-discovery.use-default-group=false
全局属性值忽略该功能在 Dubbo 3.2.0 版本中,Dubbo 将默认开启序列化白名单的强校验,以提升 Dubbo 的安全性,避免远程命令执行的问题。 对于一些使用了泛型等可能存在扫描不全或者是服务规模较大的用户,
建议添加 -Ddubbo.application.serialize-check-status=WARN
配置。 观察一段时间后(通过日志、QoS 命令),如果没有触发安全告警,则可以配置强校验模式。
关于自定义白名单的配置,可以参考官网的dubbo类检查机制
由于 Java 本身机制的问题,Dubbo 支持的非 IDL 序列化天然允许访问任意类,这将可能导致远程命令执行(RCE)风险。
建议所有用户在升级 Dubbo 3.2.0 版本前添加 -Ddubbo.application.serialize-check-status=WARN
配置以保证最佳的兼容性。否则可能导致线上数据异常的情况!
Dubbo 3.2.0 版本开始默认关闭推空保护,即使注册中心推送空地址,Dubbo 也将不会保留最后一批 provider 信息。 如果需要开启推空保护,可以配置 dubbo.application.enable-empty-protection=true
。
在绝大部分场景下没有影响。 推空保护的目的是在注册中心出现故障并且主动推送空地址的时候,Dubbo 保留最后一批 provider 信息,以保证服务可用。 但是在大多数注册中心出现故障的时候,注册中心也不会推送空地址,只有一些特殊情况才会出现。 但如果开启推空保护,将对 Dubbo 的 Fallback 逻辑、心跳逻辑等造成较大的影响,给开发使用 Dubbo 带来困扰。
如果在生产上为了高可用,需要开启推空保护,可以配置 dubbo.application.enable-empty-protection=true
。 目前已知开启推空保护会导致服务端应用从 2.6.x、2.7.x 等仅支持接口级服务发现的版本升级到 3.x 之后回滚到原来版本出现异常,极端场景下会导致服务调用失败。 此外,开启推空保护后在服务端地址真的为空的时候出现较多的心跳异常、日志异常等。
如果使用 Nacos 作为注册中心,由于 Nacos 特性支持的原因,在升级到 Dubbo 3.x 之前需要将 Nacos Server 升级到 2.x(参考文档https://nacos.io/zh-cn/docs/v2/upgrading/2.0.0-upgrading.html
),然后再将应用的 Nacos Client 也对应升级。如果使用 Zookeeper 注册中心则不需要处理。
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubboartifactId>
<version>3.2.4version>
<exclusions>
<exclusion>
<groupId>com.alibaba.fastjson2groupId>
<artifactId>fastjson2artifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>3.2.4version>
dependency>
dubbo.application.register-mode
服务端提供者服务的注册模式 可选值有
instance
只注册实例应用级all
接口级+应用级均注册interface
只注册接口级all
配置 开启接口级
+应用级
注册服务有注册模式 那么消费端肯定也有服务订阅发现模式设置
dubbo.application.service-discovery.migration
消费端订阅模式可选值有
APPLICATION_FIRST
双订阅 即接口模式/应用级模式 智能决策 一般用于2.7.x与3.x 升级中 共存阶段 也是3.x版本默认的订阅模式, 运行时根据阈值和灰度流量比例动态决定调用流量走向FORCE_APPLICATION
仅应用级订阅模式FORCE_INTERFACE
仅接口级订阅模式all
, 即应用级
+接口级
,这样2.7.x消费端也能够根据接口服务发现FORCE_INTERFACE
只订阅接口模式, 不采用官网推荐的APPLICATION_FIRST
混合模式原因是: 混合模式可能出现流量偏移FORCE_APPLICATION
dubbo3为了做到应用级别发现, 对dubbo 接口和应用名通过元数据中心作了映射
在dubbo2和dubbo3共存期间, 注册的元数据信息会增长, 双注册带来的资源消耗
双注册不可避免的会带来额外的注册中心存储压力,但考虑到应用级地址发现模型的数据量在存储方面的极大优势,即使对于一些超大规模集群的用户而言,新增的数据量也并不会带来存储问题。总体来说,对于一个普通集群而言,数据增长可控制在之前数据总量的 1/100 ~ 1/1000
以一个中等规模的集群实例来说: 2000 实例、50个应用(500 个 Dubbo 接口,平均每个应用 10 个接口)。
假设每个接口级 URL 地址平均大小为 5kb,每个应用级 URL 平均大小为 0.5kb
在跨版本升级的过程中,存在的风险点从大到小分别有:直接修改 Dubbo 源码 -> 基于 Dubbo SPI 扩展点进行扩展 -> 基于 API 或者 Spring 的使用方式
dubbo 2.7中也有应用级别服务发现, 要先关闭
对于 SPI 扩展的,除了应用级服务方向和 EventDispatcher 两个机制在 3.x 中做了破坏性的修改,在 2.7.x 中提供的绝大多数的扩展在 3.x 中也都提供。此部分需要关注的有两个方面:
在发布的过程中,有以下几个维度的指标可以判断升级是否出现问题。
官网文档 dubbo 2.x 升级至 3.x
dubbo3升级案例