zoukankan      html  css  js  c++  java
  • 每天学点SpringCloud(三):自定义Eureka集群负载均衡策略

    相信看了 每天学点SpringCloud(一):简单服务提供者消费者调用每天学点SpringCloud(二):服务注册与发现Eureka这两篇的同学都了解到了我的套路,没错,本篇博客同样是为了解决上篇的问题的。

    上篇我们使用Eureka默认的负载均衡解决了消费方调用服务方硬编码的问题,不过呢,因为是使用的默认负载均衡的策略,所以这次我们就搞一搞事情,来自定义一下它的策略。

    搞这个策略呢有两种实现方式

    通过代码自定义

    通过代码的方式自定义负责均衡策略时需要注意的是,注意避免SpringBoot的包扫描,因为自定义的规则必须在Eureka的规则实例化以后再实例化才会生效,那么这样就有两种方式,

    第一种

    1.在CloudDemoConsumerApplication类上级新建包config,然后新建LoanBalanced类。使用此类注册一个IRule以达到替换Eureka的目的

    package cn.org.config;
    
    import com.netflix.loadbalancer.*;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class LoadBalanced {
        @Bean
        public IRule ribbonRule() {
            return new RoundRobinRule();                //轮训
           // return new WeightedResponseTimeRule();    //加权权重
           //return new RetryRule();                    //带有重试机制的轮训
           //return new RandomRule();                   //随机
           //return new TestRule();                     //自定义规则
        }
    }
    

    2.注意包名,CloudDemoConsumerApplication的包名是cn.org.zhixiang。

    3.想使用哪种负载均衡策略就new哪一种就ok

    4.TestRule为自定义的规则:

    package cn.org.config.domain;
    
    import com.netflix.loadbalancer.ILoadBalancer;
    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.Server;
    
    import java.util.List;
    
    public class TestRule implements IRule {
    
        private ILoadBalancer loadBalancer;
        @Override
        public Server choose(Object o) {
         List<Server> servers= loadBalancer.getAllServers();
            return servers.get(0);
        }
    
        @Override
        public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
            this.loadBalancer=iLoadBalancer;
        }
    
        @Override
        public ILoadBalancer getLoadBalancer() {
            return this.loadBalancer;
        }
    }
    

    如果有自定义的需求的话可以参照这个写法,我这只是测试使用,取的服务列表的第一个。

    5.在CloudDemoConsumerApplication类上添加注解@RibbonClient(name = "provider-demo", configuration = cn.org.config.LoadBalanced

    .class),指定provider-demo服务使用的是LoadBalanced类提供的规则

    第二种:

    依旧把LoadBalanced放到cn.org.zhixiang包下,不过呢通过自定义注解来解决包扫描的问题

    1.自定义一个注解

    public @interface ExcludeFromComponentScan {
    }
    

    2.类使用刚才自定义的注解标示

    @Configuration
    @ExcludeFromComponentScan
    public class AvoidLoanbalanced {
      @Bean
      public IRule ribbonRule() {
        return new RoundRobinRule();        //轮训
        // return new WeightedResponseTimeRule();  //加权权重
        //return new RetryRule();          //带有重试机制的轮训
        //return new RandomRule();          //随机
        //return new TestRule();           //自定义规则
      }
    }
    

    3.Application中指定包扫描忽略使用上方注解的类,然后注册规则

    @RibbonClient(name = "provider-demo", configuration = AvoidLoanbalanced.class)
    @ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class) })
    

    注意:上方两种方式使用一种就够了。

    使用配置文件自定义

    #为服务Id名称为provider-demo的项目配置负载均衡规则为com.netflix.loadbalancer.WeightedResponseTimeRule
    provider-demo:
      ribbon:
          NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
    

    当然,自定义负载均衡策略只需要选择代码或配置文件自定义其中的一种就可以了。毕竟美酒虽好,可不要贪杯哦。

    GitHub:https://github.com/shiyujun/spring-cloud-demo

    如果对您有所帮助,请记得帮忙点一个star哦

     

    本文出自https://zhixiang.org.cn/#/blog/read/9f8bd71e-2482-4014-8566-630aaa75f339,转载请保留。

  • 相关阅读:
    【小梅哥SOPC学习笔记】Altera SOPC嵌入式系统设计教程
    modelsim使用常见问题及解决办法集锦③
    modelsim使用常见问题及解决办法集锦 ②
    KeepAlived双主模式高可用集群
    充分利用nginx的reload功能平滑的上架和更新业务
    nginx日志配置指令详解
    MongoDB 副本集
    MongoDB 备份还原
    MongoDB的搭建、参数
    mongoDB整个文件夹拷贝备份还原的坑
  • 原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9296766.html
Copyright © 2011-2022 走看看