每天學點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();                     //自定義規則
    }
}
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;
    }
}
 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 {
}
 @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();           //自定義規則
  }
}
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) })
(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
.netflix.loadbalancer.WeightedResponseTimeRule
provider-demo:
  ribbon:
      NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

 

當然,自定義負載均衡策略只需要選擇代碼或配置文件自定義其中的一種就可以了。畢竟美酒雖好,可不要貪杯哦。

 

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

碼雲:https://gitee.com/zhixiang_blog/spring-cloud-demo

 

如果對您有所幫助,請記得幫忙點一個star哦

 

 

 

 

本文出自https://zhixiang.org.cn,轉載請保留。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章