前言
在初步了解了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。