【Spring Cloud系列】Feign详解与实战

news2024/9/26 1:23:47

Feign详解与实战

文章目录

  • Feign详解与实战
    • 一、概述
    • 二、什么是Feign
    • 三、Feign特性
    • 四、Feign简单使用
      • 3.1 Feign使用步骤
      • 3.2 Feign具体使用
          • 1. 引入依赖
          • 2. 启动类上添加注解
          • 3.编写FeignClient接口
    • 五、使用Feign发起http请求
      • 5.1 Maven导入Feign配置,并集成Jackson
      • 5.2 Feign发送路径和方法设置
      • 5.3 调用Feign.bulider()指定请求uri并且调用接口中的方法
    • 六、Feign接口常用注解
    • 七、Feign接口与常用注解
      • 7.1 target方法
      • 7.2 client方法
      • 7.3 options方法
      • 7.4 retryer方法
      • 7.5 encoder()/decode()方法
      • 7.6 logger() logLevel()
      • 7.7 @EnableFeignClients
      • 7.8 @FeignClient
      • 7.9 value,name
      • 7.10 serviceId
      • 7.11 contextId
      • 7.12 url
      • 7.13 decode404
      • 7.14 configuration
      • 7.15 fallback
      • 7.16 fallbackFactory
      • 7.17 path
      • 7.18 primary
      • 7.19 qualifier
    • 八、Feign的日志级别
      • 8.1 Feign的日志级别
      • 8.2 Feign日志配置方法
        • 配置类全局配置
        • 配置类局部配置
        • 配置文件指定微服务配置
    • 九、Feign原理
      • 4.1 Feign服务调用的工作原理可以总结为以下几个步骤:
      • 4.2 Feign整体流程图
    • 十、Feign与Ribbon异同
      • Fegin与Ribbon的两者的区别
    • 十一、Feign与RestTemplate异同
      • RestTemplate
      • Feign
    • 十二、Feign和OpenFeign异同
      • 相同点
      • 不同点

一、概述

在前一章介绍了Ribbon的用法,在使用Ribbon是通过RestTemplate调用其他服务的API时,所有参数必须在请求的URL中进行拼接。如果参数过多,拼接请求字符串会导致效率下降。Spring Cloud提供另外一种调用API的解决方案,既使用Spring Cloud Feign

二、什么是Feign

Feign是一种负载均衡的HTTP客户端,它封装了Ribbon。使用Feign调用API就像调用本地方法一样。从而避免了调用微服务时,需要不断封装/解析Json数据的繁琐步骤。

Feign是一个声明似的Web客户端,它使得编写Web服务客户端变得更容易。使用Fegin创建一个接口并对它进行注解。它具有可插拔的注解支持包含Fegin注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spirng Cloud增加了对Spring MVC的注解功能。Feign默认集成了Ribbon,所以Fegin默认就实现了负载均衡效果。

三、Feign特性

  • 支持可插拔的HTTP编码器和解码器
  • 支持Hystrix和它的Fallback;
  • 支持Ribbon的负载均衡;
  • 支持HTTP请求和响应的压缩。

四、Feign简单使用

3.1 Feign使用步骤

  1. 引入依赖
  2. 在启动类上添加注解
  3. 编写FeignClient接口
  4. 使用Feign发起http请求
  5. 配置Feign日志

3.2 Feign具体使用

1. 引入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 启动类上添加注解
@MapperScan("com.goyeer")
@SpringBootApplication
@EnableFeignClients
public class GoyeerApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

3.编写FeignClient接口
@FeignClient("orderservice")
public interface OrderClient {
    @GetMapping("/Order/findById")
    Order findById(@PathVariable("orderId") Long orderId);
}

五、使用Feign发起http请求

5.1 Maven导入Feign配置,并集成Jackson

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 用于解析数据 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-jackson</artifactId>
    <version>9.7.0</version>
</dependency>

5.2 Feign发送路径和方法设置

@RequestLine("GET /user/getone?arkOrgId={arkOrgId}&userId={userId}")
JSONObject getOneEmployee(@Param("orgId") String orgId,@Param("userId") String userId);

