一、背景

最近在看在应用Spring Cloud的时候发现,当咱们通过Feign去调用别的微服务时,当咱们有多个Feign客户端(比方:用户微服务、商品微服务)时,是能够为每个Feign客户端配置不同的实现,比方:用户微服务应用Feign默认的契约,而商品微服务能够应用Spring MVC 的契约格局,那么这个是怎么实现的呢?此处咱们写一个简略的例子来模仿一下。

二、需要

假如咱们存在一个 CommonApi的接口,用户微服务(user)和咱们的调用方别离实现这个接口,实现不同的性能,而咱们的产品微服务(product)不实现这个接口,默认采纳调用方的实现。

调用方(父上下文)    实现 CommonApi 接口,兜底实现,如果被调用方没实现,则采纳这个,否则采纳被调用方本人的逻辑。    user微服务(子上下文)    实现 CommonApi 接口    product微服务(子上下文)    不实现 CommonApi 接口。

在调用方,会同时调用 user微服务和product微服务 中的 CommonApi 接口,当被调用方本人实现了CommonApi接口时,应用被调用方本人的逻辑,如果被调用方没有实现,则应用调用方本人的逻辑。

即咱们要实现的成果:

1、在调用方程序中,本人的上下文中获取到的 CommonApi 是调用方本人实现的。

2、在调用方程序中,应用 用户服务 的上下文中获取到的 CommonApi 是用户服务实现。

3、在调用方程序中,应用 商品服务 的上下文中获取到的 CommonApi 是调用方实现的,因为商品服务本人没有实现。

如果咱们把 CommonApi了解为Feign中的feign.Contract,那么在 用户服务 中就是咱们批改了Feign默认的Contract,而 产品服务 就是应用的默认的Contract。

三、实现步骤

1、根底代码编写

2、测试后果

四、小彩蛋

Spring Cloud OpenFeign中父子上下文的实现。

FeignContext 实现了 NamedContextFactory接口,NamedContextFactory中有个org.springframework.cloud.context.named.NamedContextFactory#createContext办法,能够看到父子上下文是如何建设的。

五、残缺代码

代码链接:https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/spring-parent-child-context