dubbo 2.7.2 启动报错【Unsupported generic type false】排查

news/2025/3/11 0:36:55/文章来源:https://www.cnblogs.com/zktww/p/18688269

💖1.问题现象

dubbo服务启动时抛出异常Unsupported generic type false,但不影响服务正常发布。

Caused by: java.lang.IllegalArgumentException: Unsupported generic type false

📖2. 版本信息

SpringBoot 2.1.3 + Dubbo 2.7.2

👉3. 问题根因

项目中使用了Spring Boot Actuator模块,Spring Boot Actuator配置独立的管理端口时会创建特殊子上下文(项目中会存在两个上下文实例),导致dubbospring上下文刷新事件监控触发两次;
同时开启了dubbo延迟发布(dubbo.provider.delay=3000),由于dubbo 2.7.2中的BUG,两次均会进行了export动作;
同时由于dubbo 2.7.2版本中对generic的判断问题而在第二次export时抛出异常。

⭐4.分析过程

message中可以看出:Unsupported generic type falsedubbo 泛化调用配置错误告警


🌟4.1. 检查配置是否有误

检查全局中dubbo配置是否存在generic="false"

<dubbo:service generic="false" />

经过检查,项目中无该问题配置

🌟4.2. 堆栈分析

通过检查未发现人为错误配置,进一步分析异常堆栈
具体堆栈如下:

level: ERRORthreadName: mainclassName: o.a.d.c.AbstractConfig - [DUBBO] Failed to override , dubbo version: 2.7.2, current host: xxx.xxx.xxx.xxx
java.lang.reflect.InvocationTargetException: nullat sun.reflect.GeneratedMethodAccessor864.invoke(Unknown Source) ~[?:?]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_412]at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_412]at org.apache.dubbo.config.AbstractConfig.refresh(AbstractConfig.java:567) ~[dubbo-2.7.2.jar!/:2.7.2]at org.apache.dubbo.config.ServiceConfig.checkAndUpdateSubConfigs(ServiceConfig.java:304) ~[dubbo-2.7.2.jar!/:2.7.2]at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:369) ~[dubbo-2.7.2.jar!/:2.7.2]at org.apache.dubbo.config.spring.ServiceBean.export(ServiceBean.java:336) ~[dubbo-2.7.2.jar!/:2.7.2]at org.apache.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:114) ~[dubbo-2.7.2.jar!/:2.7.2]at org.apache.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:60) ~[dubbo-2.7.2.jar!/:2.7.2]at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:896) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:163) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]at com.xxx.xxx.xxx.xxx.xxxApiStartUp.main(xxxApiStartUp.java:26) ~[classes!/:?]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_412]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_412]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_412]at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_412]at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[xxx.jar:?]at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[xxx.jar:?]at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) ~[xxx.jar:?]at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) ~[xxx.jar:?]
Caused by: java.lang.IllegalArgumentException: Unsupported generic type falseat org.apache.dubbo.config.ServiceConfig.setGeneric(ServiceConfig.java:1015) ~[dubbo-2.7.2.jar!/:2.7.2]

从堆栈上可以看出在ServiceBean这里有对spring事件的监控
查看源码如下:

可以看出dubbo是在spring ApplicationContext 上下文刷新时进行了发布动作export

这里引起思考:为什么实际dubbo服务没有发布失败了?

🌟4.3. 官方issues

前往github检索官方可发现有相同的issues
https://github.com/apache/dubbo/issues/3629

🌟4.4. 源码分析

为什么export两次ServiceConfig会有问题了?

再回到dubbo源码,可以发现在export中有对generic赋默认值false的动作;
在第一次refresh后进行赋值,在第二次refresh时由于generic="false"报错

然而这里并没有结束

在前面duubo serviceBean spring上下文刷新事件的监控源码中可以看到,dubbo有对重复发布的屏蔽处理动作

那为什么还能发布两次了?

继续看该发布属性的更新可知,是在serviceConfig doExport之后更新

往上寻找调用栈可以发现:在dubbo export时有两种发布模式:直接发布、延迟发布

看过dubbo源码的同学可以看出,直接发布模式下,应该会被发布属性拦截

可以看出异步发布模式下,第一次异步发布后,第二次上下文刷新事件监控进入时发布属性会无法拦截

前往配置中心也可以看到有相关延迟发布的配置

dubbo.provider.delay=3000

到这里我们取消了延迟发布后,重启后不再报错。


虽然表象问题解决,但根本原因是为什么会触发两次发布动作了?

看源码这里是对spring ApplicationContext上下文刷新事件的监控,触发两次说明有两个个上下文实例。
可以写个工具检测输出下:

@Component
public class ContextRefreshCounter implements ApplicationListener<ContextRefreshedEvent> {private static int count = 0;@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {System.out.println("Context refreshed, total times: " + ++count);System.out.println("ApplicationContext instance: " + System.identityHashCode(event.getApplicationContext()));System.out.println("ApplicationContext id: " + event.getApplicationContext().getId());}
}

看到有两个上下文:applicationapplication:management

application是根上下文
application:managementSpring Boot Actuator 管理端点的子上下文

查看配置中心,发现有配置独立的管理端口

