apache/servicecomb-java-chassis

调用微服务偶发性失败

Closed this issue · 2 comments

1、微服务访问另一个服务的接口,概率性失败,失败时候的堆栈
java.lang.IllegalStateException: can not find response mapper for xxx.XxxQueryRsp, this should never happened.
at
org.apache.servicecomb.swagger.invocation.response.ResponseMapperFactorys.createResponseMapper(ResponseMapperFactorys.java:42)
at org.apache.servicecomb.swagger.engine.SwaggerEnvironment.createConsumer(SwaggerEnvironment.java:83)
at org.apache.servicecomb.provider.pojo.PojoConsumerMetaRefresher.refreshMeta(PojoConsumerMetaRefresher.java:108)
at org.apache.servicecomb.provider.pojo.PojoConsumerMetaRefresher.ensureMetaAvailable(PojoConsumerMetaRefresher.java:81)
at org.apache.servicecomb.provider.pojo.PojoConsumerMetaRefresher.getLatestMeta(PojoConsumerMetaRefresher.java:58)
at org.apache.servicecomb.provider.pojo.PojoInvocationCreator.create(PojoInvocationCreator.java:26)
at org.apache.servicecomb.provider.pojo.HandlerInvocationCaller.call(HandlerInvocationCaller.java:31)
at org.apache.servicecomb.provider.pojo.Invoker.invoke(Invoker.java:71)
at jdk.proxy2/jdk.proxy2.$Proxy112.queryThirdInfo(Unknown Source)
at xxx.XxxServiceImpl.requestThirdInfo(XxxServiceImpl.java:95)
at xxx.XxServiceImpl.lambda$queryThirdInfo$1(XxServiceImpl.java:46)
at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(Unknown Source)
at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)
at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)

2、servicecomb的版本
2.8.6

3、微服务有多个实例,有1个实例访问另一个服务的部分接口一直失败;另外的实例访问外部业务正常。

可以参考 #2187 先简单分析下是否正常加载相关的必须扩展。

1、使用jdk的线程池,异步访问外部接口
CompletableFuture.supplyAsync(() -> outService.requetXX()),线上环境,默认的类加载器appClassLoader,会导致ResponseMapperFactorys 类中,加载SPIServiceUtils.getSortedService(factoryCls)时加载出来的factory为空。
2、使用CompletableFuture.supplyAsync时,指定自定义线程池(自定义线程池使用spring的类加载器),可以规避该问题