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

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

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

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

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的依赖:

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

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

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

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

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

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

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

Feign的源码解析

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

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

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

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

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

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

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

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

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

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

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

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

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

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

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

feign使用的注意事项,Feign实现REST调用,程序员不可不学的REST服务集成,Feign实现REST调用?,第2张

 

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/5735484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-28
下一篇 2022-12-28

发表评论

登录后才能评论

评论列表(0条)

保存