• SpringCloud Ribbon实现负载均衡,SpringCloud Ribbon自定义策略


    SpringCloud Ribbon实现负载均衡,SpringCloud Ribbon自定义策略

    ================================

    ©Copyright 蕃薯耀 2021-03-09

    https://www.cnblogs.com/fanshuyao/


    一、SpringCloud Ribbon概述
    SpringCloud Ribbon为客户端(消费者端)的负载均衡,Nginx为服务端的负载均衡。


    官网地址:https://github.com/Netflix/ribbon


    官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.1.0.RC2/single/spring-cloud-netflix.html#spring-cloud-ribbon


    翻译文档:http://docs.springcloud.cn/user-guide/ribbon/

    二、SpringCloud Ribbon几种策略:
    1、轮询策略:com.netflix.loadbalancer.RoundRobinRule

    ribbon默认策略

    2、随机策略:com.netflix.loadbalancer.RandomRule
    使用jdk自带的随机数生成工具,生成一个随机数,然后去可用服务列表中拉取服务节点Server。
    如果当前节点不可用,则进入下一轮随机策略,直到选到可用服务节点为止。

    3、轮询失败重试策略:com.netflix.loadbalancer.RetryRule
    轮询失败重试策略(RetryRule)是这样工作的,首先使用轮询策略进行负载均衡,
    如果轮询失败,则再使用轮询策略进行一次重试,相当于重试下一个节点,看下一个节点是否可用,如果再失败,则直接返回失败。

    4、响应时间权重策略:com.netflix.loadbalancer.WeightedResponseTimeRule
    根据响应时间,分配一个权重weight,响应时间越长,weight越小,被选中的可能性越低。

    5、并发量最小可用策略:com.netflix.loadbalancer.BestAvailableRule
    选择一个并发量最小的server返回。如何判断并发量最小呢?ServerStats有个属性activeRequestCount,
    这个属性记录的就是server的并发量。轮询所有的server,选择其中activeRequestCount最小的那个server,就是并发量最小的服务节点。

    6、可用过滤策略:com.netflix.loadbalancer.AvailabilityFilteringRule
    过滤掉连接失败的服务节点,并且过滤掉高并发的服务节点,然后从健康的服务节点中,使用轮询策略选出一个节点返回。

    7、区域权重策略:com.netflix.loadbalancer.ZoneAvoidanceRule
    复合判断server所在区域的性能和server的可用性,来选择server返回。


    三、SpringCloud Ribbon客户端实现负载均衡策略,SpringCloud Ribbon自定义负载均衡策略

    1、RestTemplate添加注解@LoadBalanced实现负载均衡

    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class RestConfig {
    
        //@LoadBalanced实现负载均衡
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }

    2、启动添加注解@RibbonClient指定某微服务要实现的策略
    @RibbonClient注解:
    name为微服务名称,必须和服务提供者的微服务名称一致,configuration配置自定义的负载均衡规则
    配置类不能被启动类扫描到(即不能放在启动类的包或者子包下),否则会成为全局配置:方式一:放在不同的包下。方式二:启动类排除该配置类

    @SpringBootApplication
    @EnableEurekaClient
    //name为微服务名称,必须和服务提供者的微服务名称一致,configuration配置自定义的负载均衡规则
    //RibbonConfig.class不能被启动类扫描到,否则会成为全局配置:方式一:放在不同的包下。方式二:启动类排除该配置类
    @RibbonClient(name = "SPRINGCLOUD-EUREKA-SERVER", configuration = RibbonConfig.class)
    public class SpringCloudEurekaWebApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudEurekaWebApplication.class, args);
        }
    
    }

    3、定义要实现的策略配置类,策略只能返回唯一一个bean对象

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.netflix.loadbalancer.AvailabilityFilteringRule;
    import com.netflix.loadbalancer.BestAvailableRule;
    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.RandomRule;
    import com.netflix.loadbalancer.RetryRule;
    import com.netflix.loadbalancer.RoundRobinRule;
    import com.netflix.loadbalancer.WeightedResponseTimeRule;
    import com.netflix.loadbalancer.ZoneAvoidanceRule;
    
    /**
     * Ribbon为客户端的负载均衡,Nginx为服务端的负载均衡
     *  Ribbon自定义负载均衡策略
     *  
       *    策略只能定义一个,不能定义多个,不然会报错:
     * org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
     * No qualifying bean of type 'com.netflix.loadbalancer.IRule' available: 
     * expected single matching bean but found 7: 
     * randomRule,retryRule,roundRobinRule,weightedResponseTimeRule,bestAvailableRule,availabilityFilteringRule,zoneAvoidanceRule
     *
     */
    @Configuration
    public class RibbonConfig {
    
    
        /**
         * 轮询策略(ribbon默认策略)
         * @return
         */
        @Bean
        public IRule roundRobinRule() {
            return new RoundRobinRule();
        }
        
        
        /**
         * 随机策略
         * 随机策略:使用jdk自带的随机数生成工具,生成一个随机数,然后去可用服务列表中拉取服务节点Server。
         * 如果当前节点不可用,则进入下一轮随机策略,直到选到可用服务节点为止。
         * @return
         */
        public IRule randomRule() {
            return new RandomRule();
        }
        
        
        /**
         * 轮询失败重试策略
         * 轮询失败重试策略(RetryRule)是这样工作的,首先使用轮询策略进行负载均衡,
         * 如果轮询失败,则再使用轮询策略进行一次重试,相当于重试下一个节点,看下一个节点是否可用,如果再失败,则直接返回失败。
         * @return
         */
        public IRule retryRule() {
            return new RetryRule();
        }
        
        
        /**
         *  响应时间权重策略
         *  策略描述:根据响应时间,分配一个权重weight,响应时间越长,weight越小,被选中的可能性越低。
         * @return
         */
        public IRule weightedResponseTimeRule() {
            return new WeightedResponseTimeRule();
        }
        
        
        /**
         *  并发量最小可用策略
         *  策略描述:选择一个并发量最小的server返回。如何判断并发量最小呢?ServerStats有个属性activeRequestCount,
         *  这个属性记录的就是server的并发量。轮询所有的server,选择其中activeRequestCount最小的那个server,就是并发量最小的服务节点。
         * @return
         */
        public IRule bestAvailableRule() {
            return new BestAvailableRule();
        }
        
        
        /**
         *  可用过滤策略
         *  策略描述:过滤掉连接失败的服务节点,并且过滤掉高并发的服务节点,然后从健康的服务节点中,使用轮询策略选出一个节点返回。
         * @return
         */
        public IRule availabilityFilteringRule() {
            return new AvailabilityFilteringRule();
        }
        
        
        /**
         *  
         *  策略描述:复合判断server所在区域的性能和server的可用性,来选择server返回。
         * @return
         */
        public IRule zoneAvoidanceRule() {
            return new ZoneAvoidanceRule();
        }
        
    }

    (时间宝贵,分享不易,捐赠回馈,^_^)

    ================================

    ©Copyright 蕃薯耀 2021-03-09

    https://www.cnblogs.com/fanshuyao/

    今天越懒,明天要做的事越多。
  • 相关阅读:
    上海 政府性 常用网站
    linux 如何显示一个文件的某几行(中间几行)
    oracle 替换其中部分内容
    notepad++ 开始和结尾
    ll -d
    Mongodb总结3-稍微封装一下
    Mongodb总结3-稍微封装一下
    Mongodb总结2-Java版本的HelloWorld-CRUD例子
    Mongodb总结2-Java版本的HelloWorld-CRUD例子
    Mongodb总结1-启动和Shell脚本
  • 原文地址:https://www.cnblogs.com/fanshuyao/p/14503782.html
Copyright © 2020-2023  润新知