目录

1.什么是Feign?

2.Open Feign vs Spring Cloud Feign

2.1.OpenFeign

2.2.Spring Cloud Open Feign

3.Spring Cloud Feign 的使用

4.Spring Cloud Feign 的源码解析


1.什么是Feign?

Feign 的初衷是:feign makes writing java http clients easier ,可以理解为一个Http Client。

只不过这个http client 对http 请求进行了一个封装。后面我们会讲到它的一个工作方式就是处理注解,封装参数,放入到一个Http请求模板,并能解析返回的结果。

2.Open Feign vs Spring Cloud Feign

2.1.OpenFeign

OpenFeign 是最原始,最早的feign。与Spring 无关。就是一个Java的组件,封装了对http请求和响应的处理。

它的具体demo可以参考 Readme.txt

2.2.Spring Cloud Open Feign

Spring Cloud 中的微服务都是以Http 接口的形式向外提供服务。

提供Http 服务的形式有多种:

  • JDK 原生的URLConnction
  • Apache 的HttpClient
  • Spring 的RestTemplate

Spring Cloud 对Feign 也进行了增强,直接支持Hystrix 和 Ribbon,也支持SpringMVC 的注解。这样使得Feign 的使用非常方便。

3.Spring Cloud Feign 的使用

在Spring Cloud 1.XX 系列版本中,feign 没有被单独拿出来,而是放在spring-cloud-netflix 下面。依赖的pom是:


  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-feign</artifactId>
  4. </dependency>

而到了Spring Cloud 2.XX 系列版本后,feign 成为了Spring Cloud 下的一级项目,项目地址是:

https://spring.io/projects/spring-cloud-openfeign

依赖的pom是:


  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

一定要注意的版本的兼容性,否则项目会启动不了。很多错误都有可能是这种版本不兼容导致的。

现在的版本兼容状况可以参考:https://spring.io/projects/spring-cloud

Table 1. Release train Spring Boot compatibility
Release Train Boot Version

Greenwich

2.1.x

Finchley

2.0.x

Edgware

1.5.x

Dalston

1.5.x

上面的两个pom中,都没有写明version,这是因为使用Spring Cloud 都会集成dependencyManagement。这里会指定Spring-Cloud的版本。那它下面的组件版本就会和它保持一致


  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-dependencies</artifactId>
  6. <version>Finchley.SR2</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. </dependencies>
  11. </dependencyManagement>

a.首先要在主类上增加注解@EnableFeignClients


  1. @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
  2. @EnableEurekaClient
  3. @EnableFeignClients
  4. public class ConsumerApp
  5. {
  6. public static void main( String[] args )
  7. {
  8. SpringApplication.run(ConsumerApp.class,args);
  9. }
  10. }

b.声明一个调用Feign的接口,可以指定服务,接口参数,接口地址,请求方法等


  1. @FeignClient("producer-1")
  2. public interface ConsumerFeignClient {
  3. @GetMapping("/getProducerUser")
  4. String getProducerUser();
  5. }

c.服务提供者接口编写


  1. @GetMapping("/getProducerUser")
  2. public String getProducerUser(){
  3. log.info("8004 producer-1 getUser");
  4. return "8004 producer-1";
  5. }

d.将接口注入到调用处使用


  1. @Autowired
  2. private ConsumerFeignClient consumerFeignClient;
  3. @GetMapping("/getProducerUser")
  4. public String getProducerUser(){
  5. log.info("consumer getProducerUser");
  6. return consumerFeignClient.getProducerUser();
  7. }

这样就可以完成Feign 的整个调用了。

可以看到,Spring Cloud Feign 是从 Open Feign发展而来,又集成了很多自己的东西,比如对@RequestMapping,@GetMapping等的支持。

另外需要注意:

Open Feign 模式是开启Retry(重试)机制的,而Spring Cloud Feign 默认是不开启Retry 的,但支持配置打开。

4.Spring Cloud Feign 的源码解析

Feign的原理步骤可以理解为:

a.通过主类上的EnableFeignClients 注解开启FeignClient;

b.根据Feign 的规则实现接口,并加上FeignClient注解,供调用的地方注入调用;

