SpringCloud Ribbon組成和負載均衡規則

Ribbon飢餓加載

默認情況下Ribbon是懶加載的。當服務起動好之後,第一次請求是非常慢的,第二次之後就快很多。

解決方式:開啓飢餓加載

ribbon:
 eager-load:
  enabled: true #開啓飢餓加載
  clients: server-1,server-2,server-3 #爲哪些服務的名稱開啓飢餓加載,多個用逗號分隔

Ribbon組成

接口 作用 默認值
IclientConfig 讀取配置 DefaultClientConfigImpl
IRule 負載均衡規則,選擇實例 ZoneAvoidanceRule
IPing 篩選掉ping不通的實例 DumyPing(該類什麼不幹,認爲每個實例都可用,都能ping通)
ServerList<Server> 交給Ribbon的實例列表 Ribbon:ConfigurationBasedServerList
Spring Cloud Alibaba:NacosServerList
ServerListFilter<Server> 過濾掉不符合條件的實例 ZonePreferenceServerListFilter
ILoadBalancer Ribbon的入口 ZoneAwareLoadBalancer
ServerListUpdater 更新交給Ribbon的List的策略 PollingServerListUpdater

這裏的每一項都可以自定義
IclientConfigRibbon支持非常靈活的配置就是由該組件提供的
IRule爲Ribbon提供規則,從而選擇實例、該組件是最核心的組件
舉例:
代碼方式

@Configuration
public class RibbonRuleConfig {
    @Bean
    public IRule ribbonRulr() {
        return new RandomRule();
    }
    @Bean
    public IPing iPing(){
        return new PingUrl();
    }
}

配置屬性方式

<clientName>:
 ribbon:
  NFLoadBalancerClassName: #ILoadBalancer該接口實現類
  NFLoadBalancerRuleClassName: #IRule該接口實現類
  NFLoadBalancerPingClassName: #Iping該接口實現類
  NIWSServerListClassName: #ServerList該接口實現類
  NIWSServerListFilterClassName: #ServiceListFilter該接口實現類

在這些屬性中定義的類優先於使用@RibbonClient(configuration=RibbonConfig.class)Spring 定義的bean 以及由Spring Cloud Netflix提供的默認值。描述:配置文件中定義ribbon優先代碼定義

Ribbon負載均衡的八種算法,其中ResponseTimeWeightedRule已廢除

規則名稱 特點
AvailabilityFilteringRule 過濾掉一直連接失敗的被標記爲circuit tripped(電路跳閘)的後端Service,並過濾掉那些高併發的後端Server或者使用一個AvailabilityPredicate來包含過濾Server的邏輯,其實就是檢查status的記錄的各個Server的運行狀態
BestAvailableRule 選擇一個最小的併發請求的Server,逐個考察Server,如果Server被tripped了,則跳過
RandomRule 隨機選擇一個Server
ResponseTimeWeightedRule 已廢棄,作用同WeightedResponseTimeRule
RetryRule 對選定的負責均衡策略機上充值機制,在一個配置時間段內當選擇Server不成功,則一直嘗試使用subRule的方式選擇一個可用的Server
RoundRobinRule 輪詢選擇,輪詢index,選擇index對應位置Server
WeightedResponseTimeRule 根據相應時間加權,相應時間越長,權重越小,被選中的可能性越低
ZoneAvoidanceRule (默認是這個)負責判斷Server所Zone的性能和Server的可用性選擇Server,在沒有Zone的環境下,類似於輪詢(RoundRobinRule

實現負載均衡<細粒度>配置-隨機

方式一:JAVA代碼方式

首先定義RestTemplate,並且添加註解@LoadBalanced,這樣RestTemplate就實現了負載均衡

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
//template.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));//解決中文亂碼
return new RestTemplate();
}

在SpringBootApplication主類下添加配置類。該類主要作用於爲哪個服務做負載均衡。默認的是輪訓

@Configuration
@RibbonClient(name = "${服務名稱}", configuration = GoodsRibbonRuleConfig.class)//configuration: 指向負載均衡規則的配置類
public class GoodsRibbonConfig {
}

添加Ribbon的配置類,注意該類必須配置在@SpringBootApplication主類以外的包下。不然的話所有的服務都會按照這個規則來實現。會被所有的RibbonClient共享。主要是主類的主上下文和Ribbon的子上下文起衝突了。父子上下文不能重疊。相關連接:https://blog.csdn.net/qq_3258...

@Configuration
public class GoodsRibbonRuleConfig {
    @Bean
    public IRule ribbonRulr() {
        return new RandomRule();
    }
}

或者使用自定義註解排除該類

方式一:配置屬性方式

server-1: # 服務名稱 Service-ID
  ribbon:
    # 屬性配置方式【推薦】
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #  配置文件配置負載均衡算法-我這裏使用的是自定義的Ribbon的負載均衡算法,默認

優先級:配置(不會影響其他服務)>(大於) 硬編碼(類得寫在SpringBoot啓動類包外,不然會影響其他服務)

總結:

配置方式 有點 缺點
代碼配置 基於代碼,更加靈活 有坑(父子上下文)
線上修改得重新打包,發佈
屬性配置 易上手 配置更加直觀
線上修改無需重新打包,發佈
優先級更高
極端場景下沒有配置配置方式靈活

實現負載均衡<全局>配置-隨機

方式一:Ribbon的配置類定義在主類下

讓ComponentScan上下文重疊(強烈不建議使用

方式二:

@Configuration
@RibbonClients(defaultConfiguration = GoodsRibbonRuleConfig.class)//Ribbon負載均衡全局粒度配置(所有服務都按照這個配置)
public class RibbonConfig {
}

趙小胖個人博客

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