Feign的介绍和使用

一、Feign介绍和简单基本使用流程

image-20230207213746760

image-20230207213755922

​ Feign是一种负载均衡的HTTP客户端, 使用Feign调用API就像调用本地方法一样,从避免了调用目标微服务时,需要不断的解析/封装json 数据的繁琐。Feign集成了Ribbon。Ribbon+eureka是面向微服务编程,而Feign是面向接口编程。

	Fegin是一个声明似的web服务客户端,它使得编写web服务客户端变得更加容易。使用Fegin创建一个接口并对它进行注解。它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign。

image-20230207213838171

image-20230207213949255

image-20230207215026899

Feign内部集成了ribbon,自动实现了负载均衡

image-20230207215002005

二、Feign自定义配置

image-20230207215233270

image-20230207215305103

image-20230207215415792

image-20230207215550021

如果要调试的时候可以使用FULL,但平时建议一般使用BASIC或NONE,因为记录日志还是会消耗一定的性能的

设置超时:

  • 设置openFeign的超时时间
  • 设置Ribbon的超时时间

1、设置Ribbon的超时时间(不推荐)

设置很简单,在配置文件中添加如下设置:

1
2
3
4
5
ribbon:
# 值的是建立链接所用的时间,适用于网络状况正常的情况下, 两端链接所用的时间
ReadTimeout: 5000
# 指的是建立链接后从服务器读取可用资源所用的时间
ConectTimeout: 5000

2、设置openFeign的超时时间(推荐)

openFeign设置超时时间非常简单,只需要在配置文件中配置,如下:

1
2
3
4
5
6
7
feign:
client:
config:
## default 设置的全局超时时间,指定服务名称可以设置单个服务的超时时间
default:
connectTimeout: 5000
readTimeout: 5000

default设置的是全局超时时间,对所有的openFeign接口服务都生效

但是正常的业务逻辑中可能涉及到多个openFeign接口的调用,如下图:

img

上图中的伪代码如下:

1
2
3
4
5
6
7
8
9
10
public T invoke(){
//1. 调用serviceA
serviceA();

//2. 调用serviceA
serviceB();

//3. 调用serviceA
serviceC();
}

那么上面配置的全局超时时间能不能通过呢?很显然是serviceAserviceB能够成功调用,但是serviceC并不能成功执行,肯定报超时。

此时我们可以给serviceC这个服务单独配置一个超时时间,配置如下:

1
2
3
4
5
6
7
8
9
10
11
feign:
client:
config:
## default 设置的全局超时时间,指定服务名称可以设置单个服务的超时时间
default:
connectTimeout: 5000
readTimeout: 5000
## 为serviceC这个服务单独配置超时时间
serviceC:
connectTimeout: 30000
readTimeout: 30000

注意:单个配置的超时时间将会覆盖全局配置。

三、Feign的性能调优

Feign是一个声明式客户端,它只是把我们的声明变成http请求,最后发送http请求时还是会应用到一些别的客户端

image-20230207220231333

image-20230207220445237

image-20230207220949115

四、Feign的最佳实践

image-20230207221619077

image-20230207221552791

image-20230207221538398

演示Feign的最佳实践二:抽取FeignClient

教程视频:11-Feign-实现Feign最佳实践_哔哩哔哩_bilibili

image-20230207221754929