美文网首页
Spring Cloud全解析:负载均衡之Ribbon的负载均衡

Spring Cloud全解析:负载均衡之Ribbon的负载均衡

作者: 墨线宝 | 来源:发表于2024-09-01 10:05 被阅读0次

    Ribbon的负载均衡算法

    提供的负载均衡算法

    Ribbon中有七种负载均衡算法可供选择

    • RoundRobinRule,轮询

    • RandomRule,随机

    • AvailabilityFilteringRule会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务(可以通过niws.loadbalancer.<clientName>.connectionFailureCountThreshold来配置连接失败的次数),还有并发的连接数量超过阈值的服务(可以通过<clientName>.ribbon.ActiveConnectionsLimit来配置最高并发数),然后对剩余的服务列表按照轮询策略进行访问

    • WeightedResponseTimeRule,根据平均响应时间计算所有服务的权重,响应时间越快的服务权重越大被选中的概率越高,刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,会切换到WeightedResponseTimeRule

    • RetryRule,先按照轮询策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用服务

    • BestAvailableRule,会先过滤掉由于多次访问故障而处于跳闸状态的服务,然后选择一个并发量最小的进行访问

    • ZoneAvoidanceRule,复合判断server所在区域的性能和server的可用性选择

    选择负载均衡算法

    // 配置restTemplate的负载均衡算法
    @Bean
    public IRule myRule(){
        return new RandomRule();
    }
    

    自定义负载均衡算法

    /**
     * 自定义负载均衡算法
     * @author zh
     */
    public class MyRule  extends AbstractLoadBalancerRule {
        Random rand;
    
        public MyRule() {
            rand = new Random();
        }
    
            // 根据key来选择对应的服务
        public Server choose(ILoadBalancer lb, Object key) {
            if (lb == null) {
                return null;
            }
            Server server = null;
    
            while (server == null) {
                if (Thread.interrupted()) {
                    return null;
                }
                // 目前存活的服务
                List<Server> upList = lb.getReachableServers();
                // 所有的服务
                List<Server> allList = lb.getAllServers();
    
                int serverCount = allList.size();
                if (serverCount == 0) {
    
                    return null;
                }
                // 生成随机数作为索引获取服务
                int index = rand.nextInt(serverCount);
                server = upList.get(index);
    
                if (server == null) {
    
                    Thread.yield();
                    continue;
                }
    
                if (server.isAlive()) {
                    return (server);
                }
    
                server = null;
                Thread.yield();
            }
    
            return server;
    
        }
    
        @Override
        public Server choose(Object key) {
            return choose(getLoadBalancer(), key);
        }
    
        @Override
        public void initWithNiwsConfig(IClientConfig clientConfig) {
            // TODO Auto-generated method stub
    
        }
    }
    

    配置该bean

    @Configuration
    public class MyRuleConfig {
    
        @Bean
        public IRule myRule(){
            return new MyRule();
        }
    }
    

    使用@RibbonClient来使用自定义的负载均衡类,但是这个自定义的负载均衡类不可以在@ComponentScan所能扫描的包下,否则这个自定义的负载均衡算法就会被所有的Ribbon客户端所共享,无法达到对于某个微服务定制的效果了,该bean在使用的时候才会进行实例化

    @SpringBootApplication
    @EnableEurekaClient
    // 配置自定义的负载均衡类,只针对于某个微服务有效
    @RibbonClient(name = "micro-service-dept-provider",configuration = MyRule.class)
    public class ConsumerApp {
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApp.class,args);
        }
    }
    

    除了使用注解,还可以使用配置文件来配置服务使用的ribbon负载均衡算法

    micro-service-dept-provider:
      ribbon:
        NFLoadBalancerRuleClassName: com.zhanghe.ribbon.rule.MyRule
    

    配置格式为<clientName>.ribbon

    • NFLoadBalancerClassName 配置ILoadBalancer的实现类
    • NFLoadBalancerRuleClassName 配置IRule的实现类
    • NFLoadBalancerPingClassName 配置IPing的实现类
    • NIWSServerListClassName 配置ServerList的实现类
    • NIWSServerListFilterClassName 配置ServerListFilter的实现类

    https://zhhll.icu/2021/框架/微服务/springcloud/负载均衡/Ribbon/2.Ribbon的负载均衡算法/

    相关文章

      网友评论

          本文标题:Spring Cloud全解析:负载均衡之Ribbon的负载均衡

          本文链接:https://www.haomeiwen.com/subject/wulcljtx.html