1. 关于负载均衡
负载均衡一般分为服务器端负载均衡和客户端负载均衡
-
服务器端负载均衡:比如Nginx、F5这些,请求到达服务器之后由这些负载均衡器根据一定的算法 将请求路由到目标服务器处理。
-
客户端负载均衡:比如我们要说的Ribbon,服务消费者客户端会有一个服务器地址列表,调用方在请求前通过一定的负载均衡算法选择一个服务器进行访问,负载均衡算法的执行是在请求客户端进行。
Ribbon是Netflix发布的负载均衡器。Eureka一般配合Ribbon进行使用,Ribbon利用从Eureka中读取到服务信息,在调用服务提供者提供的服务时,会根据一定的算法进行负载。
2. Ribbon使用及配置
使用Ribbon时不需要引入额外的Jar坐标,因为在服务消费者中我们引入过eureka-client,它会引入Ribbon相关Jar
代码中使用如下,在RestTemplate上添加对应注解即可
// 使用RestTemplate模板对象进行远程调用
@Bean
//Ribbon负载均衡
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
3. Ribbon负载均衡策略
负载均衡策略 | 描述 |
---|---|
RoundRobinRule:轮询 策略 | 默认超过10次获取到的server都不可用,会返回一个空的server |
RandomRule:随机策略 | 如果随机到的server为null或者不可用的话,会while不停的循环选 取 |
RetryRule:重试策略 | 一定时限内循环重试。默认继承RoundRobinRule,也支持自定义 注入,RetryRule会在每次选取之后,对选举的server进行判断, 是否为null,是否alive,并且在500ms内会不停的选取判断。而 RoundRobinRule失效的策略是超过10次,RandomRule是没有失 效时间的概念,只要serverList没都挂。 |
BestAvailableRule:最小 连接数策略 | 遍历serverList,选取出可用的且连接数最小的一个server。该算 法里面有一个LoadBalancerStats的成员变量,会存储所有server 的运行状况和连接数。如果选取到的server为null,那么会调用 RoundRobinRule重新选取。1(1) 2(1) 3(1) |
AvailabilityFilteringRule: 可用过滤策略 | 扩展了轮询策略,会先通过默认的轮询选取一个server,再去判断 该server是否超时可用,当前连接数是否超限,都成功再返回。 |
ZoneAvoidanceRule:区 域权衡策略**(默认策略)** | 扩展了轮询策略,继承了2个过滤器:ZoneAvoidancePredicate和 AvailabilityPredicate,除了过滤超时和链接数过多的server,还会 过滤掉不符合要求的zone区域里面的所有节点,AWS --ZONE 在一 个区域/机房内的服务实例中轮询 |
4. 修改负载均衡策略
在配置文件中添加如下内容,下面是一些常用配置,这里单独对一个服务提供者配置,可以针对全局配置
#针对的被调用方微服务名称,不加就是全局生效
xxx-service:
ribbon:
#请求连接超时时间
ConnectTimeout: 2000
#请求处理超时时间
ReadTimeout: 3000
#对所有操作都进行重试
OkToRetryOnAllOperations: true
####根据如上配置,当访问到故障请求的时候,它会再尝试访问一次当前实例(次数由MaxAutoRetries配置),
####如果不行,就换一个实例进行访问,如果还不行,再换一次实例访问(更换次数由MaxAutoRetriesNextServer配置),
####如果依然不行,返回失败信息。
MaxAutoRetries: 0 #对当前选中实例重试次数,不包括第一次调用
MaxAutoRetriesNextServer: 0 #切换实例的重试次数
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #负载策略调整