分布式专题-7、远程调用-F'ei'g'n
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 发起远程调用的代码:
存在下面的问题:
•代码可读性差,编程体验不统一
•参数复杂 URL 难以维护
Feign 是一个声明式的 http 客户端,官方地址:https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现 http 请求的发送,解决上面提到的问题。
3. Feign 使用
4. 性能优化
Feign 底层发起 http 请求,依赖于其它的框架。其底层客户端实现包括:
•URLConnection:默认实现,不支持连接池
•Apache HttpClient :支持连接池
•OKHttp:支持连接池
可以更改为 HttpClient 或者 OKHttp,这里我们用 Apache 的 HttpClient 来演示
1)引入依赖
在 order-service 的 pom 文件中引入 Apache 的 HttpClient 依赖:
1 |
|
2)配置连接池
在 order-service 的 application.yml 中添加配置:
1 |
|
接下来,在 FeignClientFactoryBean 中的 loadBalance 方法中打断点:
Debug 方式启动 order-service 服务,可以看到这里的 client,底层就是 Apache HttpClient:
总结,Feign 的优化:
1.日志级别尽量用 basic
2.使用 HttpClient 或 OKHttp 代替 URLConnection
① 引入 feign-httpClient 依赖
② 配置文件开启 httpClient 功能,设置连接池参数
4.1. 最佳实践-使用连接池⭐️🔴
5. openFeign
5.1. 是什么
5.2. 使用 OpenFeign 时程序执行流程
OpenFeign 代替之前的 RestTemplate 代码。也是写在 Application Client 中。把 OpenFeign 接口单独放在 feign 包中,表示服务调用层。当需要调用其他服务时,直接注入 OpenFeign 接口对象就可以像调用本地方法一样调用远程服务。
整体流程说明:
- ApplicationService 向 Eureka Server 注册服务。
- Application Client 从 Eureka Server 中发现服务信息。
- 在 Application Client 中调用 OpenFeign 接口中方法
- Application Client 中 OpenFeign 通过应用程序名调用 Application Service
5.3. 超时时间配置
1 |
|
5.4. Spring Feign 序列化机制
5.5. OpenFeign 通讯优化
在交互数据量级不够的时候,看不到压缩内容。
这里只开启 Feign 请求 - 应答过程中的 GZIP,也就是浏览器 -Application Client 之间的请求应答不开启 GZIP 压缩。
在全局配置文件中,使用下述配置来实现 OpenFeign 请求 - 应答的 GZIP 压缩
6. 实战经验
7. 参考与感谢
面试专题-6、分布式组件7.1. 黑马程序员
1 |
|
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