前言 在初步了解了Ribbon之后Ribbon初体验,还需要进一步探究Ribbon高级特性。
Ribbon提供了许多负载均衡策略,其中一部分列举如下:
类简称说明RandomRule随机随机地选择服务RoundRobinRule轮询依次循环选择服务RetryRule重试选择服务失败以后尝试选择其他服务BestAvaiableRule最低并发选择连接数最少的服务AvailabilityFilteringRule可用过滤过滤掉被标记的服务ResponseTimeWeightedRule响应时间加权响应时间越长,权重越低,选择的概率越低ZoneAvoidanceRule区域权衡在一个区域中轮询选择Ribbon实现了这么多的负载均衡策略,在项目中如何应用上呢?
复制项目ms-c1-order-ribbon,命名为ms-d1-order-ribbon.
在配置类CustomConfig中添加如下代码:
@Bean public IRule ribbonRule(){ return new RandomRule(); }简单的配置,就完成了负载均衡策略的切换,之后所有通过Ribbon调用的请求都会使用该策略(随机).
要是想使用其他的策略,修改为对应的实现类:
@Bean public IRule ribbonRule(){ return new WeightedResponseTimeRule(); }这种配置是全局生效的,一旦配置以后,所有的调用都是基于该策略。有时候,我们并不想这样做,就可以通过下面这种方式。
@Configuration public class MyRibbonConfig { @Autowired IClientConfig config; @Bean public IRule ribbonRule(IClientConfig config){ return new RandomRule(); } }需要注意的是该类不应该在主应用程序上下文的@ComponentScan中。
不仅可以通过配置类来配置,还可以在配置文件中声明:
order-a: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule这样就使得服务order-a通过随机策略来请求。
如果机器的性能不算太好,某些时候,可能出现第一次调用超时不成功,但是问题无法很好地重现,这时可以参考下面这种解决方案。
ribbon: eager-load: enable: true clients: order-a, order-cRibbon不是在启动时就加载完负载均衡策略,而是在实际请求时才真实创建。于是可以通过开启饥饿加载的方式来回避。 当然第一次请求失败的原因很多,这只是其中一种思路,之后在接触其他组件的时候,也可能遇到类似问题。
负载均衡的实现很简单,思想更重要,下一节将接触新的组件Feign,可以说它是对Ribbon的封装。
项目代码托管于Github。
