1. 程式人生 > 其它 >RIBBON的負載均衡策略

RIBBON的負載均衡策略

技術標籤:springjavaspring

RIBBON的負載均衡策略及使用方法

Ribbon的負載均衡策略有:

策略類  命名描述
RandomRule隨機策略隨機選擇server
RoundRobinRule輪詢策略輪詢選擇, 輪詢index,選擇index對應位置的Server;
RetryRule重試策略對選定的負載均衡策略機上重試機制,在一個配置時間段內當選擇Server不成功,則一直嘗試使用subRule的方式選擇一個可用的server;
BestAvailableRule最低併發策略逐個考察server,如果server斷路器開啟,則忽略,再選擇其中併發連結最低的server
AvailabilityFilteringRule可用過濾策略過濾掉一直失敗並被標記為circuit tripped的server,過濾掉那些高併發連結的server(active connections超過配置的閾值)或者使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status裡記錄的各個Server的執行狀態;
ResponseTimeWeightedRule響應時間加權重策略根據server的響應時間分配權重,響應時間越長,權重越低,被選擇到的概率也就越低。響應時間越短,權重越高,被選中的概率越高,這個策略很貼切,綜合了各種因素,比如:網路,磁碟,io等,都直接影響響應時間
ZoneAvoidanceRule區域權重策略綜合判斷server所在區域的效能,和server的可用性,輪詢選擇server並且判斷一個AWS Zone的執行效能是否可用,剔除不可用的Zone中的所有server

可以使用程式碼配置屬性配置的方式為某一個微服務提供輪詢策略,比如A服務使用隨即策略,B服務使用輪詢策略。。

程式碼配置:

程式碼示例

  • 建立一個空類,並在其上新增@Configuration註解和@RibbonClient註解。

複製程式碼

/**
 * 使用RibbonClient,為特定的目標服務 user 自定義配置。
 * 使用@RibbonClient的configuration屬性,指定Ribbon的配置類。
 */
@Configuration
@RibbonClient(name = "user", configuration = RibbonConfiguration.class)
public class TestConfiguration {
}

複製程式碼

由程式碼可知,使用@RibbonClient註解的configuration屬性,即可自定義指定名稱Ribbon客戶端的配置。

  • 建立Ribbon的配置類。

複製程式碼

/**
 * 該類為Ribbon的配置類
 * 注意:該類不能放在主應用程式上下文@ComponentScan所掃描的包中,否則配置將會被所有Ribbon Client共享。*/
@Configuration
public class RibbonConfiguration {
  @Bean
  public IRule ribbonRule() {
    // 負載均衡規則,改為隨機
    return new RandomRule();
  }
}

複製程式碼

注意:該類不能放在主應用程式上下文@ComponentScan所掃描的包中,否則配置將會被所有Ribbon Client共享。

如果放到掃描包裡面,那也可以自定義註解,標記不自動掃描類:

public @interface IgnoreScan {
}

然後配置策略,使用不自動掃描註解:

複製程式碼

@Configuration
@IgnoreScan //這是自定義的註解
public class CustomLoadBalanceConfig {
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}

複製程式碼

最後在啟動類,定義元件掃碼 和 設定服務的負載均衡策略:

@RibbonClient(name = "user", configuration = CustomLoadBalanceConfig.class)//這裡指定了使用上面的configuration,name是服務id
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value =IgnoreScan.class)})

屬性配置

程式碼示例:

user:#這個是微服務的id
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #隨機策略

屬性配置的優先順序高於程式碼配置。

除了上面的針對某一個微服務的細粒度的配置,還可以全域性配置,Ribbon只支援使用程式碼實現全域性配置。

全域性配置:

複製程式碼

//首先定義一個空類,使用@RibbonClients
@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class)
public class RibbonClientDefaultConfigurationTestsConfig {
}

//然後定義一個config類,指定使用的負載均衡策略
@Configuration
public class DefaultRibbonConfig {
  @Bean
  public IRule ribbonRule() {
    return new RandomRule();
  }
}