management.server.port=8081

由此可知由于引入了Spring Boot Actuator且配置了独立的管理端口,导致生成多个上下文实例,从而触发了多次spring上下文刷新事件的监控。

⭐5. 官方修复

后续版本官方已针对generic值的判断以及dubbo服务发布逻辑进行了优化,具体可前往github官网查看。
https://github.com/apache/dubbo


结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/875920.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Redis] Redis (5) 多核多线程模型

序 引言Redis 作为一款高性能的内存数据库,以其简单的设计和单线程模型(潜台词:单核单线程)广受欢迎。 然而,随着用户需求和数据规模的增长,单线程的架构逐渐成为 Redis 性能的瓶颈。 近年来,Redis 开始引入部分多线程机制,以提高并发性能,特别是在处理网络 I/O 和数据持…

案例分享-依赖传递引发的健康检查失败问题

背景 网关服务已成功发布,然而新创建的Pod却始终未能成功启动。在Pod的事件(Event)中,明确显示健康检查失败。但令人困惑的是,仔细查看启动日志,却未发现任何异常情况,具体情况如下图所示。 排查 既然当前问题表现为健康检查失败,那就有必要深入排查究竟是哪些关键部…

微信小程序逆向 ... 未完待续

解包 打开这个文件夹下图中,wxid_21arhynucfka22表示了不同微信号的id。打开的小程序缓存会被放入Applet文件夹中,比如图中wx31a9c726536cdacc 就是我之前打开过的 微信小程序下载的缓存。同时,在wechat目录下也存在所有账号公用的小程序缓存,公用的Applet文件夹,我们可以…

SourceMap的简单理解

什么是 SourceMap? Source Map 是一种映射文件,它可以将压缩、混淆后的代码还原回其原始的源代码。 (这种映射关系,可以准确地将编译后的代码映射回源代码。[自己理解就行]) 从而方便开发人员进行调试、错误日志收集和性能优化等工作。 它是一个以 .map 为后缀的文件。 为什么…

LamentXU 2024-2025年终总结

LamentXU 2024-2025年终总结下雪了。对于一个南方人来说,北方的雪声和爆竹味意味着年。键盘声在今天格外柔和,我终于还是开始写这篇文字了。最初我创建这个博客的原因就是想记录一下自己学习成长的足迹。而这一年的经历确实很丰富,我打算学着各个大佬的样子写个总结。整理一…

Linux 中grep命令 -F 选项使关键字按照原始字符串进行搜索

001、[root@localhost test]# ls a.txt [root@localhost test]# cat a.txt ## 测试数据 j003_mappingrate.txt KRA6 97.79% wild_mappingrate.txt KR.6 98.53% j004_mappingrate.txt KRG6 97.58% [root@localhost test]# grep "KR.6&quo…

你知道AI无法通过阅读一本好书获得灵感,对吧?

你知道AI无法通过阅读一本好书获得灵感,对吧? 人类写故事的方式和AI生成文本的方式是天差地别,完全无法相提并论。男孩与怪物的水彩画插图,授权自Deposit Photos有人曾这样问我:如果他们读了托尔金的所有书,然后写了一本关于精灵和霍比特人的书,这算盗窃吗?我笑了。 不…

语音处理 开源项目 EchoSharp

开源项目 EchoSharp(https://github.com/sandrohanea/echosharp),专为近乎实时的音频处理而设计,可为各种音频分析范围无缝编排不同的 AI 模型。EchoSharp 的架构注重灵活性和性能,通过集成语音转文本和语音活动检测组件,实现近乎实时的转录和翻译。这个开源项目目前虽然…

【重磅解密】APJifengc 语录【/重磅解密】

重磅解密APJifengc 语录我:如何评价您带领两只动物获得第一名? APJ:我是 furry。11.16我模拟 6 号,我太牛了,哦哦哦哦哦哦哦哦哦。(我不是兽。)但是我是。11.15博客园团队已经没人回了。他已经死了。11.14这不平凡博吗。(你是 furry 吗?)是是是。太是了。(补充:这种…

Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到 Guid

在软件开发中,数据库主键的选择,Guid 还是自增整数 ID,一直是一个备受开发者关注和讨论的经典话题。作为开源 ChatGPT 前端项目 Sdcb Chats 的开发者,我们在这个问题上也经历了一系列探索和演进,颇具代表性。Sdcb Chats 项目致力于打造一个强大、易用、可高度定制的 ChatG…

越界智能监测摄像机

越界智能监测摄像机将不断演进。未来,我们可以预见更多创新功能的加入,比如更强大的数据处理能力、更高效的图像识别算法以及与其他安防系统(如报警系统、无人巡逻车)的深度整合。这不仅能提升整体安保水平,还能实现信息共享,提高反应速度。加强公众对这一新兴技术的认知…

攀高行为识别摄像机

攀高行为检测识别摄像机具有显著优势。首先,其高度自动化特性大幅降低了人工监控成本,提高了工作效率;其次,通过数据记录和分析,可以为后续的安全评估和改进提供有力支持。随着科技的发展,未来的攀高行为检测识别摄像机将变得更加智能化。例如,更强大的图像处理能力、更…