feign使用的注意事项,Feign实现REST调用

Feign 是 一 个 声 明 式 的 Web Service 客 户 端 , 它 使 得 编 写 WebService客户端更为容易。Feign受到Retrofit、JAXRS2.0、WebSocket的影响,采用声明式的API调用模式。

程序员不可不学的REST服务集成,Feign实现REST调用?

 

Feign的特征

● Feign基于声明式的REST调用方式,相比Rest-Template、HTTPClient等命令性HTTP客户端,Feign通过代理模式屏蔽了调用方与底层HTTPClient技术耦合的调用细节。Feign的调用就像使用本地方法调用完成服务的请求。

● Feign简化了请求的编写,可以动态地选择使用HTTP客户端实现,可以结合Eureka、Ribbon、Hystrix等组件实现服务发现、负载均衡、熔断等。

● Spring Cloud对Feign进行了封装,它支持可插拔的注解,所以支持Spring MVC标准注解和使用HttpMessageConverters模块做消息转换。

● Feign可以对请求进行拦截,提供HTTP模板,使用简单的注解和配置实现定义HTTP请求的参数、格式、地址等信息。它支持可插拔的HTTP编码器和解码器等。

Feign的使用方法

首先,需要在pom.xml文件中引入对Feign的依赖:

程序员不可不学的REST服务集成,Feign实现REST调用?

 

其次,创建应用主类Application,并通过@EnableFeignClients注解开启Spring Cloud Feign的支持功能:

程序员不可不学的REST服务集成,Feign实现REST调用?

 

然后,定义DemoServiceFeign接口,接口中使用@FeignClient注解指定服务名来绑定服务,之后使用Spring MVC的注解来绑定具体该服务提供的REST接口功能:

程序员不可不学的REST服务集成,Feign实现REST调用?

 

最后,创建一个RestClientServcie服务来实现对Feign客户端的调用,使用@Autowired直接注入上面定义的HelloServiceFeign实例:

程序员不可不学的REST服务集成,Feign实现REST调用?

 

程序员不可不学的REST服务集成,Feign实现REST调用?

 

Feign的源码解析

Feign是一个伪Java HTTP客户端,Feign本身不做任何请求处理。

Feign借鉴AOP设计思想,通过注解生成HTTP Request模板,从而简化HTTP API的开发。我们可以使用注解的方式定制Request API模板,分离HTTP请求使用者与具体实现。下面从注解@EnableFeignClients开始讲解,深入理解Feign声明式的HTTP客户端的调用过程。

@EnableFeignClients的主要注解声明如下:

程序员不可不学的REST服务集成,Feign实现REST调用?

 

注解@EnableFeignClients告诉Spring Boot容器扫描所有使用注解 @FeignClient 定 义 的 Feign 客 户 端 。 通 过 注 解 @Import 导 入FeignClientsRegistrar类。

FeignClientsRegistrar类实现了接口ImportBeanDefinitionRegistrar,这个接口的设计目的就是被某个实现类实现,配合@Configuration注解的使用者配置类使用,在配置类被处理时,用于额外注册一部分Bean定义,代码如下:

程序员不可不学的REST服务集成,Feign实现REST调用?

 

@EnableFeignClients注解被处理时的调用栈如下:

程序员不可不学的REST服务集成,Feign实现REST调用?

 

程序员不可不学的REST服务集成,Feign实现REST调用?

 

在程序启动后,程序会通过包扫描将由@FeignClient注解修饰的接 口 连 同 接 口 名 和 注 解 信 息 一 起 取 出 , 赋 值 给BeanDefinitionBuilder , 再 根 据 BeanDefinitionBuilder 得 到BeanDefinition,最后将BeanDefinition注入Spring IoC容器中,源码如下:

程序员不可不学的REST服务集成,Feign实现REST调用?

 

在 注 入 BeanDefinition 之 后 , 通 过 JDK 动 态 代 理 机 制 生 成FeignClient代理对象,使用FeignClient接口里面的方法时,方法会被拦截,源码在ReflectiveFeign类中,如下所示:

程序员不可不学的REST服务集成,Feign实现REST调用?

 

程序员不可不学的REST服务集成,Feign实现REST调用?

 

从 factory.create ( target , methodToHandler ) 可 以 看 出 ,InvocationHandler 实 际 委 托 给 了 methodToHandler , 而methodToHandler默认是SynchronousMethodHandler.Factory工厂类创建的,newInstance方法最终生成Feign的动态代理。

在 调 用 过 程 中 , Feign 首 先 会 通 过 代 理 对 象 调 用FeignInvocationHandler的invoke方法,代码如下:

程序员不可不学的REST服务集成,Feign实现REST调用?

 

最 终 , 在 methodToHandler 匹 配 成 功 后 , 调 用SynchronousMethodHandler类的invoke方法进行HTTP拦截。它会根据参数生成RequestTemplate对象,该对象是HTTP请求模板,其中的executeAndDecode方法会执行HTTP请求,并获取Response响应,

本文来自作者:江下科技小助手,不代表小新网立场!

转载请注明:https://www.xiaoxinys.cn/104497.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。