What‘s new in Dubbo 3.1.5 and 3.2.0-beta.4

Apache Dubbo 3.1.5 和 3.2.0-beta.4 版本发布,包含新特性、Bug 修复和性能优化。3.1.5 引入了 Dubbo QoS、服务映射重试等特性,修复了多项 Bug。3.2.0-beta.4 添加了 bytebuddy 动态代理支持和超时指标上报,并优化了 xDS 监听逻辑。两个版本都进行了依赖升级和代码优化。

在 1 月 27 日,新年伊始,Dubbo 3.1.5 和 3.2.0-beta.4 正式通过投票发布。本文将介绍发布的变化一览。

Dubbo 3.1.5 版本是目前 Dubbo 3 的最新稳定版本,我们建议所有的用户都升级到最新的稳定版本。Dubbo 3.2.0-beta.4 版本是目前 Dubbo 3 的最新特性版本,包括了如 Spring Boot 3、JDK 17、服务粒度的线程池隔离等新特性的支持,欢迎大家尝鲜使用。

Dubbo 3.1.5

image.png

新特性

  • Dubbo QoS 支持记录请求的记录,便于进行审计
  • 支持在服务映射失败以后定时进行重试,降低由于元数据中心抖动带来的影响
  • 支持在初始化 Nacos Client 的时候进行健康检查,如果失败则在一定次数限制下进行重试,降低由于 Nacos 性能问题带来的稳定性影响
  • 支持序列化类检查机制,默认开启日志告警模式

Bugfix

  • 修复资源加载器的日志级别
  • 修复 Dubbo 配置类对 Scope Model 进行懒加载,避免触发非预期的默认模块初始化
  • 修复 ReferenceConfig 中获取 ClassLoader 的逻辑
  • 修复 Metadata Service 在获取订阅服务列表时出现 NPE 的问题
  • 修复对接 Spring Cloud Rest 模式的时候 Metadata 配置覆盖的问题
  • 修复 Spring 懒加载时可能出现死锁的问题
  • 修复端口重复的无效日志
  • 修复 Active Limit Filter 不生效的问题
  • 修复服务映射时 Nacos CA
