一、简介

很多场景下,可能根据需要自定义的Ribbon的配置,例如修改Ribbon的负载均衡规则等。Spring cloud Camden允许使用Java代码或属性自定义Ribbon的配置。

二、使用Java代码自定义Ribbon配置

2.1、说明

在Spring cloud中,Ribbon的默认配置如下,格式是:BeanType beanName:ClassName

1、IClientConfig ribbonClientConfig:DefaultClientConfigImpl

2、IRule ribbonPing:ZoneAvoidanceRule

3、IPing ribbonPing:NoOpPing

4、ServerList ribbonServerList:ConfigurationBasedServerList

5、ServerListFilter ribbonServerListFilter:ZonePreferenceServerListFilter

6、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.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();
    }
}

注意:

 1、Ribbon配置类不能包含在主应用程序上下文的@ComponentScan中,否则该类中的配置信息就被所有的@RibbonClient共享。

 2、如果只想自定义某一个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.3、测试

启动spring-ribbon-eureka-server、启动两个spring-ribbon-eureka-client2、启动我们现在编写的

访问:

 注册中心 http://localhost:9090/

  springCloud(8):Ribbon实现客户端侧负载均衡-自定义Ribbon配置_第1张图片

 java实现的自定义Ribbon配置 http://localhost:8084/user/1 

   springCloud(8):Ribbon实现客户端侧负载均衡-自定义Ribbon配置_第2张图片

三、使用属性文件自定义Ribbon配置

3.1、说明

从Spirng Cloud Netflix1.2.0开始(Spring Cloud Camden SR4使用的版本是1.2.4),Ribbon支持使用属性自定义Ribbon客户端。

支持的属性如下,配置的前缀规则是:.ribbon。

 1_NFLoadBalancerClassName:配置ILoadBalancer的实现类

 2_NFLoadBalancerRuleClassName:配置IRule的实现类

 3_NFLoadBalancerPingClassName:配置IPing的实现类

 4_NIWSServerListClassName:配置ServerList的实现类

 5_NIWSServerListFilterClassName:配置ServerListFilter的实现类


3.2、配置实现

##################################使用配置文件自定义ribbon配置开始##################################
#负载均衡规则改为随机
spring-ribbon-eureka-client2.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
##################################使用配置文件自定义ribbon配置结束##################################

3.3、测试

启动spring-ribbon-eureka-server、启动两个spring-ribbon-eureka-client2、启动我们现在编写的

访问:

 注册中心 http://localhost:9090/

  wKiom1lof-PgqCBaAABw_w0zzdk965.jpg

 配置文件实现的自定义Ribbon配置

  springCloud(8):Ribbon实现客户端侧负载均衡-自定义Ribbon配置_第3张图片

四、脱离Eureka使用Ribbon

在某些情况下,可能会有一些遗留的微服务,它们可能并没有注册到Eureka Server上,甚至根本不是使用Spring Cloud开发的,此时想要使用Ribbon实现负载均衡,进是现在所说的脱离Eureka使用ribbon。

注意:此处代码是基于上面代码完成的。

1、去掉eureka依赖,加上ribbon依赖

2、去掉启动类的上@EnableEurekaClient注解

3、修改配置

##################################ribbon配置开始##################################
spring-ribbon-eureka-client2:
  ribbon:
    listOfServers: localhost:8083,localhost:8080
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则改为随机
##################################ribbon配置结束##################################

4、效果

访问:http://localhost:8086/user/1 

 springCloud(8):Ribbon实现客户端侧负载均衡-自定义Ribbon配置_第4张图片