SpringCloud系列八:自定義Ribbon配置


1. 回顧

  上文使用Ribbon實現了客戶端側的負載均衡。但是很多場景下,我們可能需要自定義Ribbon的配置,比如修改Ribbon的負載均衡規則。

  Spring Cloud允許使用Java代碼或屬性自定義Ribbon的配置,這兩種方式是等價的。

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

  • IClientConfig ribbonClientConfig:DefaultClientConfigImpl
  • IRule ribbonRule:ZoneAvoidanceRule
  • IPing ribbonPing:NoOpPing
  • ServerList ribbonServerList:ConfigurationBasedServerList
  • ServerListFilter ribbonServerListFilter:ZonePreferenceServerListFilter
  • ILoadBalance ribbonLoadBalancer:ZoneAwareLoadBalancer
@Bean
@ConditionalOnMissingBean
public IRule ribbonRule(IClientConfig config) {
if (this.propertiesFactory.isSet(IRule.class, this.name)) {
return (IRule)this.propertiesFactory.get(IRule.class, config, this.name);
} else {
ZoneAvoidanceRule rule = new ZoneAvoidanceRule();
rule.initWithNiwsConfig(config);
return rule;
}
}
// 來自 org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration

   BeanType是IRule,beanName是ribbonRule,ClassName是ZoneAvoidanceRule,這是一種根據服務提供者所在Zone的性能以及

  服務提供者可用性綜合計算,選擇提供者節點的負載均衡規則。

  在Spring Cloud中, Ribbon默認的配置類是RibbonClientConfiguration。也可使用一個POJO自定義Ribbon的配置(自定義配置會覆蓋默認配置)。

  這種配置是細粒度的,不同的Ribbon客戶端可以使用不同的配置。

2. 使用Java代碼自定義Ribbon配置

  > 復制項目 microservice-consumer-movie-ribbon,將ArtifactId修改為 microservice-consumer-movie-ribbon-customizing

  > 創建一個注解類

package com.itmuch.cloud.microserviceconsumermovieribboncustomizing.annotation; public @interface ExcludeComponent { }

  > 修改啟動類,使@CompantScan不掃描被自定義注解注解的類

package com.itmuch.cloud.microserviceconsumermovieribboncustomizing; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = {com.itmuch.cloud.microserviceconsumermovieribboncustomizing.annotation.ExcludeComponent.class})) public class MicroserviceConsumerMovieRibbonCustomizingApplication { public static void main(String[] args) { SpringApplication.run(MicroserviceConsumerMovieRibbonCustomizingApplication.class, args); } @Bean @LoadBalanced // 實現負載均衡
    public RestTemplate restTemplate() { return new RestTemplate(); } }

  > 創建Ribbon的配置類

package com.itmuch.cloud.microserviceconsumermovieribboncustomizing.config; import com.itmuch.cloud.microserviceconsumermovieribboncustomizing.annotation.ExcludeComponent; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RandomRule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 該類為Ribbon的配置類 * 注意:該類不應該在主應用程序上下文的@ComponentScan中 */ @Configuration @ExcludeComponent public class RibbonConfiguration { @Bean public IRule ribbonRule() { // 負載均衡規則改為隨機
        return new RandomRule(); } }

  > 創建一個空類,並在其上添加@Configuration注解和@RibbonClient注解

package com.itmuch.cloud.microserviceconsumermovieribboncustomizing.config; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.context.annotation.Configuration; /** * 使用RibbonClient,為特定name的Ribbon Client自定義配置 * 使用@RibbonClient的configuration屬性,指定Ribbon的配置類 */ @Configuration @RibbonClient(name = "microservice-provider-user", configuration = RibbonConfiguration.class) public class TestConfiguration { }

  > 啟動microservice-discovery-eureka

  > 啟動兩個以上的 microservice-provider-user 實例

  > 多次訪問 http://localhost:8010/log-instance,可獲取類似如下的日志,表明負載均衡規則已改為隨機

3. 使用屬性自定義Ribbon配置

  從Spring Cloud Netflix1.2.0開始,Ribbon支持使用屬性自定義Ribbon客戶端。這種方式比使用Java代碼配置的方式更加方便。

  支持的屬性如下,配置的前綴是<clientName>.ribbon.

  • NFLoadBalancerClassName:配置ILoadBalancer的實現類
  • NFLoadBalancerRuleClassName:配置IRule的實現類
  • NFLoadBalancerPingClassName:配置IPing的實現類
  • NIWSServerListClassName:配置ServerList的實現類
  • NIWSServerListFilterClassName:配置ServerListFilter的實現類

  > 復制項目 microservice-consumer-movie-ribbon,將ArtifactId修改為 microservice-consumer-movie-ribbon-customizing-properties

  > 在application.yml中添加一下內容

microservice-provider-user:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

  > 測試過程同上

4. 總結

  對於使用Java代碼自定義Ribbon配置的過程中,可指定該配置只對某個Ribbon客戶端生效,也可對所有的Ribbon客戶端生效

  若只對某個Ribbon客戶端生效,則RibbonConfiguration類不能包含在主應用程序上下文的@CompantScan中,所以本文添加了自定義注解,

    使用自定義注解和excludeFilters使RibbonConfiguration類不被@CompantScan掃描到

  若想對所有的Ribbon客戶端生效,只須將RibbonConfiguration類包含在主應用程序上下文的@CompantScan中即可。

  下文將繼續講解脫離Eureka使用Ribbon,敬請期待~~~

5. 參考

  周立 --- 《Spring Cloud與Docker微服務架構與實戰》


免責聲明!

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



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