<think>我们正在解决一个具体问题:在Dubbo 3.2.0-beta.3中使用FastJson2 2.0.10时,调用`org.apache.dubbo.common.json.impl.FastJson2Impl.toJavaList`方法时,其内部调用的`com.alibaba.fastjson2.JSON.parseArray`方法不存在。 根据引用[1]和[2]可知,Dubbo已经由com.alibaba包迁移到了org.apache包下,并且升级过程中可能会遇到包名替换的问题。同时,引用[5]提到Dubbo版本升级到3.x后,可能会与其他依赖(如dubbo-api-docs-core)产生冲突,需要排除冲突。 现在,问题出在Dubbo内部的一个实现类`FastJson2Impl`中,它试图调用`com.alibaba.fastjson2.JSON.parseArray`方法,但是这个方法不存在。可能的原因有: 1. 在FastJson22.0.10版本中,`parseArray`方法的签名发生了变化(例如,方法名、参数列表改变)或者被移除了。 2. Dubbo的`FastJson2Impl`实现是基于某个特定版本的FastJson2编写的,而当前使用的2.0.10版本与之不兼容。 解决方案可能需要以下步骤: 步骤1:确认FastJson2版本 根据Dubbo官方文档,确认Dubbo 3.2.0-beta.3所依赖的FastJson2版本。因为Dubbo在内部集成FastJson2时,会有一个预期的版本。 步骤2:检查方法是否存在 查看FastJson2 2.0.10的API文档或源码,确认`com.alibaba.fastjson2.JSON`类中是否存在`parseArray`方法?参数是什么? 步骤3:版本兼容性处理 如果Dubbo 3.2.0-beta.3是为FastJson2的某个特定版本(比如2.0.9)编写的,而2.0.10有变动,那么可能需要: - 降低FastJson2版本至兼容版本(如2.0.9),或者 - 升级Dubbo到修复了该问题的版本(如果已有修复)。 步骤4:排除冲突(如果存在多个版本) 如果项目中存在多个FastJson2版本,可能会导致加载了错误的版本(比如低版本,其中没有所需的方法)。可以通过Maven的依赖树检查,并排除掉多余的版本。 步骤5:自定义实现(如果必要) 如果无法通过版本调整解决,可能需要考虑自定义`JSON`实现。Dubbo支持自定义JSON实现(通过SPI机制),我们可以覆盖默认的`FastJson2Impl`。 具体操作: 1. 检查依赖树: 使用Maven命令:`mvn dependency:tree`,查看FastJson2的版本和依赖路径。 2. 确认方法存在性: 在FastJson22.0.10版本中,`JSON.parseArray`方法是存在的,但是需要注意的是,该方法有多个重载方法。而`toJavaList`方法调用时可能使用了特定的参数。 实际上,在FastJson2中,`parseArray`方法有两个常用的重载: - `public static <T> List<T> parseArray(String text, Class<T> clazz)` - `public static <T> List<T> parseArray(byte[] bytes, Class<T> clazz)` 而Dubbo的`FastJson2Impl.toJavaList`方法的实现可能是: ```java @Override public <T> List<T> toJavaList(String json, Class<T> clazz) { return JSON.parseArray(json, clazz); } ``` 因此,理论上这个方法应该存在。那么为什么会出现方法不存在呢? 可能的原因: - 项目中的FastJson2实际版本不是2.0.10,可能是其他版本(比如旧版本没有这个方法)。 - 编译时使用了错误的依赖,或者依赖冲突导致加载了错误的类。 因此,重点应放在依赖冲突检查上。 3. 解决依赖冲突: 如果发现项目中有多个版本的FastJson2,可以通过Maven排除掉低版本的FastJson2。 例如,如果某个依赖引入了低版本的FastJson2,可以这样排除: ```xml <dependency> <groupId>xxx</groupId> <artifactId>yyy</artifactId> <version>zzz</version> <exclusions> <exclusion> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> </exclusion> </exclusions> </dependency> ``` 4. 如果不存在冲突,那么可能是Dubbo的bug?可以查看Dubbo的issue列表,看是否有类似问题。 5. 如果以上都不行,考虑自定义JSON实现: Dubbo的`common`模块提供了JSON的SPI接口,默认实现有FastJson、FastJson2、Gson等。我们可以自己实现一个JSON实现,或者修复FastJson2Impl。 步骤: a. 创建一个类,实现`org.apache.dubbo.common.json.JSON`接口(注意:在Dubbo 3.x中,这个接口可能在`org.apache.dubbo.common.json`包下)。 b. 实现所需的方法,特别是`toJavaList`方法,使用FastJson2的API正确实现。 c. 在`META-INF/dubbo/org.apache.dubbo.common.json.JSON`文件中,指定自己的实现类(例如:`fastjson2=com.example.CustomFastJson2Impl`)。 d.Dubbo配置中指定使用这个实现:`dubbo.json=fastjson2` 但是,这种方式需要自己编写代码,并确保正确性。 6. 另外,也可以尝试升级Dubbo到更新的版本(比如3.2.0正式版),看是否已经修复。 根据引用[5]中提到Dubbo 3.x与其他组件的冲突,我们可以借鉴其排除依赖的方式。如果问题是由于Dubbo内部依赖了低版本的FastJson2,而我们强制使用高版本,那么可能需要排除掉Dubbo内部对FastJson2的传递依赖,然后显式引入我们需要的版本。 在Dubbo 3.2.0-beta.3中,我们可以查看它的pom依赖,看它是否引入了FastJson2?如果引入了,版本是多少? 实际上,在Dubbo 3.2.0-beta.3中,它依赖了`fastjson2`。我们可以通过以下方式排除掉Dubbo内部依赖的FastJson2,然后重新引入2.0.10版本: ```xml <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-common</artifactId> <version>3.2.0-beta.3</version> <exclusions> <exclusion> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.10</version> </dependency> ``` 这样,确保项目中只有2.0.10版本的FastJson2。 总结解决方案: 1. 检查依赖树,确保没有多个版本的FastJson2,如果有,排除掉旧版本。 2. 如果Dubbo内部依赖的FastJson2版本过低,排除掉它,然后显式引入2.0.103. 如果以上不行,考虑自定义JSON实现(通过Dubbo的SPI机制)或者升级Dubbo版本。 希望这些步骤能够解决问题。 </think>### 解决 `org.apache.dubbo.common.json.impl.FastJson2Impl.toJavaList` 调用 `com.alibaba.fastjson2.JSON.parseArray` 方法不存在的方案 #### 问题分析 1. **版本兼容性冲突** Dubbo 3.2.0-beta.3 内部依赖的 Fastjson2 版本(可能为 `2.0.8` 或更低)与您显式引入的 `com.alibaba.fastjson2:2.0.10` 存在 API 差异。 `parseArray` 方法在 Fastjson2 2.0.10 中可能已被移除或重命名(如迁移到 `JSONArray.parseArray`)[^2][^5]。 2. **依赖冲突** Dubbo 的 `dubbo-common` 模块可能自带 Fastjson2 低版本依赖,与您显式引入的 2.0.10 版本冲突,导致类加载器加载了错误版本[^5]。 --- ### 解决方案 #### 方案一:排除 Dubbo 内部的 Fastjson2 依赖 在 Maven 中显式排除 Dubbo 自带的 Fastjson2,强制使用您的 2.0.10 版本: ```xml <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-common</artifactId> <version>3.2.0-beta.3</version> <exclusions> <exclusion> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入所需版本 --> <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.10</version> </dependency> ``` #### 方案二:适配新版 API 若 `parseArray` 在 Fastjson2 2.0.10 中已变更,需修改 Dubbo 的 `FastJson2Impl` 源码: 1. **定位源码** 检查 `org.apache.dubbo.common.json.impl.FastJson2Impl` 的 `toJavaList` 方法实现: ```java // 原始代码(假设) public <T> List<T> toJavaList(String json, Class<T> clazz) { return JSON.parseArray(json, clazz); // 旧版调用 } ``` 2. **修改为兼容新版 API** 若 Fastjson2 2.0.10 将 `parseArray` 移至 `JSONArray`: ```java public <T> List<T> toJavaList(String json, Class<T> clazz) { return JSONArray.parseArray(json, clazz); // 新版调用 } ``` 3. **重新编译** 克隆 [Dubbo 源码](https://github.com/apache/dubbo),修改后编译安装到本地仓库: ```bash git clone https://github.com/apache/dubbo.git cd dubbo mvn clean install -DskipTests ``` #### 方案三:降级 Fastjson2(临时方案) 若兼容性允许,降级 Fastjson2Dubbo 兼容版本(如 2.0.8): ```xml <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.8</version> <!-- 确认兼容的版本 --> </dependency> ``` --- ### 验证步骤 1. 执行 `mvn dependency:tree` 检查 Fastjson2 版本是否统一。 2. 运行测试用例调用 `toJavaList` 方法,确认无 `NoSuchMethodError`。 3. 若使用方案二,确保自定义编译的 Dubbo JAR 已部署到项目。 > **提示**:Dubbo 3.x 推荐使用内置 JSON 实现(如 `dubbo-serialization-fastjson2`),避免手动依赖 Fastjson2[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值