@RequestLine("POST /user/add")
@Headers("Content-Type: application/json")
@Body("{body}")
JSONObject saveEmployee(@Param("body") EmployeeDTO employeeDTO);

5.3 调用Feign.bulider()指定请求uri并且调用接口中的方法

public class App{
    public static void main(String[] args){
        EmloyeeAPI emloyeeAPI = Feign.builder().target(EmloyeeAPI.class,"http://localhost:8088");
        String result = emloyeeAPI.getOneEmployee("110","1110");
        System.out.println(result);
    }
}

六、Feign接口常用注解

注解类型说明
@RequestLineMethod定义其请求方法和请求路径(UriTemplate)。请求路径以斜杠开始,中间可以使用{变量名称},表达式的值由@Param注解提供。
@ParamParameter定义变量模板,可通过表达式{变量名称}引用变量的值
@HeadersMethod,Type定义请求头,可以使用{变量名},表达式的值由@Param注解提供。
@QueryMapParameter定义Map或者Pojo类型参数。
@HeaderMapParameter定义Map类型的请求头
@BodyMethod对@Param扩展,配合@Headers使用可定义JSON、XML类型参数

七、Feign接口与常用注解

7.1 target方法

指定接口类型和URL地址接口Http代理对象,从而通过代理对象调用方法发送HTTP请求。

7.2 client方法

Feign在默认情况下使用的是JDK原生的URLConnection发送HTTP请求。

7.3 options方法

指定连接超时时长及响应超时时长,单位毫秒。

7.4 retryer方法

指定重试策略,参数分别是最小时间,最大时间,重连次数。

7.5 encoder()/decode()方法

指定编码/解码方式默认是String

7.6 logger() logLevel()

指定日志和日志等级、可配置SLF4J等

7.7 @EnableFeignClients

用来开启Feign

7.8 @FeignClient

标记要用Feign来拦截的请求接口

7.9 value,name

value 和 name 的作用一样,如果没有配置url那么配置的值将作为服务名称,用于服务发现。反之只是一个名称。

7.10 serviceId

serviceId已经废弃了,直接使用name即可。

7.11 contextId

解决Bean的名称冲突了。

7.12 url

url用于配置指定服务的地址,相当于直接请求这个服务,不经过Ribbon的服务选择。像调试等场景可以使用。

7.13 decode404

当调用请求发生404错误时,decode404的值为true,那么会执行decoder解码,否则抛出异常。

7.14 configuration

configuration是配置Feign配置类,在配置类中可以自定义Feign的Encoder、Decoder、LogLevel、Contract等。

7.15 fallback

定义容错的处理类,也就是回退逻辑,fallback的类必须实现Feign Client的接口,无法知道熔断的异常信息。

7.16 fallbackFactory

也是容错的处理,可以知道熔断的异常信息。

7.17 path

path定义当前FeignClient访问接口时的统一前缀,比如接口地址是/user/get, 如果你定义了前缀是user, 那么具体方法上的路径就只需要写/get 即可。

7.18 primary

primary对应的是 @Primary 注解,默认为 true,官方这样设置也是有原因的。当我们的Feign实现了fallback后,也就意味着Feign Client有多个相同的Bean在Spring容器中,当我们在使用@Autowired进行注入的时候,不知道注入哪个,所以我们需要设置一个优先级高的,@Primary 注解就是干这件事情的。

7.19 qualifier

qualifier 对应的是 @Qualifier 注解,使用场景跟上面的primary关系很淡,一般场景直接 @Autowired 直接注入就可以了。

八、Feign的日志级别

8.1 Feign的日志级别

  • NONE(默认):不记录任何日志,性能最佳,使用与生产环境。
  • BASIC:仅记录请求方法,URL、响应状态代码以及执行时间,适用于生产环境追踪问题;
  • HEADERS:在BASIC级别的基础上,记录请求和响应的Header;
  • FULL:记录请求和响应的Header\Body和元数据,使用于开发测试定位问题。

