参考:https://blog.csdn.net/yuanyuan_gugu/article/details/107336264
一、Ribbon
客户端负载均衡组件Ribbon,它是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具;
Ribbon主要功能是提供客户端的软件负载均衡算法,将Netflix的中间服务连接在一起,Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。就是在配置文件中列出Loade Balancer(简称LB)后面的所有机器,Ribbon会自动的帮助基于某种规则(轮询,随机等)去连接这些机器。也可以使用 Ribbon 实现自定义的负载均衡算法。
1、Ribbon组件来实现负载均衡
(1)maven的坐标引入
<!‐‐加入nocas‐client‐‐> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring‐cloud‐alibaba‐nacos‐discovery</artifactId> </dependency> <!‐‐加入ribbon‐‐> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
(2)在 RestTemplate 上加入 @LoadBalanced 注解
@Configuration public class WebConfig { @LoadBalanced @Bean public RestTemplate restTemplate( ) { return new RestTemplate(); } }
2、Ribbon的负载均衡算法及配置
(1)负载均衡算法
① RoundRobinRule:轮询选择,轮询下标,选择下标对应位置的Server;
② Random:随机选择Server;
③ RetryRule:对选定的负载均衡策略机上重试机制;在一个配置时间段内选择的Server不成功时,则一直尝试使用 subRule 的方式选择一个可用的Server;
④ AvailabilityFilteringRule:过滤掉一直连接失败的被标记为 circuit tripped (断路器状态)的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个Server的运行状态。对剩下的使用轮询策略去访问。
⑤ BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态(tripped)的Server,然后选择一个并发量最小的Server
⑥ WeightedResponseTimeRule:根据响应时间加权,响应时间越长,权重越小,被选中的可能性越低;根据平均响应时间计算所有服务的权重,响应时间越快的服务权重越大被选中的概率越大。刚启动时如果统计信息不足,则使用RoundRobinRule(轮询)策略,等统计信息足够,会切换到WeightedResponseTimeRule。
⑦ ZoneAvoidanceRule(默认):复合判断Server所在Zone的性能和Server的可用性选择Server,在没有Zone的情况下类是轮询。
(2)负载均衡算法的选择
方式一:注解方式
@Configuration
public class ServerConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
public IRule rule() {
return new RandomRule();
}
}
方式二:配置文件的方式
格式:
{server-name}:
ribbon:
NFLoadBalancerRuleClassName: 负载均衡算法对应的全类名
例如:当前服务调用 product-center 服务:
product-center: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
(3)Ribbon 的细粒度配置
例如:Order调用Product服务使用随机算法,Order调用 Pay服务使用轮询的算法,这就需要细粒度的配置。
<1>. 使用注解的方式:
ProductRibbonCofig
@Configuration
public class ProductRibbonConfig {
@Bean
public IRule randomRule() {
return new RandomRule();
}
}
PayRibbonConfig
@Configuration
public class PayRibbonConfig {
@Bean
public IRule roundRobinRule() {
return new RoundRobinRule();
}
}
注意:ProductRibbonCofig 和 PayRibbonConfig 类要放在包扫描不能扫到的位置,否则起不到细粒度配置的作用。
@Configuration @RibbonClients(value = { @RibbonClient(name = "product‐center", configuration = ProductRibbonConfig.class), @RibbonClient(name = "pay‐center", configuration = PayRibbonConfig.class) }) public class CustomRibbonConfig { }
<2>. 使用配置文件的方式
# 全局的负载均衡算法使用ZoneAvoidanceRule
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
# 调用product-center服务使用RandomRule
product-center:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
# 调用pay-center服务使用RoundRobinRule
pay-center:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
说明: 调用product-center服务使用的 Random算法,调用pay-center服务使用 RoundRobinRule 算法,调用其他服务的负载均衡算法使用 ZoneAvoidanceRule。
推荐使用配置文件的方式定义负载均衡算法。
(4)解决Ribbon第一次调用耗时高的问题
开启饥饿加载:
ribbon:
eager-load:
clients: product-center,pay-center
enabled: true
Ribbon的常用参数
# 每一台服务器重试的次数,不包含首次调用的那一次
ribbon.MaxAutoRetries=1
# 重试的服务器的个数,不包含首次调用的那一台实例
ribbon.MaxAutoRetriesNextServer=2
# 是否对所以的操作进行重试(True 的话 会对post put操作进行重试,存在服务幂等问题)
ribbon.OkToRetryOnAllOperations=false
# 建立连接超时
ribbon.ConnectTimeout=3000
# 读取数据超时
ribbon.ReadTimeout=3000
Ribbon的详细配置:http://c.biancheng.net/view/5356.html