Spring Boot 2.1.x Spring Cloud Greenwich.SRx

一、场景

在实际开发中会存在通过不同类分离不同的业务处理,但是对外他们同属于一个大的模块,使用同一个对外暴露的 Feign Client 更为合理。如下:

image.png

不过默认 Feign Client 不支持接口多继承,会有如下报错:

Only single-level inheritance supported

image.png

二、无法多继承实现分析

在《Feign扩展点 Contract 介绍》中提到 Feign 拓展点 Contract的作用就是解析 Feign 接口,以提供Feign 远程 RPC 调用请求拼接所需要的拼接参数信息。

在 Spring Boot + Feign + Hystrix 的使用场景中,对应的 Contract实例对象为

image.png
如图,具体进行 Feign 接口解析的工作由 SpringMvcContract来完成,HystrixDelegatingContract单纯提供了集成 hystrix 后返回值的解析处理。

回顾《Feign扩展点 Contract 介绍#SpringMvcContract》 源码分析,SpringMvcContract继承自抽象模板类 BaseContract,在抽象模板类中定义了 Feign 接口只支持单接口解析,否则抛出 Only single inheritance supported:异常错误,代码如下:

image.png

思考:为什么 Feign 不允许多继承? 由于搜索能力优先,并未找到官方对此问题的看法。 个人看来,不允许多继承主要是为了防止在编码随意继承,因为使用不当导致代码耦合度过高。

三、实现 contract 增强,提供Feign 接口多继承能力

feign-contract.7z.txt
Feign 接口多继承的需求是很多开发者需要的,该问题在 Open Feign 上也有对应的 issue ,且有有相关的代码实现案例,可以直接借鉴前人的总结经验,OpenFieng issue 连接,通过直接下载 HierarchicalContract.txt获取代码实现:
image.png

只支持特殊接口多继承,其他接口不进行支持

image.png