8.2 Feign日志配置方法

  • 配置类全局配置

    在工程中增加一个配置类、如下设定日志级别,可作为全局配置

    @Configuration
    public class FeignConfig{
        @Bean
        public Logger.Level level(){
            return Logger.level.FULL;
        }
    }
    
  • 配置类局部配置

    首先将FeignConfig的@Configuration注解去掉,否则将是全局配置。

    在@FeignClient中configuration属性赋值为FeignConfig.class

    @FeignClient(path = "/employee", value = "provider", configuration = FeignConfig.class)
    public interface UserService {
        @RequestMapping("/list")
        List<String> findEmployee();
    }
    
  • 配置文件指定微服务配置

    在配置文件中,加入如下配置,provider为服务端服务名,改配置只对调用provider服务时生效。

    feign.client.config.provider.loggerLevel=BASIC
    

九、Feign原理

4.1 Feign服务调用的工作原理可以总结为以下几个步骤:

  1. 首先通过@EnableFeignCleints注解开启FeignCleint。
  2. 根据Feign的规则实现接口,添加@FeignCleint注解。程序启动后,会扫描所有有@FeignCleint的类,并将这些信息注入到ioc容器中。
  3. 注入时从FeignClientFactoryBean.class获取FeignClient。
  4. 当接口的方法被调用时,通过jdk的代理,来生成具体的RequesTemplate,RequesTemplate生成http的Reques。
  5. Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp。
  6. Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。

4.2 Feign整体流程图

在这里插入图片描述

十、Feign与Ribbon异同

Ribbon与Feign都是实现负载均衡的组件,Feign的本质是Ribbon,是基于Ribbon的实现。都是加在消费端的注解,让消费端可以调用其他生产者的服务。

Fegin与Ribbon的两者的区别

  • 启动类使用的注解不同,Ribbon用的是@RibbonClinet,Feign用的是@EnableFeignClients。
  • 服务的指定位置不同,Ribbon 是在@RibbonClient 注解上声明,Feign 则是在定义抽象方法的接口中使用@FeignClient 声明。
  • 调用方式不同,Ribbon 需要自己构建 http 请求,模拟 http 请求然后使用 RestTemplate 发送给其他服务,步骤相当繁琐。
  • Ribbon可配置负载均衡机制

十一、Feign与RestTemplate异同

  • RestTemplate

    RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。RestTemplate 继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,其中 RestOperations 接口定义了基本的 RESTful 操作,这些操作在 RestTemplate 中都得到了实现。

    1. 添加相关注解参数即可,使用简单方便。
    2. 熔断节点易控制,方便后续基于业务作出相应调整。
    3. 异常捕获简单,同页面下添加对应方法即可。
    4. 请求更贴近httpclient,使用更有熟悉感。
    5. 灵活性高但是消息封装臃肿。
  • Feign

    一种负载均衡的HTTP客户端, 使用Feign调用API就像调用本地方法一样,从避免了 调用目标微服务时,需要不断的解析/封装json 数据的繁琐。Feign是一个声明似的web服务客户端,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign。

    1. 编写方式优雅,基于面向接口的风格,但是开发起来较为繁琐。
    2. yml需要添加配置启动hystrix组件。
    3. 需要创建对应类来执行fallback方法。
    4. 捕获异常信息和不捕获异常实现的接口不同。
    5. 需要在feign注解上作出相应参数配置。
    6. feign中作出任何操作需要创建各种类来对应不同参数

