Feign优化
Feign帮我们做了哪些事儿:
- 在 声明Feign客户端 之后,Feign会根据@FeignClient注解使用java的动态代理技术生成代理类,在这里我们指定@FeignClient 的value属性为serviceB,则说明这个类的远程目标为spring cloud的服务名称为serviceB的微服务。
- serviceB的具体访问地址,Feign会交由ribbon获取,若该服务有多个实例地址,ribbon会采用指定的负载均衡策略选取实例。
- Feign兼容spring的web注解(如:@GetMapping),它会分析声明Feign客户端方法中的Spring注解,得出Http请求method、参数信息以及返回信息结构。
- 当业务调用Feign客户端方法时,会调用代理类,根据以上分析结果,由代理类完成实际的参数封装、远程http请求,返回结果封装等操作。
@Configuration public class ConfigBean { /** * 添加@LoadBalanced注解之后,Ribbon会给restTemplate请求添加一个拦截器, * 在拦截器中获取注册服务的列表, * 并使用Ribbon内置的负载均衡算法从服务列表中选取一个服务, * 通过获取到的服务信息(ip和port)替换成serviceId实现负载均衡. */ @Bean @LoadBalanced //开启负载均衡ribbon ,默认使用轮询策略 public RestTemplate restTemplate(){ return new RestTemplate(); } }
注意: 在feign中是通过ribbon的负载均衡策略获取服务的具体访问地址的.
1.开启http连接池
Feign
的HTTP
客户端支持3种框架:HttpURLConnection
、HttpClient
、OkHttp
。
观察源码可以发现,Feign
默认是采用java.net.HttpURLConnection
的,每次请求都会建立、关闭连接。
为了性能考虑,我们可以引入httpclient
、okhttp
作为底层的通信框架。
1)在pom.xml中添加httpclient依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2)在application.yml文件中开启连接池
feign:
httpclient:
enabled: true #开启http连接池
3)此时查看
2.开启Feign日志
OpenFeign
的日志级别如下:
- NONE:默认的,不显示任何日志;
- BASIC:仅记录请求方法、URL、响应状态码及执行时间;
- HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息;
- FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
1.在application.yml中要先开启feign的日志
feign:
client:
config:
default:
loggerLevel: full #开启feign日志
2.设置全局日志级别为Debug
logging:
level:
com.bjpowernode.feign: debug #日志等级
com.bjpowernode.feign :为Feign接口所在包路径.
3.开启日志后,控制台会打印以下详细信息.
3.开启gzip压缩
介绍
gzip 是一种数据格式,采用用 deflate 算法压缩 data;gzip 是一种流行的文件
压缩算法,应用十分广泛,尤其是在 Linux 平台。
能力
当 Gzip 压缩到一个纯文本文件时,效果是非常明显的,大约可以减少 70%
以上的文件大小。
作用
网络数据经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可
以加快网页加载的速度。网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏
览体验外,另一个潜在的好处是 Gzip 与搜索引擎的抓取工具有着更好的关系。例如 Google
就可以通过直接读取 gzip 文件来比普通手工抓取 更快地检索网页。
1.在项目的application.yml文件中开启gzip压缩
server:
compression:
enabled: true #开启浏览器<---->consumer的gzip压缩
#配置支持压缩的 MINE TYPE (默认的)
mime-types: text/html,text/xml,text/plain,application/xml,application/json
feign:
compression:
request:
enabled: true #开启consumer<---->provider的gzip压缩
response:
enabled: true
4.Feign超时
注意: 在测试feign请求超时时,需要把feign的日志增强去掉,否则设置超时时间会不起作用.
方式一: 在application.yml中ribbon上配置
ribbon:
ConnectionTimeout: 5000 #连接超时时间
ReadTimeout: 5000 #响应超时时间
方式而: 在application.yml中feign上配置
feign:
client:
config:
feign-provider: #指定feign请求的服务名称(也可以是default,表示默认)
ConnectionTimeout: 5000
ReadTimeout: 5000