springCloud(8):Ribbon實現客戶端側負載均衡-自定義Ribbon配置

1、簡介
java

不少場景下,可能根據須要自定義的Ribbon的配置,例如修改Ribbon的負載均衡規則等。Spring cloud Camden容許使用Java代碼或屬性自定義Ribbon的配置。web

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

2.一、說明負載均衡

在Spring cloud中,Ribbon的默認配置以下,格式是:BeanType beanName:ClassNamedom

一、IClientConfig ribbonClientConfig:DefaultClientConfigImplide

二、IRule ribbonPing:ZoneAvoidanceRule微服務

三、IPing ribbonPing:NoOpPing性能

四、ServerList ribbonServerList:ConfigurationBasedServerList測試

五、ServerListFilter ribbonServerListFilter:ZonePreferenceServerListFilterspa

六、ILoadBalancer ribbonLoadBalancer:ZoneAwareLoadBalancer


分析一下以下代碼:(org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration)

@Bean
@ConditionalOnMissingBean
public IRule ribbonRule(IClientConfig config) {
    ZoneAvoidanceRule rule = new ZoneAvoidanceRule();
  rule.initWithNiwsConfig(config);
  return rule;
}

BeanType是IRule,beanName是ribbonRule,ClassName是ZoneAvoidanceRule,這是一種根據服務提供者所在Zone的性能以及服務提供者可用性綜合計算,選擇提供者節點的負載均衡規則。


在Spring Cloud中,Ribbon默認的配置類是RibbonClientConfiguration。也可以使用一個POJO自定義Ribbon的配置(自定義配置會覆蓋默認配置)。這種配置是細粒度的,不一樣的Ribbon客戶端能夠使用不一樣的配置。

2.二、代碼實現

第1步、建立Ribbon的配置類

package com.example.demo.config;

import com.example.demo.ExcludeFromComponentScan;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Ribbon配置類
 *
 * @Author: 我愛大金子
 * @Description: Ribbon配置類
 * @Date: Create in 15:36 2017/7/13
 */
@Configuration
@ExcludeFromComponentScan
public class RibbonConfiguration {
    @Bean
    public IRule ribbonRule() {
        // 負載均衡規則,改成隨機
        return new RandomRule();
    }
}

注意:

 一、Ribbon配置類不能包含在主應用程序上下文的@ComponentScan中,不然該類中的配置信息就被全部的@RibbonClient共享。

 二、若是隻想自定義某一個Ribbon客戶端的配置,必須防止@Configuration註解的類所在的包與@ComponentScan掃描的包重疊,或應顯示指定@ComponentScan不掃描@Configuration類所在的包。

第2步、修改啓動類

package com.example.demo;

import com.example.demo.config.RibbonConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.client.RestTemplate;


/**
 * 使用@RibbonClient,爲特定name的Ribbon Client自定義配置
 * 使用@RibbonClient的configuration屬性,指定Ribbon的配置類
 */
@EnableEurekaClient
@SpringBootApplication
@RibbonClient(name = "spring-ribbon-eureka-client2", configuration = RibbonConfiguration.class)
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class) })
public class SpringRibbonEurekaCustomizingApplication {
   @Bean
   @LoadBalanced
   public RestTemplate restTemplate(){
      return new RestTemplate();
   }

   public static void main(String[] args) {
      SpringApplication.run(SpringRibbonEurekaCustomizingApplication.class, args);
   }
}

說明:使用@RibbonClient註解的configuration屬性能夠自定義指定名稱Ribbon客戶端的配置。

第3步、自定義註解

package com.example.demo;

public @interface ExcludeFromComponentScan {

}

2.三、測試

啓動spring-ribbon-eureka-server、啓動兩個spring-ribbon-eureka-client二、啓動咱們如今編寫的

訪問:

 註冊中心 http://localhost:9090/

  wKiom1lodVqgodExAACHbAbcoVg147.jpg

 java實現的自定義Ribbon配置 http://localhost:8084/user/1 

   wKiom1lodgzBT1ZRAADidDyzqic330.jpg

3、使用屬性文件自定義Ribbon配置

3.一、說明

從Spirng Cloud Netflix1.2.0開始(Spring Cloud Camden SR4使用的版本是1.2.4),Ribbon支持使用屬性自定義Ribbon客戶端。

支持的屬性以下,配置的前綴規則是:<clientName>.ribbon。

 1_NFLoadBalancerClassName:配置ILoadBalancer的實現類

 2_NFLoadBalancerRuleClassName:配置IRule的實現類

 3_NFLoadBalancerPingClassName:配置IPing的實現類

 4_NIWSServerListClassName:配置ServerList的實現類

 5_NIWSServerListFilterClassName:配置ServerListFilter的實現類


3.二、配置實現

##################################使用配置文件自定義ribbon配置開始##################################
#負載均衡規則改成隨機
spring-ribbon-eureka-client2.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
##################################使用配置文件自定義ribbon配置結束##################################

3.三、測試

啓動spring-ribbon-eureka-server、啓動兩個spring-ribbon-eureka-client二、啓動咱們如今編寫的

訪問:

 註冊中心 http://localhost:9090/

  wKiom1lof-PgqCBaAABw_w0zzdk965.jpg

 配置文件實現的自定義Ribbon配置

  wKiom1logDfD3DgsAABxeBGRxsQ734.jpg

4、脫離Eureka使用Ribbon

在某些狀況下,可能會有一些遺留的微服務,它們可能並無註冊到Eureka Server上,甚至根本不是使用Spring Cloud開發的,此時想要使用Ribbon實現負載均衡,進是如今所說的脫離Eureka使用ribbon。

注意:此處代碼是基於上面代碼完成的。

一、去掉eureka依賴,加上ribbon依賴

二、去掉啓動類的上@EnableEurekaClient註解

三、修改配置

##################################ribbon配置開始##################################
spring-ribbon-eureka-client2:
  ribbon:
    listOfServers: localhost:8083,localhost:8080
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #負載均衡規則改成隨機
##################################ribbon配置結束##################################

四、效果

訪問:http://localhost:8086/user/1 

 wKiom1ltZCHCfu-hAADJe9AINwc100.png

相關文章
相關標籤/搜索