前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自定义Eureka集群负载均衡策略

自定义Eureka集群负载均衡策略

作者头像
Java学习录
发布2019-04-18 14:34:34
1.3K0
发布2019-04-18 14:34:34
举报
文章被收录于专栏:Java学习录

相信看了 前两篇的同学都了解到了我的套路,没错,本篇博客同样是为了解决上篇的问题的。

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

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

1

通过代码自定义

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

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

代码语言:javascript
复制
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为自定义的规则:

代码语言:javascript
复制
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类提供的规则

2

第二种

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

1.自定义一个注解 public @interface ExcludeFromComponentScan { } 2.类使用刚才自定义的注解标示

代码语言:javascript
复制
@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中指定包扫描忽略使用上方注解的类,然后注册规则

代码语言:javascript
复制
@RibbonClient(name = "provider-demo", configuration = AvoidLoanbalanced.class)
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class) })

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

使用配置文件自定义

代码语言:javascript
复制
`#为服务Id名称为provider-demo的项目配置负载均衡规则为com.netflix.loadbalancer.WeightedResponseTimeRule
provider-demo:
  ribbon:
      NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档