http客户端Feign
RestTemplate方式调用存在的问题
![image-20220315192559050](https://pic-bed-1303913583.cos.ap-nanjing.myqcloud.com/img/image-20220315192559050.png)
存在下面的问题:
-
代码可读性差,编程体验不统一
-
参数复杂URL难以维护
Feign介绍
fen·en
spring的声明事务,只需要你简单的在配置文件中告诉spring我要对谁加事务,把规则定义清楚就好了,剩下的交给spring。
Feign声明式http客户端也是,将发请求所需要的信息声明出来,剩下的事交给Feign来做。
![image-20220315193134937](https://pic-bed-1303913583.cos.ap-nanjing.myqcloud.com/img/image-20220315193134937.png)
使用Feign的步骤
![image-20220315193242173](https://pic-bed-1303913583.cos.ap-nanjing.myqcloud.com/img/image-20220315193242173.png)
![image-20220315193534965](https://pic-bed-1303913583.cos.ap-nanjing.myqcloud.com/img/image-20220315193534965.png)
![image-20220315195015474](https://pic-bed-1303913583.cos.ap-nanjing.myqcloud.com/img/image-20220315195015474.png)
![image-20220315195049851](https://pic-bed-1303913583.cos.ap-nanjing.myqcloud.com/img/image-20220315195049851.png)
![image-20220315195328098](https://pic-bed-1303913583.cos.ap-nanjing.myqcloud.com/img/image-20220315195328098.png)
![image-20220315195716445](https://pic-bed-1303913583.cos.ap-nanjing.myqcloud.com/img/image-20220315195716445.png)
总结Feign的使用步骤
自定义Feugn的配置
BASIC:当你发起一次http请求时,帮你记录请求发送的起始时间,结束时间,经历了多长时间。
HEADERS:除了要带上请求的基本信息,还要记录请求头的基本信息。
FULL:请求信息、请求头信息、请求体和响应体信息也会被记录下来。
Encoder:在转发请求的时候要将各种各样的格式转变成request的请求体
配置Feign日志
方式二:在java代码中配置
总结
Feign的性能优化
fen·en
Feign底层的客户端实现:
他是一个声明式客户端,他只是帮我们把我们的声明变成http请求,最终发http请求的时候还会用到其他的客户端。
- URLConnection:默认实现,不支持连接池(jdk自带的,实现性能不太好,没有连接池,每次连接都要三次握手四次挥手。)
- Apache HttpClient :支持连接池
- 0KHttp:支持连接池
因此优化Feign的性能主要包括:
①使用连接池代替默认的URLConnection
②日志级别,最好用basic或none
Feign的性能优化—连接池配置
Feign添加HttpClient的支持:
总结
Feign的最佳实践
总结
一个是将其设置为接口,让对应的生产者和消费者继承,一个是抽取成一个模块,让消费者去引用依赖。
抽取FeignClient
![image-20220316170517171](https://pic-bed-1303913583.cos.ap-nanjing.myqcloud.com/img/image-20220316170517171.png)
![image-20220316170444520](https://pic-bed-1303913583.cos.ap-nanjing.myqcloud.com/img/image-20220316170444520.png)
当spring报错找不到对应的bean,但是编译没有报错,说明spring容器当中没有创建对应的实例,所以无法注入到对应的成员变量上。当spring扫描包,扫描到对应的类,会将其存到spring容器当中并为他创建对应的实例,这个时候可能是spring没有扫描到对应的包,也就没扫描到对应的类,没有创建实例对象到容器当中。
当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:
指定加载那个客户端
gnClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:**
[外链图片转存中…(img-8hSot1nV-1648082381433)]
指定加载那个客户端