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

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介:

一、简介

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

1
2
3
4
5
6
7
@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的配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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步、修改启动类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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步、自定义注解

1
2
3
4
5
package  com.example.demo;
 
public  @interface  ExcludeFromComponentScan {
 
}

2.3、测试

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

访问:

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

  wKiom1lodVqgodExAACHbAbcoVg147.jpg

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

   wKiom1lodgzBT1ZRAADidDyzqic330.jpg

三、使用属性文件自定义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、配置实现

1
2
3
4
##################################使用配置文件自定义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配置

  wKiom1logDfD3DgsAABxeBGRxsQ734.jpg

四、脱离Eureka使用Ribbon

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

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

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

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

3、修改配置

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

4、效果

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

 wKiom1ltZCHCfu-hAADJe9AINwc100.png

本文转自我爱大金子博客51CTO博客,原文链接http://blog.51cto.com/1754966750/1947281如需转载请自行联系原作者


我爱大金子

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
1月前
|
弹性计算 负载均衡 网络协议
配置SLB监听器
配置SLB监听器
118 63
|
1月前
|
域名解析 弹性计算 监控
slb测试基本配置检查
slb测试基本配置检查
100 60
|
1月前
|
弹性计算 负载均衡 监控
slb配置健康检查
slb配置健康检查
36 5
|
1月前
|
负载均衡 前端开发 应用服务中间件
负载均衡指南:Nginx与HAProxy的配置与优化
负载均衡指南:Nginx与HAProxy的配置与优化
84 3
|
8月前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
166 0
|
8月前
|
负载均衡 应用服务中间件 API
Nginx配置文件详解Nginx负载均衡Nginx静态配置Nginx反向代理
Nginx配置文件详解Nginx负载均衡Nginx静态配置Nginx反向代理
199 4
|
7月前
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
142 2
|
6月前
|
负载均衡 算法 应用服务中间件
nginx自定义负载均衡及根据cpu运行自定义负载均衡
nginx自定义负载均衡及根据cpu运行自定义负载均衡
122 1
|
6月前
|
运维 负载均衡 算法
SLB与NGINX的异同是什么
SLB与NGINX的异同是什么
596 2
|
8月前
|
负载均衡 应用服务中间件 nginx
解决nginx配置负载均衡时invalid host in upstream报错
在Windows环境下,配置Nginx 1.11.5进行负载均衡时遇到问题,服务无法启动。错误日志显示“invalid host in upstream”。检查发现上游服务器列表中,192.168.29.128的主机地址无效。负载均衡配置中,两个服务器地址前误加了&quot;http://&quot;。修正方法是删除上游服务器列表和proxy_pass中的&quot;http://&quot;。问题解决后,Nginx服务应能正常启动。
600 4
解决nginx配置负载均衡时invalid host in upstream报错