1. 程式人生 > >每天學點SpringCloud(三):自定義Eureka集群負載均衡策略

每天學點SpringCloud(三):自定義Eureka集群負載均衡策略

log util domain 避免 can val 如果 dba filters

相信看了 每天學點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

br/>@Bean
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
br/>@ExcludeFromComponentScan
br/>@Bean
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/2388386839/spring-cloud-demo

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

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

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

每天學點SpringCloud(三):自定義Eureka集群負載均衡策略