SpringCloud入坑记-Ribbon进阶

    xiaoxiao2022-07-14  140

    前言 在初步了解了Ribbon之后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-c

    Ribbon不是在启动时就加载完负载均衡策略,而是在实际请求时才真实创建。于是可以通过开启饥饿加载的方式来回避。 当然第一次请求失败的原因很多,这只是其中一种思路,之后在接触其他组件的时候,也可能遇到类似问题。

    未完待续

    负载均衡的实现很简单,思想更重要,下一节将接触新的组件Feign,可以说它是对Ribbon的封装。

    项目代码托管于Github。

    最新回复(0)