十二、Feign和OpenFeign异同

  • 相同点

    1. Feign 和 OpenFeign 都是 Spring Cloud 下的远程调用和负载均衡组件。
    2. Feign 和 OpenFeign 作用一样,都可以实现服务的远程调用和负载均衡。
    3. Feign 和 OpenFeign 都对 Ribbon 进行了集成,都利用 Ribbon 维护了可用服务清单,并通过 Ribbon 实现了客户端的负载均衡。
    4. Feign 和 OpenFeign 都是在服务消费者(客户端)定义服务绑定接口并通过注解的方式进行配置,以实现远程服务的调用。
  • 不同点

    1. Feign 和 OpenFeign 的依赖项不同,Feign 的依赖为 spring-cloud-starter-feign,而 OpenFeign 的依赖为 spring-cloud-starter-openfeign。
    2. Feign 和 OpenFeign 支持的注解不同,Feign 支持 Feign 注解和 JAX-RS 注解,但不支持 Spring MVC 注解;OpenFeign 除了支持 Feign 注解和 JAX-RS 注解外,还支持 Spring MVC 注解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1026591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何理解功率谱/能量谱密度?它与自相关函数的关系?

目录 1. 自相关函数&#xff1a; 2.功率谱密度 /能量谱密度 什么是 能量信号&#xff1f; 什么是 功率信号&#xff1f; 什么是 能量谱密度&#xff1f; 什么是 功率谱密度&#xff1f; 3.自相关函数 与 能量谱密度/功率谱密度 的关系&#xff1f; 4.周期性的功率信号的 功…

安卓ROM定制 修改必备常识-----初步了解system系统分区文件夹的基本含义 【二】

安卓修改rom 固件 修改GSI 移植rom 必备常识 lib--**so文件基本解析 一起来了解system目录相应文件的用途吧。&#xff08;rom版本不同里面的app也会不一样&#xff09; 简单打开img格式后缀文件 给大家说下最简单的方法提取img里面的文件&#xff0c;对于后缀img格式的文件可…

实现过滤词汇高亮

js实现过滤词汇高亮 场景代码 场景 前端实现查询后&#xff0c;将过滤后数据中的搜索词展现为高亮。 代码 思路&#xff1a;利用 正则表达式 对过滤词添加类名&#xff0c;然后使用 v-html 渲染在表格中。 // 复制json数组copyObjectDataList(arr) {let list [];_.each(arr…

(2021|PMLR,DALL·E,自回归,Transformer)零样本文本到图像生成

Zero-Shot Text-to-Image Generation 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 方法 2.1. 第一阶段&#xff1a;学习视觉码本 2.2. 第二阶段&#xff1a…

23种设计模式汇总详解

设计原则 中文名称英文名称含义解释单一职责原则Single Responsibility Principle(SRP)任何一个软件模块都应该只对某一类行为者负责一个类只干一件事&#xff0c;实现类要单一开闭原则Open-Close Principle(OCP)软件实体&#xff08;类、模块、函数等&#xff09;应该是可以扩…

vmware NAT模式配置方式

VMware在NAT模式下宿主机与多台虚拟机互相访问&#xff0c;可连接外网 虚拟机的网络连接类型的选择&#xff0c;网络连接类型一共有桥接、NAT、仅主机和不联网四种。 桥接&#xff1a;选择桥接模式的话虚拟机和宿主机在网络上就是平级的关系&#xff0c;相当于连接在同一交换机…

飞行动力学 - 第30节-滚转收敛模态机理及飞行品质 之 基础点摘要

飞行动力学 - 第30节-滚转收敛模态机理及飞行品质 之 基础点摘要 1. 典型横航向响应2. 滚转收敛模态机理3. 滚转收敛模态近似4. 滚转收敛品质要求5. 参考资料 1. 典型横航向响应 2. 滚转收敛模态机理 3. 滚转收敛模态近似 横航向扰动之后首先体现的是重阻尼的滚转收敛模态 飞…

易点易动固定资产管理系统:解锁全面管理固定资产的多重功能优势

在现代企业中&#xff0c;固定资产管理是一项至关重要的任务。单单依靠表格来管理固定资产已经无法满足大多数企业的需要。因此&#xff0c;企业通常需要一款专业的固定资产管理系统进行固定资产的日常管理。易点易动固定资产管理系统以其多项强大功能&#xff0c;成为企业实现…

著名书法家傅成洪受邀出席香港第八届“一带一路”高峰论坛

