SpringCloud Feign

SpringCloud Feign

一、声明式服务调用

1.1、 什么是Feign

Feign是一种声明式、模板化的HTTP客户端(仅在consumer中使用)。

1.2、什么是声明式

  1. 声明式调用就像调用本地方法一样调用远程方法;无感知远程http请求。
  2. Spring Cloud的声明式调用, 可以做到使用 HTTP请求远程服务
    时能就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。
  3. 它像Dubbo一样,consumer直接调用接口方法调用provider,而不需要通过常规的Http
    Client构造请求再解析返回数据。
  4. 它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。

1.3、RestTemplate

Spring的 RestTemplate访问使用了模版方法的设计模式

二、Feign对复杂参数处理

2.1、对象参数

  1. POST能简化对象作为参数请求
  2. GET使用对象作为参数需APPLICATION_JSON_VALUE化(@RequestBody)

三、Gzip压缩

3.1、gzip压缩介绍

  1. gzip介绍:gzip是一种数据格式,采用用deflate算法压缩data;gzip是一种流行的文件压缩算法,应用十分广泛,尤其是在Linux平台。
  2. gzip能力:当Gzip压缩到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小。
  3. gzip作用:网络数据经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个潜在的好处是Gzip与搜索引擎的抓取工具有着更好的关系。例如Google就可以通过直接读取gzip文件来比普通手工抓取 更快地检索网页。

3.2、HTTP协议中关于压缩传输的规定

  1. 客户端向服务器请求中带有:Accept-Encoding:gzip, deflate 字段,向服务器表示,客户端支持的压缩格式(gzip或者deflate),如果不发送改消息头,服务器是不会压缩的。
  2. 服务端在收到请求之后,如果发现请求头中含有Accept-Encoding字段,并且支持该类型的压缩,就对响应报文压缩之后返回给客户端,并且携带Content-Encoding:gzip消息头,表示响应报文是根据该格式压缩过的。
  3. 客户端接收到请求之后,先判断是否有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的背景原理

  1. 两台服务器建立http连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间。
  2. Http连接需要的3次握手4次分手开销很大,这一开销对于大量比较小的http消息来说更大。

4.2、优化解决方案

  1. 如果我们直接采用http连接池,节约了大量的3次握手4次分手;这样能大大提升吞吐率。
  2. feign的http客户端支持3种框架;HttpURLConnection、httpclient、okhttp;默认是HttpURLConnection。
  3. 传统的HttpURLConnection是JDK自带的,并不支持连接池,如果要实现连接池的机制,还需要自己来管理连接对象。对于网络请求这种底层相对复杂的操作,如果有可用的其他方案,也没有必要自己去管理连接对象。
  4. 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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值