您的位置:首页 > 编程语言 > Java开发

springCloud(8):Ribbon实现客户端侧负载均衡-自定义Ribbon配置

2017-07-13 17:59 1081 查看
一、简介

很多场景下,可能根据需要自定义的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客户端。

支持的属性如下,配置的前缀规则是:<clientName>.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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