共计 1044 个字符,预计需要花费 3 分钟才能阅读完成。
一、背景
最近在看在应用 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