跟我學Spring Cloud(Finchley版)-08-Ribbon深入

weixin_34321977發表於2019-01-09

上一節講了Ribbon的入門姿勢,本節深入探討Ribbon的高階特性。

內建負載均衡規則

負載均衡規則是Ribbon的核心,下面來看一下Ribbon內建的負載均衡規則。

  • AvailabilityFilteringRule:過濾掉一直連線失敗的被標記為circuit tripped的後端Server,並過濾掉那些高併發的後端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所在區域的效能和Server的可用性選擇Server;

如需自定義負載均衡規則,只需實現IRule 介面或繼承AbstractLoadBalancerRule、PredicateBasedRule即可 ,讀者可參考RandomRuleRoundRobinRuleZoneAvoidanceRule 等內建Rule編寫自己的負載均衡規則。

Ribbon配置自定義【細粒度配置】

Ribbon可實現精確到目標服務的細粒度配置。例如A服務呼叫服務B,A服務呼叫C,可以針對B服務一套配置,針對C服務另一套配置。

方式1、程式碼配置方式

在Spring Cloud中,Ribbon的預設配置如下(格式是BeanType beanName: ClassName):

  • IClientConfig ribbonClientConfig: DefaultClientConfigImpl
  • IRule ribbonRule: ZoneAvoidanceRule
  • IPing ribbonPing: NoOpPing
  • ServerList<Server> ribbonServerList: ConfigurationBasedServerList
  • ServerListFilter<Server> ribbonServerListFilter: ZonePreferenceServerListFilter
  • ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer
  • ServerListUpdater ribbonServerListUpdater: PollingServerListUpdater

程式碼示例

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

    /**
     * 使用RibbonClient,為特定的目標服務自定義配置。
     * 使用@RibbonClient的configuration屬性,指定Ribbon的配置類。
     * 可參考的示例:
     * http://spring.io/guides/gs/client-side-load-balancing/
     * @author 周立
     */
    @Configuration
    @RibbonClient(name = "microservice-provider-user", configuration = RibbonConfiguration.class)
    public class TestConfiguration {
    }
    

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

  • 建立Ribbon的配置類。

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

配套程式碼

GitHub:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-config-java

Gitee:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-config-java

方式2、屬性配置方式【推薦】

<clientName>.ribbon. 如下屬性

  • NFLoadBalancerClassName: should implement ILoadBalancer
  • NFLoadBalancerRuleClassName: should implement IRule
  • NFLoadBalancerPingClassName: should implement IPing
  • NIWSServerListClassName: should implement ServerList
  • NIWSServerListFilterClassName should implement ServerListFilter

程式碼示例

user:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

TIPS

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

配套程式碼

GitHub:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-config-properties

Gitee:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-config-properties

Ribbon配置自定義【全域性配置】

方式1、程式碼配置方式

@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class)
public class RibbonClientDefaultConfigurationTestsConfig {
}
@Configuration
class DefaultRibbonConfig {
  @Bean
  public IRule ribbonRule() {
    return new RandomRule();
  }
}

方法2、屬性配置方式【推薦】

和上文細粒度配置類似,只需將目標服務名稱字首去掉即可。

ribbon:
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

Ribbon Eager載入

預設情況下Ribbon是懶載入的——首次請求Ribbon相關類才會初始化,這會導致首次請求過慢的問題,你可以配置飢餓載入,讓Ribbon在應用啟動時就初始化。

ribbon:
  eager-load:
    enabled: true
    # 多個用,分隔
    clients: microservice-provider-user

本文首發

http://www.itmuch.com/spring-cloud/finchley-8/

乾貨分享

3865516-0123eb6c1acc0814.png
全是乾貨

相關文章