香港第八届“一带一路”高峰论坛于9月13日至14日在香港隆重举行&#xff0c;吸引了来自海内外的6000多名嘉宾&#xff0c;共同回顾“一带一路”倡议的历程&#xff0c;并展望未来的投资和商贸机遇。这一庆祝活动恰逢“一带一路”倡议的10周年&#xff0c;主题定为“携手十载 共…

使用Kalibr工具线对相机+IMU离线标定

传感器标定的准确后面做算法才会更准确&#xff0c;所以对Kalibr进行学习。 一、Kalibr编译 1、下载kalibr包 GitHub下载地址 2、 解压后放到/catkin_ws/src文件夹下 重新命令文件夹为kalibr 3、 安装依赖库 sudo apt-get install python-setuptools python-rosinstall…

datax和datax-web编译安装和使用

DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、OTS、ODPS 等各种异构数据源之间高效的数据同步功能。 目前支持的数据源如下: 与sqoop的对比: 1. 编译 1.1编译datax idea打开datax项目,…

观察级水下机器人使用系列之七机械手臂

本期是观察级水下机器人使用系列的最后一期&#xff0c;主要讲ROV所使用的机械臂。机械臂正式名称为5功能电动机械&#xff0c;型号为BE-500&#xff0c;由法国公司Ocean Innovation System设计的&#xff0c;可代替人工进行水下作业&#xff0c;完成海底样品采集、打捞、设备定…

9月20日作业

时钟代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QPaintEvent> #include <QTime> #include <QTimer> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class W…

【Hash表】第一个不重复字符-力扣 387

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

应用平台 - OPPO敏感权限

那天在OPPO平台更新app时&#xff0c;发现平台权限升级&#xff0c;新增了敏感权限校验&#xff0c;而且还是必填项… Google 从 Android6.0 开始就对权限做了分类适配&#xff0c;粗浅来看将权限分为了普通权限、危险权限&#xff08;运行时权限、敏感权限&#xff09;&#x…

干洗店小程序,洗鞋店小程序,互联网洗鞋店,企业干洗方案,干洗行业小程序,上门取衣小程序,预约干洗小程序,校园干洗店小程序,工厂干洗店小程序,干洗店小程序开发;

干洗店小程序,洗鞋店小程序&#xff0c;互联网洗鞋店&#xff0c;企业干洗方案,干洗行业小程序,上门取衣小程序,预约干洗小程序,校园干洗店小程序,工厂干洗店小程序,干洗店小程序开发,微信干洗店小程序&#xff1b; 一、核心功能介绍 1.(支持上门取送、送货到店、寄存网点、智能…

LLM微调(一)| 单GPU使用QLoRA微调Llama 2.0实战

最近LLaMA 2在LLaMA1 的基础上做了很多优化&#xff0c;比如上下文从2048扩展到4096&#xff0c;使用了Grouped-Query Attention&#xff08;GQA&#xff09;共享多头注意力的key 和value矩阵&#xff0c;具体可以参考&#xff1a; 关于LLaMA 2 的细节&#xff0c;可以参考如下…

DHorse v1.4.0 发布,基于 k8s 的发布平台

版本说明 新增特性 提供Fabric8客户端操作k8s&#xff08;预览&#xff09;的功能&#xff0c;可以通过指定-Dkubernetes-clientfabric8参数开启&#xff1b;Vue、React应用增加Pnpm、Yarn的构建方式&#xff1b;支持Go、Flask、Django、Nuxt应用部署&#xff1b; 优化特性 …

2000-2021年上市公司设立党组织数据

2000-2021年上市公司设立党组织数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;时间、证券代码、公司名称、行业名称、所在城市、所在省份、是否建立党组织、建立党组织时间、党组织年龄&#xff1b; 董监高中党组织成员人数、高管中党组织成员人数、董事中党组织…

Java笔记二

学习资源来自哔哩哔哩——遇见狂神说——狂神说Java 目录 数据类型&#xff1a; 字符 字符串 布尔值 强制转换&#xff1a; 变量 常量&#xff1a; 运算符&#xff1a; 数据类型&#xff1a; long定义的必须在数字后面L float定义的要在数字后面加F 如 long num130…