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

2022-10-28 15:21:31 浏览数 (1)

Feign实现REST调用

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

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

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

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

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

Feign的源码解析

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

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

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

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

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

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

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

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

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

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

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

本文给大家讲解的内容是REST服务集成,Feign实现REST调用

  1. 下篇文章给大家讲解的内容是RPC远程过程调用,RPC框架概述
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

0 人点赞