Feign是一个Http请求调用的轻量级框架,以Java接口注解的方式调用Http请求。Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用。
接口的动态代理
在Feign 底层,通过基于面向接口的动态代理方式生成实现类,将请求调用委托到动态代理实现类。
Contract协议解析
动态生成Request
基于 RequestBean,根据传入的Bean对象和注解信息,从中提取出相应的值,来构造Http Request 对象。
Encoder/Decoder
消息解析和转码逻辑。
拦截器
负责对请求和返回进行装饰处理,在请求转换的过程中,Feign 抽象出来了拦截器接口,用于用户自定义对请求的操作,比如,如果希望Http消息传递过程中被压缩,可以定义一个请求拦截器。
日志记录
补偿机制
Feign 内置了一个重试器,当HTTP请求出现IO异常时,Feign会有一个最大尝试次数发送请求。
Feign 真正发送HTTP请求是委托给 feign.Client 来做的。Feign 默认底层通过JDK 的 java.net.HttpURLConnection 实现了feign.Client接口类,在每次发送请求的时候,都会创建新的 HttpURLConnection 链接,这也就是为什么默认情况下Feign的性能很差的原因。可以通过拓展该接口,使用 Apache HttpClient 或者 OkHttp3 等基于连接池的高性能Http客户端。真正影响性能的,是处理Http请求的环节。
1. GZIP压缩
Gzip 是一种数据格式,采用 deflate 算法压缩数据,当 Gzip 压缩到一个纯文本数据时,可以减少70%以上的数据大小。网络数据经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。只配置Feign请求-应答的Gzip压缩。
# feign gzip
# 局部配置。只配置feign技术相关的http请求-应答中的gzip压缩。
# 配置的是application client和application service之间通讯是否使用gzip做数据压缩。
# 和浏览器到application client之间的通讯无关。
# 开启feign请求时的压缩, application client -> application service
feign.compression.request.enabled=true
# 开启feign技术响应时的压缩, application service -> application client
feign.compression.response.enabled=true
# 设置可以压缩的请求/响应的类型。
feign.compression.request.mime-types=text/xml,application/xml,application/json
# 当请求的数据容量达到多少的时候,使用压缩。默认是2048字节。
feign.compression.request.min-request-size=512
2. 全局GZIP压缩
# spring boot gzip
# 开启spring boot中的gzip压缩。就是针对和当前应用所有相关的http请求-应答的gzip压缩。
server.compression.enabled=true
# 哪些客户端发出的请求不压缩,默认是不限制
server.compression.excluded-user-agents=gozilla,traviata
# 配置想压缩的请求/应答数据类型,默认是 text/html,text/xml,text/plain
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
# 执行压缩的阈值,默认为2048
server.compression.min-response-size=512
3. 切换底层实现
开启feign技术对底层httpclient的依赖。
feign.httpclient.enabled=true