SpringCloud Ribbon組成和負載均衡規則

Ribbon飢餓加載

默認狀況下Ribbon是懶加載的。當服務起動好以後,第一次請求是很是慢的,第二次以後就快不少。web

解決方式:開啓飢餓加載

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

Ribbon組成

接口
做用
默認值
IclientConfig
讀取配置
DefaultClientConfigImpl
IRule
負載均衡規則,選擇實例
ZoneAvoidanceRule
IPing
篩選掉ping不通的實例
DumyPing(該類什麼不幹,認爲每一個實例均可用,都能ping通)
ServerList
交給Ribbon的實例列表
Ribbon:ConfigurationBasedServerList
Spring Cloud Alibaba:NacosServerList
ServerListFilter
過濾掉不符合條件的實例
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就實現了負載均衡app

@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_32588349/article/details/52097943dom

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

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

方式一:配置屬性方式

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

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

總結:

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

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

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

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

方式二:

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

趙小胖我的博客

相關文章
相關標籤/搜索