spring-cloud之feign

一、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改成如下:

spring-cloud之feign_第1张图片

 

3、消费者模块也要引用公共模块

 

四:feign对复杂参数的请求处理

1、参考e-book-consumer-feign-paramter工程

 

五:gzip参数压缩传输

1、

spring-cloud之feign_第2张图片

 

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

 

spring-cloud之feign_第3张图片

 

五、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=

 

备注:红线部分为服务提供这的服务名称,建议在实际应用中使用局部配置,这样防止请求所有的服务提供者一刀切

你可能感兴趣的:(spring-cloud之feign)