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

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

ruisui883个月前 (02-03)技术分析17

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

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1187.html

标签: feign 使用
分享给朋友:

“程序员不可不学的REST服务集成,Feign实现REST调用?” 的相关文章

总结了Vue3的七种组件通信方式,别再说不会组件通信了

写在前面本篇文章是全部采用的<script setup>这种组合式API写法,相对于选项式来说,组合式API这种写法更加自由,具体可以参考Vue文档对两种方式的描述。本篇文章将介绍如下七种组件通信方式:propsemitv-modelrefsprovide/injecteventBusv...

vue 3 学习笔记 (八)——provide 和 inject 用法及原理

在父子组件传递数据时,通常使用的是 props 和 emit,父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,就需要传很多次,会很麻烦。像这种情况,可以使用 provide 和 inject 解决这种问题,不论组件嵌套...

Gitlab概览

Gitlab是开源的基于Git的仓库管理系统,也可以管理软件开发的整个生命周期,是项目管理和代码托管平台,支撑着整个DevOps的生命周期。Gitlab很容易选为GitHub,作为公司私有库管理的工具。我们可以用Gitlab Workflow来协同整个团队的软件开发管理过程。软件开发阶段Gitlab...

java调用API操作GitLab

最近需要在一个WEB项目中集成GitLab,用到了GitLab的API操作,在网上找了很久都是说直接调用GitLab的Http接口,而且API官方只有javadoc没有其它说明文档,特别记录下,以备查询。这里采用Token的认证方式,因此需要先登陆GitLab新建一个Token,创建方式如下:创建完...

gitlab简单搭建与应用

一、gitlab1、简介GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。与Github类似,GitLab能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历...

前后端分离自动化运维平台开发

运维平台采用前后端分离:前端vue,框架vue-element-admin;后端python,框架django-rest-framework.目前运维平台模块如下:1、 CMDB管理应用管理、环境管理、开发语言管理、产品项目管理、资产管理2、 构建发布持续构建、持续部署、Jar工程依赖构建3、 容器...