一、背景

最近在看在使用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

Spring父子上下文的使用案例的更多相关文章

  1. Spring父子上下文(WebApplicationContext)(防止事务失效)

    如果你使用了listener监听器来加载配置,一般在Struts+Spring+Hibernate的项目中都是使用listener监听器的.如下 <listener> <listen ...

  2. spring的父子上下文容器及配置

    本文由作者张远道授权网易云社区发布. spring父子容器 spring总的上下文容器有父子之分.父容器和子容器.父容器对子容器可见,子容器对父容器不可见. 对于传统的spring mvc来说,spr ...

  3. 1、Spring简介及IOC入门案例

    一.Spring框架介绍 1.介绍 Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务 ...

  4. 获取Spring的上下文环境ApplicationContext的方式

    摘自: http://blog.csdn.net/yang123111/article/details/32099329 获取Spring的上下文环境ApplicationContext的方式 Web ...

  5. 一种获取spring环境上下文方法:SpringContextUtil

    获得spring里注册Bean的有好几种方法,这里介绍一种比较简单的方法: import org.springframework.beans.BeansException; import org.sp ...

  6. 获取spring容器上下文(webApplicationContext)的几种方法

    在很多情况,我们需要先获取spring容器上下文,即webApplicationContext,然后通过webApplicationContext来获取其中的bean.典型的情况是,我想在一个并未委托 ...

  7. Spring MVC 上下文(ApplicationContext)初始化入口

    Spring 常用上下文容器有哪些 ApplicationContext ClassPathXmlApplicationContext ApplicationContext context = new ...

  8. 怎么随时获取Spring的上下文ApplicaitonContext,和Spring管理的Bean

    BeanFactory接口 Interface BeanFactory getBean <T> T getBean(String name, Class<T> required ...

  9. Spring Kafka整合Spring Boot创建生产者客户端案例

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 创建一个kafka-producer-master的maven工程.整个项目结构如下: ...

随机推荐

  1. API:获取当前用户的公网IP

    在vue项目根目录下" public " 文件夹中的index.html,也就是根节点所在的文件引入JS,vue项目中静态文件需要在这里引入,用 script 标签规避跨域 < ...

  2. Sentry Web 前端监控 - 最佳实践(官方教程)

    系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...

  3. 【第八篇】- Git 查看提交历史之Spring Cloud直播商城 b2b2c电子商务技术总结

    ​ Git 查看提交历史 Git 提交历史一般常用两个命令: git log 在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看. 针对 ...

  4. PHP的OpenSSL加密扩展学习(二):非对称加密

    上篇文章,我们了解了关于对称和非对称加密的一些相关的理论知识,也学习了使用 OpenSSL 来进行对称加密的操作.今天,我们就更进一步,学习 OpenSSL 中的非对称加密是如何实现的. 生成私钥 通 ...

  5. 让tp6显示详细的错误信息及行号

    方法一:默认情况下Ttp6不会显示错误信息,在开发环境下想要查看错误信息需要将Config目录下的app.php文件的show_error_msg改成true 但是这样显示的信息也不够完整, 要看到更 ...

  6. Linux系类(8) - 文件搜索命令locate

    文件搜索命令locate 命令格式 locate [文件名] 在后台数据库中按文件名搜索,搜索速度更快,而find.which是遍历所有目录去查找:后台数据库在/var/lib/mlocate (保存 ...

  7. 重启ubuntu系统VMware tools失效处理方法

    1) sudo apt-get autoremove open-vm-tools 2) Install VMware Tools by following the usual method (Virt ...

  8. Maven项目创建与配置(二)

    项目配置 1:添加Source Folder 右击项目>NEW>Source Folder maven规定必须创建一下几个Source Folder src/main/resources ...

  9. vue 主次页面区分

    1.路由设定,增加meta参数 { path: '/', name: 'Home', component: Home, meta: { index: 0, showFooter: true //由这个 ...

  10. c++ 的学习 第二集函数的重载

    1. 规则 函数名相同参数个数不同.参数类型不同.参数顺序不同 2. 注意 返回值类型与函数重载无关 调用函数时,实参的隐式类型转换可能会产生二义性 返回值类型与函数重载无关 什么意思? 返回 ...