c.程序启动后,会扫描所有FeignClient 注解的类,并将这些信息注入到IOC 容器中;

d.当b中接口被调用时,通过jdk代理,以及反射(Spring处理注解的方式),来生成具体的RequestTemplate

e.RequestTemplate 生成Reqest

f.Request 交给httpclient处理,这里的httpclient 可以是OkHttp,也可以是HttpUrlConnection 或者HttpClient

g.最后Client被封装到LoadBalanceClient类,这个类结合Ribbon 实现负载均衡

参考:

深入理解Feign之源码解析

feign client 浅谈

快速使用Spring Cloud Feign作为客户端调用服务提供者

Spring Cloud Feign原理详解的更多相关文章

  1. Spring Aop底层原理详解

    Spring Aop底层原理详解(来源于csdn:https://blog.csdn.net/baomw)

  2. Spring Cloud限流详解

    转自:https://blog.csdn.net/tracy38/article/details/78685707 在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud ...

  3. Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计

    在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...

  4. Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程

    上文,我们看了IOC设计要点和设计结构:紧接着这篇,我们可以看下源码的实现了:Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的. ...

  5. Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)

    上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...

  6. Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现

    前文,我们分析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的.本文主要介绍Spring AOP原理解析的切面实现过程(将切面类的所 ...

  7. Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建

    上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...

  8. Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现

    我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理.@pdai Spring框架系列 ...

  9. Spring框架系列(12) - Spring AOP实现原理详解之JDK代理实现

    上文我们学习了SpringAOP Cglib动态代理的实现,本文主要是SpringAOP JDK动态代理的案例和实现部分.@pdai Spring框架系列(12) - Spring AOP实现原理详解 ...

随机推荐

  1. TTMS 一个基于Java Swing的Socket通信的剧院票务管理系统

    TTMS (Theater Ticket Management System) 点我进入github TTMS全称剧院票务管理系统,分为客户端和服务器端.服务器端可以接收客户端连接请求,客户端相当于我 ...

  2. Linux基本命令学习-文件基本操作1

    关机重启 shutdown -h now #立即关机 shutdown -h 5 # 5秒后关机 #重启 shutdown -r now #立即重启 reboot halt #重启 文件相关 系统目录 ...

  3. JMeter学习笔记--录制脚本(二)

    第一步:在JMeter中添加线程组,命名为访问首页 第二步:在线程组下添加HTTP请求默认值 添加->配置元件->HTTP请求默认值,设置服务器IP和端口号(JMeter默认使用80端口号 ...

  4. PTA二叉搜索树的操作集 (30分)

    PTA二叉搜索树的操作集 (30分) 本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); BinTr ...

  5. java语言方法中定义final类型的入参有什么用意?

    无论参数是基本数据类型,还是引用数据类型,只要加了final,不好意思,该参数不可以再赋值(实参传进来给形参,就相当于初始化完成).可以防止在方法里面不小心重新赋值,造成一些不必要的麻烦!!!参考:h ...

  6. 菜鸡的Java笔记 第九 - java 接收键盘输入

    package mysterious; import java.util.Scanner; public class lianxi { public static void hhh (){ Scann ...

  7. [loj2091]小星星

    (分别用$E_{T}$和$E_{G}$表示树和图的边集) 简单分析,可以发现题目即求排列$p_{i}$的数量,满足$\forall (x,y)\in E_{T},(p_{x},p_{y})\in E_ ...

  8. 关于postman的接口登录验证问题

    1.shiro的接口登录问题 碰到需要接口登录验证的:访问项目接口地址login,找到cookie将Cookie数据放入postman的headers 中. 2.碰到 security的项目.首先把相 ...

  9. WebRTC与CSS滤镜(CSS filter)

    我们知道了如何使用WebRTC打开摄像头,可以截取视频帧并且用canvas显示出来. 本文将滤镜与视频结合.给视频加上一层滤镜.主要使用到的是filter属性. canvas与滤镜 先来看filter ...

  10. docker版本演变,安装,基本命令

    1.docker 版本信息 Docker CE在17.03版本之前叫Docker Engine,版本号从0.1.0(2013-03-23)~1.13.1(2017-02-08),详见https://d ...