Ribbon(基于OpenFeign)
<h1>概述</h1>
<h3>Ribbon</h3>
<p> Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。</p>
<h3>RibbonOpenFeign、Hystrix与Ribbon的关系</h3>
<pre><code> OpenFeign相比Ribbon在代码实现上是在客户端多了一层接口,之前用ribbon的时候客户端只有controller层,通过restTemplate请求服务端的controller层。Openfeign需要在客户端创建一个service层,并创建一个service接口(要用到@FeignClient注解),其方法和服务端的controller里的方法相对应,之后客户端的controller调这个接口就行了。</code></pre>
<p> OpenFeign的引入直接砍掉了restTemplate,客户端controller在调用服务端时不需要再关注请求的方式、地址以及是forObject还是forEntity,完全面向接口调用,层次结构更加明了,而且OpenFeign自身集成Ribbon,所以默认开启随机的负载均衡。(虽然Eureka也集成了ribbon,但大概是eureka已经停更了,所以openFeign集成了ribbon)。而且还可以和hystrix相结合,写一个类实现service接口,其中实现的方法的方法体便是降级或熔断的fallback方法(需要在接口中指定该实现类)。这样结构更清晰,耦合也更低。</p>
<h1>环境安装</h1>
<h4>参照OpenFeign环境安装</h4>
<p><a href="https://www.showdoc.cc/chlingm?page_id=4628647766074457" title="OpenFeign">OpenFeign</a></p>
<h1>场景预览</h1>
<h3>OpenFeign未使用Ribbon响应时间权重算法(默认随机):</h3>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/05086e194fa8c6b6f710a1ec3278f78a?showdoc=.jpg" alt="" /></p>
<h3>OpenFeign使用Ribbon响应时间权重算法:</h3>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/42312083729cbc843d3137d0090757f9?showdoc=.jpg" alt="" /></p>
<h3>通过对比可发现:</h3>
<pre><code>如果服务消费者未使用Ribbon响应时间权重算法,那么默认是采用随机算法访问服务提供者a和服务提供者b。服务提供者a和服务提供者b被访问的概率各为50%
使用Ribbon响应时间权重算法,可以为每一个服务提供者赋予一个权重值。服务器响应时间越长,这个服务提供者的权重就越小,被访问到的概率就越小。这种算法可以很好地为服务提供者实现能者多劳的功能。</code></pre>
<h1>快速入门</h1>
<h3>根据实际需求,在服务消费者的application.yml中配置:</h3>
<pre><code>ribbon:
# feign调用超时时间,默认1s
ReadTimeout: 10000
# ribbon配置2s刷新一次服务列表,默认30s
ServerListRefreshInterval: 2000
stu-provide:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #配置规则 随机
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #配置规则 重试
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略</code></pre>