SpringCloud Feign
一、声明式服务调用
1.1、 什么是Feign
Feign是一种声明式、模板化的HTTP客户端(仅在consumer中使用)。
1.2、什么是声明式
- 声明式调用就像调用本地方法一样调用远程方法;无感知远程http请求。
- Spring Cloud的声明式调用, 可以做到使用 HTTP请求远程服务
时能就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。 - 它像Dubbo一样,consumer直接调用接口方法调用provider,而不需要通过常规的Http
Client构造请求再解析返回数据。 - 它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。
1.3、RestTemplate
Spring的 RestTemplate访问使用了模版方法的设计模式
二、Feign对复杂参数处理
2.1、对象参数
- POST能简化对象作为参数请求
- GET使用对象作为参数需APPLICATION_JSON_VALUE化(@RequestBody)
三、Gzip压缩
3.1、gzip压缩介绍
- gzip介绍:gzip是一种数据格式,采用用deflate算法压缩data;gzip是一种流行的文件压缩算法,应用十分广泛,尤其是在Linux平台。
- gzip能力:当Gzip压缩到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小。
- gzip作用:网络数据经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个潜在的好处是Gzip与搜索引擎的抓取工具有着更好的关系。例如Google就可以通过直接读取gzip文件来比普通手工抓取 更快地检索网页。
3.2、HTTP协议中关于压缩传输的规定
- 客户端向服务器请求中带有:Accept-Encoding:gzip, deflate 字段,向服务器表示,客户端支持的压缩格式(gzip或者deflate),如果不发送改消息头,服务器是不会压缩的。
- 服务端在收到请求之后,如果发现请求头中含有Accept-Encoding字段,并且支持该类型的压缩,就对响应报文压缩之后返回给客户端,并且携带Content-Encoding:gzip消息头,表示响应报文是根据该格式压缩过的。
- 客户端接收到请求之后,先判断是否有Content-Encoding消息头,如果有,按该格式解压报文。否则按正常报文处理。
3.3、gzip压缩使用
配置文件使用如下配置:
###gzip配置##
##配置请求gzip压缩
#feign.compression.request.enabled=true
##配置响应gzip压缩
#feign.compression.response.enabled=true
##配置压缩支持的mime type
#feign.compression.request.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml
##配置压缩数据大小的下限
#feign.compression.request.min-request-size=1024
###Spring Boot 使用gzip##
#是否启用压缩
server.compression.enabled=true
server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml
四、连接池提升Feign并发
4.1、http的背景原理
- 两台服务器建立http连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间。
- Http连接需要的3次握手4次分手开销很大,这一开销对于大量比较小的http消息来说更大。
4.2、优化解决方案
- 如果我们直接采用http连接池,节约了大量的3次握手4次分手;这样能大大提升吞吐率。
- feign的http客户端支持3种框架;HttpURLConnection、httpclient、okhttp;默认是HttpURLConnection。
- 传统的HttpURLConnection是JDK自带的,并不支持连接池,如果要实现连接池的机制,还需要自己来管理连接对象。对于网络请求这种底层相对复杂的操作,如果有可用的其他方案,也没有必要自己去管理连接对象。
- HttpClient相比传统JDK自带的URLConnection,它封装了访问http的请求头,参数,内容体,响应等等;它不仅使客户端发送HTTP请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性;另外高并发大量的请求网络的时候,还是用“连接池”提升吞吐量。
4.3、连接池使用
添加如下jar
<!-- 使用Apache HttpClient替换feign原生的httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>8.18.0</version>
</dependency>
添加如下配置信息
#启用httpclient
feign.httpclient.enabled=true
五、日志记录每个接口
5.1、日志级别使用
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.FULL;
}
5.2、级别设置信息
NONE:不记录任何信息,默认值
BASIC:记录请求方法、请求URL、状态码和用时
HEADERS:在BASIC的基础上再记录一些常用信息
FULL:记录请求和响应报文的全部内容
六、资料
6.1、代码示例
spring-cloud/ SpringCloud Feign