feign优化
1、开启feign日志
1)Feign 虽然提供了日志增强功能,但是默认是不显示任何日志的,不过开发者在调试阶段可以自己配置日志的级别:
Feign 的日志级别如下:
NONE:默认的,不显示任何日志;
BASIC:仅记录请求方法、URL、响应状态码及执行时间;
HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息;
FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
在application.yml 文件中配置日日级别
feign:
client:
config:
default:
loggerLevel: full #feign显示日志
logging:
level:
com.bjpowernode.feign: debug #log4j的日志级别
2、GZIP压缩
1)当 Gzip 压缩到一个纯文本文件时,效果是非常明显的,大约可以减少 70% 以上的文件大小:
网络数据经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个潜在的好处是 gzip 与搜索引擎的抓取工具有着更好的关系。例如 Google 就可以通过直接读取 gzip 文件来比普通手工抓取 更快地检索网页。
2)Feign 开启 GZIP在application.yml 配置:
server:
compression:
enabled: true #开启浏览器<----->consumer的gzip压缩
feign:
compression:
request:
enabled: true #开启feign<---->provider的gzip压缩
response:
enabled: true
3)效果:
上述操作完成后重启项目发起请求,观察控制台
3、Http 连接池
两台服务器建立HTTP连接的过程涉及到多个数据包的交换,很消耗时间。采用HTTP连接池可以节约大量的时间提示吞吐量
1)添加依赖
<!--Http 连接池-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2)配置文件中开启
feign:
# 开启 httpclient
httpclient:
enabled: true
3)验证.
在feign.SynchronousMethodHandler#executeAndDecode()这个方法中可以清楚的看出调用哪个 client
在未替换 httpclient 之前,是这样的:
在替换 httpclient 后,是这样的:
4、feign超时
修改feign_privider:
@Service
public class UserServiceImpl implements UserService {
@Override
public User getUser() {
//模拟网络延迟
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new User(1,"王粪堆",18);
}
}
测试
报错求了! 看上面我红线框起来的信息。 Read timed out。超时了。
为什么会这样呢?按理来说,浏览器应该会转圈等待3s然后返回正确的信息,但这里怎么会报错呢?
Feign默认超时时间是1S
哦豁,那怎么办呢? 假如现在有一个服务,我们知道它的处理过程很复杂,要2S中才能返回结果,那该怎么办呢?
为了避免这样的情况,我们可以手动的设置OpenFeign的超时时间。
设置feign超时时间
1)feign超时调优方式一
ribbon:
ConnectTimeout: 5000 #请求连接的超时时间
ReadTimeout: 5000 #请求处理的超时时间
2)feign超时调优方式二
feign:
client:
config:
feign-provider:
ConnectionTimeout: 5000 #请求连接的超时时间
ReadTimeout: 5000 #请求处理的超时时间
注意:在配置了日志增强的情况下不会出现Read timed out异常!!