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二、启动咱们如今编写的
访问:
java实现的自定义Ribbon配置 http://localhost:8084/user/1
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二、启动咱们如今编写的
访问:
配置文件实现的自定义Ribbon配置
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配置结束##################################
四、效果