一、背景
最近在看在应用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