1.Ribbon简介
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过SpringCloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的。
2.基本配置
openfeign已经内置了Ribbon,不需要另外依赖,默认负载均衡策略是轮询,还内置了一些常用的策略,在消费端指定策略有两种方式:
2.1 修改配置文件
//指定要修改负载均衡的微服务
abcmsc-provider-depart:
ribbon:
//改为随机
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
如果不指定就是全局的
2.2 修改配置类
@Configuration
public class MyRule {
//指定全局的负载均衡策略 为 过滤算法,排除熔断或超过极限的服务剩下的可用的轮询
@Bean
public IRule xx(){
return new AvailabilityFilteringRule();
}
}
2.3 自定义负载均衡策略
/**
* 自定义负载均衡策略:排除指定端口,随机剩下的可用服务
*/
public class CustomRule implements IRule {
private ILoadBalancer lb;
private List<Integer> excludePorts;
public CustomRule() {
}
public CustomRule(List<Integer> excludePorts) {
this.excludePorts = excludePorts;
}
@Override
public Server choose(Object key) {
List<Server> servers = lb.getReachableServers();
List<Server> availableServers = this.getAvailableServers(servers);
return this.getAvailableRandomServers(availableServers);
}
private List<Server> getAvailableServers(List<Server> servers) {
if(excludePorts == null || excludePorts.size() == 0) {
return servers;
}
List<Server> aservers = new ArrayList<>();
for (Server server : servers) {
boolean flag = true;
for(Integer port : excludePorts) {
if(server.getPort() == port) {
flag = false;
break;
}
}
if (flag) {
aservers.add(server);
}
}
return aservers;
}
private Server getAvailableRandomServers(List<Server> availableServers) {
int index = new Random().nextInt(availableServers.size());
return availableServers.get(index);
}
@Override
public void setLoadBalancer(ILoadBalancer lb) {
this.lb = lb;
}
@Override
public ILoadBalancer getLoadBalancer() {
return lb;
}
}
@Configuration
public class MyRule {
//指定自定义负载均衡策略
@Bean
public IRule xx(){
List<Integer> excludePorts = new ArrayList<>();
excludePorts.add(8081);
return new CustomRule(excludePorts);
}
}
3. 内置负载均衡算法
内置的负载均衡配置类在com.netflix.loadbalancer 包下。
以Rule结尾的实现类都可以花时间看下源码,编写自定义策略可以参考
3.1 RoundRobinRule
轮询策略。Ribbon默认采用的策略。若经过一轮轮询没有找到可用的provider,其最多轮询 10 轮。若最终还没有找到,则返回 null。
3.2 RandomRule
随机策略,从所有可用的 provider 中随机选择一个。
3.3 RetryRule
重试策略。先按照RoundRobinRule策略获取provider,若获取失败,则在指定的时限内重试。默认的时限为 500 毫秒。
3.4 BestAvailableRule
最可用策略。选择并发量最小的 provider,即连接的消费者数量最少的 provider。
3.5 AvailabilityFilteringRule
可用过滤算法。该算法规则是:过滤掉处于服务熔断状态的provider,或已经超过连接极限的provider,对剩余provider采用轮询策略。
3.6 ZoneAvoidanceRule
区域回避策略。综合provider所在区域的性能及provider的可用性,对服务器进行选择。
3.7 WeightedResponseTimeRule
“权重响应时间”策略。根据每个provider的平均响应时间计算其权重,响应时间越快权重越大,被选中的机率就越高(并非是权重最大的一定被选定)。
在刚启动时采用轮询策略。后面就会根据权重进行选择了。