springcloud笔记4——Ribbon 负载均衡

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的平均响应时间计算其权重,响应时间越快权重越大,被选中的机率就越高(并非是权重最大的一定被选定)。
在刚启动时采用轮询策略。后面就会根据权重进行选择了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

占星安啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值