您现在的位置是:主页 > 数据库技术 > 数据库技术
微服务调用应答返回时报ClassCastException问题的实例分析
IDCBT2022-01-05【服务器技术】人已围观
简介微服务调用应答返回时报ClassCastException问题的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你
微服务调用应答返回时报ClassCastException问题的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
问题描述问题复现demo在这里。
前几天被拉去看一个问题。某服务(后面称其为A服务)采用同步模式运行,RPC方式调用其他微服务。在本地调试无问题,线上运行时此服务调用另外一个服务(后面称其为B服务)的接口会报错,且通过他们自定义扩展的一个HttpClientFilter
的日志来看,被调用的provider服务已经正常返回了应答消息,但是在后面会报ClassCastException
,无法将InvocationException
转型为业务代码的返回值类型。日志如下:
// 业务逻辑被调用 [INFO] test() is called! com.github.yhs0092.blogdemo.javachassis.service.ConsumerService.test(ConsumerService.java:20) // 用户自定义的HttpClientFilter中打印了provider返回的消息 [INFO] get response, status[200], content is [{"content":"returnOK"}] com.github.yhs0092.blogdemo.javachassis.filter.PrintResponseFilter.afterReceiveResponse(PrintResponseFilter.java:26) // ClassCastException被抛出 [ERROR] invoke failed, invocation=PRODUCER rest client.consumer.test org.apache.servicecomb.swagger.invocation.exception.DefaultExceptionToResponseConverter.convert(DefaultExceptionToResponseConverter.java:35) java.lang.ClassCastException: org.apache.servicecomb.swagger.invocation.exception.InvocationException cannot be cast to com.github.yhs0092.blogdemo.javachassis.service.TestResponse at com.sun.proxy.$Proxy30.test(Unknown Source) at com.github.yhs0092.blogdemo.javachassis.service.ConsumerService.test(ConsumerService.java:21) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.servicecomb.swagger.engine.SwaggerProducerOperation.doInvoke(SwaggerProducerOperation.java:160) at org.apache.servicecomb.swagger.engine.SwaggerProducerOperation.syncInvoke(SwaggerProducerOperation.java:148) at org.apache.servicecomb.swagger.engine.SwaggerProducerOperation.invoke(SwaggerProducerOperation.java:115) at org.apache.servicecomb.core.handler.impl.ProducerOperationHandler.handle(ProducerOperationHandler.java:40)
分析问题的过程中,他们提到由于线上的B服务还是旧版本的没有升级,于是他们把A服务依赖的B服务的接口jar包替换成了低版本来启动的。
分析过程初步接触这个问题给人一种很怪异的感觉。如果一个consumer调用provider时都已经拿到了应答,那么会直接把应答返回给consumer的业务逻辑代码;万一中间真的出错了,那产生的
标签:很赞哦! ()