一、Feign介绍
Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求。 Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix 实现负载均衡和断路器,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。
Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。
深入理解ribbon
二、Feign解决了什么问题?
封装了Http调用流程,更适合面向接口化的变成习惯
三、Feign远程调用的基本流程
Feign远程调用,核心就是通过一系列的封装和处理,将以JAVA注解的方式定义的远程调用API接口,最终转换成HTTP的请求形式,然后将HTTP的请求的响应结果,解码成JAVA Bean,放回给调用者。Feign远程调用的基本流程
Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的 Request 请求。通过Feign以及JAVA的动态代理机制,使得Java 开发人员,可以不用通过HTTP框架去封装HTTP请求报文的方式,完成远程服务的HTTP调用。
四、Feign的HTTP客户端
Feign的HTTP客户端支持3种框架,分别是;HttpURLConnection、HttpClient、OKHttp。Feign中默认使用HttpURLConnection。
1、HttpURLConnection是JDK自带的HTTP客户端技术,并不支持连接池,如果要实现连接池的机制,还需要自己来管理连接对象。对于网络请求这种底层相对复杂的操作,如果有可用的其他方案,也没有必要自己去管理连接对象。 2、Apache提供的HttpClient框架相比传统JDK自带的HttpURLConnection,它封装了访问http的请求头,参数,内容体,响应等等;它不仅使客户端发送HTTP请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性;另外高并发大量的请求网络的时候,还是用“HTTP连接池”提升吞吐量。 3、OKHttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架。OKHttp拥有共享Socket,减少对服务器的请求次数,通过连接池,减少了请求延迟等技术特点。
配置httpclient客户端
feign:
httpclient:
enabled: true
五、负载均衡
在使用@FeignClient注解的时候 是默认使用了ribbon进行客户端的负载均衡的,默认的是轮询策略,那么如果我们想要更改策略的话,需要修改消费者yml中的配置,如下:
order-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule
ConnectTimeout: 500
ReadTimeout: 1000
OkToRetryOnAllOperations: true
MaxAutoRetriesNextServer: 2
MaxAutoRetries: 1
这里我们可以看到ribbon的策略主要有以下几种:
com.netflix.loadbalancer.RandomRule #配置规则 随机 com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询 com.netflix.loadbalancer.RetryRule #配置规则 重试 com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重 com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略 随机:几个提供者间随机访问
轮询:轮流访问
重试:在一段时间内通过RoundRobinRule选择服务实例,一段时间内没有选择出服务则线程终止
响应时间权重:根据平均响应时间来计算权重,权重意思是,请求时间越久的server,其被分配给客户端使用的可能性就越低
|