当前位置:首页 > 技术文章 > 正文内容

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

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. 感谢大家的支持!

相关文章

2024年10 大 Linux 桌面发行版推荐

年已过半,现在是探究 2024 年最流行的 Linux 发行版的最佳时机。Linux 是一个开源操作系统,构建在 Linux 内核上,并集成了 GNU shell 实用程序、桌面环境、应用程序、包管理...

vue:组件中之间的传值(vue组件之间传参)

一、父子组件之间的传值----props/$emit1、父组件向子组件传值--props2.子组件想父组件传值-this.$emit('select',item)二、父组件向下(深层)...

Vue3开发极简入门(16):祖孙组件间通信之provide&inject

前文说了Vue的组件间关系,有父子、爷孙、其他关系。例如之前的Father、Son是父子关系,App与Son就是爷孙关系。而props的Son,与emits的Son,就是其他关系。前文的props是父...

前端React面试基础系列(React基础篇)

本文阅读8分钟,喜欢的小伙伴可以持续关系小编哦1. 什么是受控组件和非受控组件?受控组件像表单元素在用户输入时,像<input> <select>等元素需要绑定一个 chang...

用IDEA开发如何用Git快速拉取指定分支代码?

1,准备空的文件夹,git init2,关联远程仓库,git remote add origin gitlab地址3,拉取远程分支代码,git pull origin 远程分支名再用IDEA打开项目即...

程序员效率提升!使用自动化工具gitx,每周节约半小时

你是否经历过这样的折磨?一个 JIRA 需求要同时修复 dev、qa、staging 三个分支每个版本涉及 A、B、C 三个项目手动执行以下操作:从 dev 切临时分支cherry-pick 提交推送...