一、feign在分布式开发中的作用
1、什么是feign?
Feign是一种声明式、模块化的http客户端(仅在consumer中使用)。
2、什么是声明式?有什么作用,解决什么问题?
a、声明式调用就像调用本地方法一样调用远程方法,无感知远程http请求。
b、Spring Cloud的声明式调用,可以做到使用http请求远程服务时,能就想调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到是http的请求。
c、他像dubbo一样,consumer直接调用接口方法调用provider,而不是通过常规的httpClient请求,解析返回的数据。
d、他解决了开发者调用远程接口和调用本地方法一样,无需关注与远程的交换细节,更无需关注分布式环境开发
二、改造服务提供者
1、将服务提供者抽成2个模块,一个模块为公共的模块,其中定义接口和对象,另一个是实现该接口的模块。实现该接口模块可以共用公共模块的domain中的类
三、改造消费者
1、application中增加2个注释:
2、service改成如下:
3、消费者模块也要引用公共模块
四:feign对复杂参数的请求处理
1、参考e-book-consumer-feign-paramter工程
五:gzip参数压缩传输
1、
2、在配置文件中配置:
springboot 整体gzip,请求和返回都gzip
#-----------------------------spring boot gzip
#是否启用压缩
server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
五、feign为什么要使用http的连接池?
1、http的背景原理?
1.两台服务器建立http连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间。
2.Http连接需要的3次握手4次分手开销很大,这一开销对于大量比较小的http消息来说更大。
2、优化解决方案
1.如果我们直接采用http连接池,节约了大量的3次握手4次分手;这样能大大提升吞吐率。
2.feign的http客户端支持3种框架;HttpURLConnection、httpclient、okhttp;默认是HttpURLConnection。
3.传统的HttpURLConnection是JDK自带的,并不支持连接池,如果要实现连接池的机制,还需要自己来管理连接对象。对于网络请求这种底层相对复杂的操作,如果有可用的其他方案,也没有必要自己去管理连接对象。
4.HttpClient相比传统JDK自带的URLConnection,它封装了访问http的请求头,参数,内容体,响应等等;它不仅使客户端发送HTTP请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性;另外高并发大量的请求网络的时候,还是用“连接池”提升吞吐量。
六、feign配置log,可以查看请求接口的耗时、请求、返回等信息。
在application中配置如下
@Bean
public Logger.Level feignLoggerLevel(){
// NONE, 不记录任何信息,默认值。
// BASIC, 记录请求方法、请求URL、状态码和用时。
// HEADERS, 在BASIC的基础上再记录一些常用信息。
// FULL: 记录请求和响应报文的全部内容。
return Logger.Level.FULL;
}
七、feign的负载均衡,其实也是对ribbon的负载。
在消费者的application中配置如下:
#全局配置
## 请求连接的超时时间
#ribbon.ConnectTimeout=5000
## 请求处理的超时时间
#ribbon.ReadTimeout=5000
#局部配置
# 对所有操作请求都进行重试
e-book-product.ribbon.OkToRetryOnAllOperations=true
# 对当前实例的重试次数
e-book-product.ribbon.MaxAutoRetries=2
# 切换实例的重试次数
e-book-product.ribbon.MaxAutoRetriesNextServer=0
# 请求连接的超时时间
e-book-product.ribbon.ConnectTimeout=3000
# 请求处理的超时时间
e-book-product.ribbon.ReadTimeout=3000
# 指定具体的服务实例清单
#e-book-product.ribbon.listOfServers=
备注:红线部分为服务提供这的服务名称,建议在实际应用中使用局部配置,这样防止请求所有的服务提供者一刀切