Ribbon的使用


參考:https://blog.csdn.net/yuanyuan_gugu/article/details/107336264

一、Ribbon

客戶端負載均衡組件Ribbon,它是基於 Netflix Ribbon 實現的一套客戶端負載均衡的工具;

  Ribbon主要功能是提供客戶端的軟件負載均衡算法,將Netflix的中間服務連接在一起,Ribbon客戶端組件提供一系列完善的配置項,如連接超時,重試等。就是在配置文件中列出Loade Balancer(簡稱LB)后面的所有機器,Ribbon會自動的幫助基於某種規則(輪詢,隨機等)去連接這些機器。也可以使用 Ribbon 實現自定義的負載均衡算法

1、Ribbon組件來實現負載均衡

(1)maven的坐標引入

<!‐‐加入nocas‐client‐‐>
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring‐cloud‐alibaba‐nacos‐discovery</artifactId>
</dependency>

<!‐‐加入ribbon‐‐>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

(2)在 RestTemplate 上加入 @LoadBalanced 注解

@Configuration
public class WebConfig {

        @LoadBalanced
	@Bean
	public RestTemplate restTemplate( ) {
		return new RestTemplate();
	}
}

2、Ribbon的負載均衡算法及配置

(1)負載均衡算法

① RoundRobinRule:輪詢選擇,輪詢下標,選擇下標對應位置的Server;

② Random:隨機選擇Server;

③ RetryRule:對選定的負載均衡策略機上重試機制;在一個配置時間段內選擇的Server不成功時,則一直嘗試使用 subRule 的方式選擇一個可用的Server;

④ AvailabilityFilteringRule:過濾掉一直連接失敗的被標記為 circuit tripped (斷路器狀態)的后端Server,並過濾掉那些高並發的后端Server或者使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status里記錄的各個Server的運行狀態。對剩下的使用輪詢策略去訪問。

⑤ BestAvailableRule:會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態(tripped)的Server,然后選擇一個並發量最小的Server

⑥ WeightedResponseTimeRule:根據響應時間加權,響應時間越長,權重越小,被選中的可能性越低;根據平均響應時間計算所有服務的權重,響應時間越快的服務權重越大被選中的概率越大。剛啟動時如果統計信息不足,則使用RoundRobinRule(輪詢)策略,等統計信息足夠,會切換到WeightedResponseTimeRule。

⑦ ZoneAvoidanceRule默認):復合判斷Server所在Zone的性能和Server的可用性選擇Server,在沒有Zone的情況下類是輪詢。

 (2)負載均衡算法的選擇

方式一:注解方式

@Configuration
public class ServerConfig {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    @Bean public IRule rule() { return new RandomRule(); }
}

方式二:配置文件的方式

格式

{server-name}:

  ribbon:

        NFLoadBalancerRuleClassName:  負載均衡算法對應的全類名

例如:當前服務調用 product-center 服務:

product-center:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

(3)Ribbon 的細粒度配置

例如:Order調用Product服務使用隨機算法,Order調用 Pay服務使用輪詢的算法,這就需要細粒度的配置。

<1>. 使用注解的方式

ProductRibbonCofig

@Configuration
public class ProductRibbonConfig {
	@Bean
	public IRule randomRule() {
		return new RandomRule();
	}
}

PayRibbonConfig

@Configuration
public class PayRibbonConfig {
	@Bean
	public IRule roundRobinRule() {
		return new RoundRobinRule();
	}
}

注意ProductRibbonCofig 和  PayRibbonConfig 類要放在包掃描不能掃到的位置,否則起不到細粒度配置的作用。

@Configuration @RibbonClients(value = { @RibbonClient(name = "product‐center", configuration = ProductRibbonConfig.class), @RibbonClient(name = "pay‐center", configuration = PayRibbonConfig.class) })
public class CustomRibbonConfig {
 
}

<2>. 使用配置文件的方式

# 全局的負載均衡算法使用ZoneAvoidanceRule
ribbon:
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule

# 調用product-center服務使用RandomRule
product-center:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

# 調用pay-center服務使用RoundRobinRule
pay-center:
  ribbon:
	NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

說明: 調用product-center服務使用的 Random算法,調用pay-center服務使用 RoundRobinRule 算法,調用其他服務的負載均衡算法使用 ZoneAvoidanceRule。

推薦使用配置文件的方式定義負載均衡算法。

(4)解決Ribbon第一次調用耗時高的問題

開啟飢餓加載:

ribbon:
  eager-load:
    clients: product-center,pay-center
    enabled: true

Ribbon的常用參數

# 每一台服務器重試的次數,不包含首次調用的那一次
ribbon.MaxAutoRetries=1

# 重試的服務器的個數,不包含首次調用的那一台實例
ribbon.MaxAutoRetriesNextServer=2

# 是否對所以的操作進行重試(True 的話 會對post put操作進行重試,存在服務冪等問題)
ribbon.OkToRetryOnAllOperations=false

# 建立連接超時
ribbon.ConnectTimeout=3000

# 讀取數據超時
ribbon.ReadTimeout=3000

Ribbon的詳細配置http://c.biancheng.net/view/5356.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM