image-20210925134648168

1. Feign 与 OpenFeign 与 Ribbon

Feign 内置了 Ribbon 作为负载均衡实现
OpenFeign 基于 Feign 增加了对 SpringMVC 注解的支持

a、他们底层都是内置了 Ribbon,去调用注册中心的服务。
b、Feign 是 Netflix 公司写的,是 SpringCloud 组件中的一个轻量级 RESTful 的 HTTP 服务客户端,是 SpringCloud 中的第一代负载均衡客户端。
OpenFeign 是 SpringCloud 自己研发的,在 Feign 的基础上支持了 Spring MVC 的注解,如@RequesMapping 等等。是 SpringCloud 中的第二代负载均衡客户端。
c、Feign 本身不支持 Spring MVC 的注解,使用 Feign 的注解定义接口,调用这个接口,就可以调用服务注册中心的服务

OpenFeign 的@FeignClient 可以解析 SpringMVC 的@RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

2. Feign 与 RestTemplate

先来看我们以前利用 RestTemplate 发起远程调用的代码:

image-20210714174814204

存在下面的问题:

•代码可读性差,编程体验不统一
•参数复杂 URL 难以维护

Feign 是一个声明式的 http 客户端,官方地址:https://github.com/OpenFeign/feign

其作用就是帮助我们优雅的实现 http 请求的发送,解决上面提到的问题。

3. Feign 使用

image.png

4. 性能优化

Feign 底层发起 http 请求,依赖于其它的框架。其底层客户端实现包括:

•URLConnection:默认实现,不支持连接池
•Apache HttpClient :支持连接池
•OKHttp:支持连接池

可以更改为 HttpClient 或者 OKHttp,这里我们用 Apache 的 HttpClient 来演示

1)引入依赖

在 order-service 的 pom 文件中引入 Apache 的 HttpClient 依赖:

1
2
3
4
5
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>

2)配置连接池

在 order-service 的 application.yml 中添加配置:

1
2
3
4
5
6
7
8
9
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数

接下来,在 FeignClientFactoryBean 中的 loadBalance 方法中打断点:

image-20210714185925910

Debug 方式启动 order-service 服务,可以看到这里的 client,底层就是 Apache HttpClient:

image-20210714190041542

总结,Feign 的优化:

1.日志级别尽量用 basic
2.使用 HttpClient 或 OKHttp 代替 URLConnection

① 引入 feign-httpClient 依赖
② 配置文件开启 httpClient 功能,设置连接池参数

4.1. 最佳实践-使用连接池⭐️🔴

image.png
image.png

image.png

image.png

5. openFeign

5.1. 是什么

5.2. 使用 OpenFeign 时程序执行流程

   OpenFeign 代替之前的 RestTemplate 代码。也是写在 Application Client 中。把 OpenFeign 接口单独放在 feign 包中,表示服务调用层。当需要调用其他服务时,直接注入 OpenFeign 接口对象就可以像调用本地方法一样调用远程服务。

整体流程说明:

  1. ApplicationService 向 Eureka Server 注册服务。
  2. Application Client 从 Eureka Server 中发现服务信息。
  3. 在 Application Client 中调用 OpenFeign 接口中方法
  4. Application Client 中 OpenFeign 通过应用程序名调用 Application Service

image.png

5.3. 超时时间配置

1
2
3
4
5
6
7
8
feign:
client:
config:
default:
#建立连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间,
ConnectTimeOut: 5000
#指建立连接后从服务端读取到可用资源所用的时间,默认为1s
ReadTimeOut: 5000
经验专题-超时时间-1、超时问题汇总

5.4. Spring Feign 序列化机制

5.5. OpenFeign 通讯优化

image.png

在交互数据量级不够的时候,看不到压缩内容。

      这里只开启 Feign 请求 - 应答过程中的 GZIP,也就是浏览器 -Application Client 之间的请求应答不开启 GZIP 压缩。

      在全局配置文件中,使用下述配置来实现 OpenFeign 请求 - 应答的 GZIP 压缩

image.png

6. 实战经验

7. 参考与感谢

面试专题-6、分布式组件

7.1. 黑马程序员

1
/Users/taylor/Nutstore Files/Obsidian_data/pages/002-schdule/001-Arch/001-Subject/005-分布式专题/微服务开发框架SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式微服务全技术栈课程

7.2. 尚学堂

7.2.1. 视频

https://www.bilibili.com/video/BV1hq4y177iu/?vd_source=c5b2d0d7bc377c0c35dbc251d95cf204

7.2.2. 资料

https://www.bilibili.com/read/cv11226358/
https://www.cnblogs.com/duanxz/p/15933313.html