一、简介
很多场景下,可能根据需要自定义的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/
java实现的自定义Ribbon配置 http://localhost:8084/user/1
三、使用属性文件自定义Ribbon配置
3.1、说明
从Spirng Cloud Netflix1.2.0开始(Spring Cloud Camden SR4使用的版本是1.2.4),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/
配置文件实现的自定义Ribbon配置
四、脱离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