zoukankan      html  css  js  c++  java
  • SpringCloud Ribbon 负载均衡

    Ribbon、Eureka都是Netflix旗下的项目,Eureka Client内置了Ribbon,用于实现负载均衡,默认使用轮询。

      


    Ribbon内置的负载均衡策略

    • RoundRobinRule    轮询,默认策略

      轮询是最简单的负载均衡算法,每次调用服务拿到节点列表后,从前往后依次轮询类表中的每个节点,谁空闲就调用谁。

      测试时往往都是调用列表的第一个节点,因为刷新的手速远远比不上cpu的执行速度,除非是线程阻塞。

      轮询适合节点性能都差不多的情况,如果集群节点性能都差不多,一般使用默认的轮询即可。

      加权轮询   这个不是Ribbon的内置策略,此处只是作为补充。

           在轮询的基础上,对每个节点施加权重。节点的性能不同,性能高的权重分配大些,轮到的几率就大些,负载大些。适合节点性能有明显区别的情况。

    • RetryRule   重试

      先按照RoundRobinRule策略获取provider,若获取失败,则在指定的时限内重试。默认的时限为500毫秒。

    • RandomRule   随机

      从所有节点中随机选择一个。

    • BestAvailableRule   最可用

      选择并发量最小的节点(连接的消费者数量最少的节点)。

    •  AvailabilityFilteringRule  可用过滤

      过滤掉处于断路器跳闸状态的provider,或已经超过连接极限的provider,对剩余provider采用轮询策略。

    • ZoneAvoidanceRule  

      根据大区性能、节点可用性综合进行选择。

    • WeightedResponseTimeRule  权重响应时间

      根据每个provider的平均响应时间计算其权重,响应时间越快权重越大,被选中的机率就越高。刚启动时采用轮询策略,计算出权重后就根据权重进行选择。


    使用Ribbon内置的负载均衡策略

    Eureka Client的依赖已经包含了Ribbon的依赖,所以不必再导Ribbon的依赖。

    负载均衡策略在消费者中进行配置,比如user-service调用order-service,那就在user-service中配置。有2种配置方式:

    • 在springboot配置文件中配置(推荐)
    #配置调用order-service的负载均衡策略
    order-service:
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

    都是一个包下的,把类名换了即可

    • 在引导类中配置
    @SpringBootApplication
    public class UserServiceApplication {
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
        //使用的负载均衡策略
        @Bean
        public RandomRule getRule(){
            return  new RandomRule();
        }
        
        public static void main(String[] args) {
            SpringApplication.run(UserServiceApplication.class, args);
        }
    
    }

    总结: 指定负载均衡策略的类的路径或者自己创建对应的Bean。


    使用自定义的负载均衡策略

    (1)新建一个类来写负载均衡策略

    //需继承AbstractLoadBalancerRule
    public class MyRule extends AbstractLoadBalancerRule{
    
        @Override
        public void initWithNiwsConfig(IClientConfig iClientConfig) {
    
        }
    
        //自定义负载均衡策略,需返回一个节点
        @Override
        public Server choose(Object o) {
            //获取负载均衡器
            ILoadBalancer loadBalancer = this.getLoadBalancer();
    
            //获取目标服务的所有节点,包括了无效节点
            List<Server> allList = loadBalancer.getAllServers();
            //获取目标服务的所有可用节点
            List<Server> upList = loadBalancer.getReachableServers();
    
            for (Server server:upList){
                //有效且空闲
                if (server.isAlive() && server.isReadyToServe()){
                    //ip
                    System.out.println(server.getHost());
                    //port
                    System.out.println(server.getPort());
                    //ip:port的形式
                    System.out.println(server.getHostPort());
                    return server;
                }
            }
    
            // Server的构造函数:Server(String ip,int port)
            // Server server = new Server("127.0.0.1", 10001);
    
            return null;
        }
    }

    注意导入的Server是com.netflix.loadbalancer.Server,不要导错了。

    我们看到choose会传入一个Object类型的参数,这个参数是Ribbon缓存的目标服务所有节点的信息,会自动传入。

    Ribbon对一个服务,会在缓存中维护2个List:一个是此服务的所有节点的信息,一个是此服务所有可用节点的信息。

    缓存的节点列表的维护过程:

    Eureka Client从Eureka Server拿到此服务的节点列表,这个节点列表一直保存在缓存中,不修改;

    将这个列表copy一份作为有效节点列表,也放在缓存中,并定时ping一下列表中的节点,判断节点是否还有效,若无效,则从有效节点列表中删除;

    同时,Eureka Client会轮询Eureka Server此节点列表是否有变化、更新,如果有,舍弃本地缓存的节点列表,从Eureka Server重新获取节点列表。

    (2)在配置文件或引导类中配置负载均衡策略


    要模拟集群可以修改下运行配置

    VM options中设置的参数需要加前缀-D,优先级最高,会覆盖配置文件中相同的配置项。

  • 相关阅读:
    每天拿出来2小时浪费(文/王路) 作者: 王路
    objective-c自学总结(二)---init/set/get方法
    objective-c自学总结(一)---面向对象
    水仙花数
    独木舟上的旅行
    阶乘之和
    小明的调查统计
    管闲事的小明
    重温《STL源码剖析》笔记 第一章
    重温《STL源码剖析》笔记 第三章
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/12304655.html
Copyright © 2011-2022 走看看