您现在的位置是:主页 > 数据库技术 > 数据库技术

微服务调用应答返回时报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的业务逻辑代码;万一中间真的出错了,那产生的

标签:

很赞哦! ()

本栏推荐