Stay hungry, Stay foolish

0%

Dubbo集成Feign方法名问题

问题

项目中原来使用的是 Dubbo 和 OkHttp。最近一个需求涉及到大量的 HTTP 调用,于是就用 Feign,由于 Dubbo 中本身已经添加了相应的依赖,直接把 Feign 打开即可。

没想到应用没启动起来:

直接打开DubboTransportedMethodMetadataResolver找到对应行:

Contract 是 Feign 的一个接口,而 Contract 中并没有 parseAndValidateMetadata 方法,而是 parseAndValidatateMetadata

看起来像是 Feign 里的方法名拼写错了(validate → validatate)

解决方案

这个问题解决方法有两个:

升级依赖包

  • GitHub 上找到 Contract 方法名更正的时间点

    可以看到是2019年10月22日

  • maven repository 里查看 feign-core 的版本及对应的时间

    离修改时间最近的一个版本是 10.6.0

  • 在项目中将 10.4.0 的包 exclude掉,然后再添加 10.6.0 的包即可

二、重写Resolver类

有些项目贸然升级包会引起一系列的连锁反应,如果是这样的话,可以试试第二种文案:

在项目里建一个 com.alibaba.cloud.dubbo.metadata.resolver 的包,然后把 DubboTransportedMethodMetadataResolver 这个类拷到这个包下

最后在该类中将对应的方法名替换掉

这种也非常简单,只是在项目代码里多了一个额外的包名看上去不是那么优雅

后记

问题解决了,但是原因呢?为什么项目中会引入 feign-core-10.4.0 这个有问题的包呢?

项目里使用的是 spring-cloud-starter-dubbo-2.2.1.RELEASE , 这包依赖 spring-cloud-openfeign-core-2.2.2.RELEASE , 这个包里声明的 feign-core 的版本是 10.7.4 , 说明 Dubbo 的包没有问题

问题在于项目中还使用了 spring-cloud-openfeign-dependencies-2.2.1.RELEASE

这里指定了版本 10.4.0

(完)

据说打赏我的人,代码没有BUG