文档章节

Spring Cloud 负载均衡-Ribbon

jurson86
 jurson86
发布于 2017/08/25 14:22
字数 914
阅读 241
收藏 2

一、 什么是负载均衡 

负载均衡就是分发请求流量到不同的服务器。 
 
负载均衡一般分为两种: 
1、 服务器端负载均衡(nginx) 

 

2、 客户端负载均衡(Ribbon) 

 

 通过Ribbon 进行负载均衡调用 

1、 在 RestTemplate 中添加注解 @LoadBalanced 
2、 修改调用的 URL=http://{spring-cloud-provider}/api/user/{id} 
注意:控制台的应用名字为大写,我们统一为小写,更不能大小写都存在。 

使用RestTemplate进行调用,所以要先定义这个Bean 

@LoadBalanced 
@Bean 
  protected RestTemplate restTemplate() { 
    return new RestTemplate(); 
  } 

 

1、 Ribbon 通过@LoadBalanced 进行负载均衡。 
2、 默认的负载策略是轮询算法。 

 

Ribbon 的负载均衡策略 

一、  内置负载均衡策略的介绍 

IRule的实现类 

 
1、  BestAvailableRule:选择一个最小的并发请求的 server,逐个考察 Server,如果Server 被
tripped 了,则忽略。 
2、  AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为 circuit tripped 的后端
server,并过滤掉那些高并发的的后端 server。 
3、  ZoneAvoidanceRule:复合判断 server 所在区域的性能和 server 的可用性选择 server。(使用
ZoneAvoidancePredicate 和AvailabilityPredicate 来判断是否选择某个 server,前一个判断判定
一个 zone 的运行性能是否可用,剔除不可用的 zone 的所有 server,AvailabilityPredicate 用于过
滤掉连接数过多的 Server。) 
4、  RandomRule:随机策略,在index 上随机,选择 index 对应位置的 server。 
5、  RetryRule :对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择 server 不成功,则
一直尝试使用 subRule 的方式选择一个可用的 server。 
6、  RoundRobinRule:轮询策略,轮询 index,选择 index 对应位置的 server(默认策略) 
7、  WeightedResponseTimeRule:权重策略(基于轮询策略,根据响应时间分配一个 weight(权重),响
应时间越长,weight 越小,被选中的可能性越低) 
8、  ResponseTimeWeightedRule:作用同 WeightedResponseTimeRule,二者作用是一样的,
ResponseTimeWeightedRule 后来改名为 WeightedResponseTimeRule 

 

 
二、  负载均衡的自定义 

1、 通过代码实现 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import com.netflix.loadbalancer.IRule; 
import com.netflix.loadbalancer.RandomRule; 
/** 
 * 随机算法 
 */ 
//@Configuration  //加上@Configuration 注解会导致所有的策略都被覆盖。
public class RandomRuleConfig { 
  @Bean   
  public IRule randomRule() { 
    return new RandomRule(); 
  } 
} 
 
import org.springframework.context.annotation.Bean; 
import com.netflix.loadbalancer.IRule; 
import com.netflix.loadbalancer.RoundRobinRule; 


/** 
 * 轮询算法 
 */ 
// @Configuration //加上@Configuration 注解会导致所有的策略都被覆盖。
public class RoundRobinRuleConfig { 
  @Bean 
  public IRule roundRobinRule() { 
    return new RoundRobinRule(); 
  } 
} 

 

配置类: 随机算法 

 
import org.springframework.cloud.netflix.ribbon.RibbonClient; 
import org.springframework.context.annotation.Configuration; 
 
@Configuration 
@RibbonClient(name = "spring-cloud-provider", configuration = RandomRuleConfig.class) 
public class ProviderConfiguration { 
 
} 

说明:只需要简单的 2 个配置,就可以指定轮询的算法。 
注意:在 RandomRuleConfig 的类里面,加上@Configuration 注解会导致所有的策略都被覆盖。 
原因:如果 RandomRuleConfig 被 SpringContext 扫描,否则会被@RibbonClients 共用,会覆盖。 

2、 通过配置文件实现 

配置文件添加: 
说明:格式为:应用名.ribbon.NFLoadBalancerRuleClassName=xxx 

#设置策略 
#随机算法
spring-cloud-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule 
#轮训算法
spring-cloud-provider2.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule

 

三、Ribbon负载均衡策略进行扩展 

 

当内置的负载均衡策略不满足业务需求的时候,我们就需要自定义 Ribbon 的负载策略。 

 
一、  继承 AbstractLoadBalancerRule 类

import java.util.List; 
 
import com.netflix.client.config.IClientConfig; 
import com.netflix.loadbalancer.AbstractLoadBalancerRule; 
import com.netflix.loadbalancer.ILoadBalancer; 
import com.netflix.loadbalancer.Server; 
 
/** 
 * 自定义 Ribbon 的负载均衡策略 
 *  
 */ 
public class GusCustomRule extends AbstractLoadBalancerRule { 
   private Server choose(ILoadBalancer lb, Object key) { 
    if (lb == null) { 
      return null; 
    } 
    Server server = null; 
    while (server == null) { 
      if (Thread.interrupted()) { 
        return null; 
      } 
 
      List<Server> upList = lb.getReachableServers(); // 可用的服务实例 
 
      // 只获取端口为:7779 的服务实例 
      for (Server s : upList) { 
        if (s.getPort() == 7779) { 
          server = s; 
        } 
      } 
      if (server == null) { 
        Thread.yield(); 
        continue; 
      } 
 
      System.out.println("实例IP:" + server.getHost() + " 端口:" + server.getPort()); 
 
      if (server.isAlive()) { 
        return (server); 
      } 
      server = null; 
      Thread.yield(); 
    } 
 
    return server; 
  } 
 
  @Override 
  public Server choose(Object key) { 
    return choose(getLoadBalancer(), key); 
 
  } 
  @Override 
  public void initWithNiwsConfig(IClientConfig clientConfig) { 
    // TODO Auto-generated method stub 
  } 
 
} 
 

 

二、  配置策略 

# 通过配置文件 
spring-cloud-provider.ribbon.NFLoadBalancerRuleClassName=com.hlian.education.configuration.GusCustomRule 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
jurson86
粉丝 2
博文 285
码字总数 283827
作品 0
深圳
个人站长
Spring Cloud构建微服务架构—服务消费(Ribbon)

Spring Cloud Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置...

itcloud
06/28
0
0
Spring Cloud Ribbon

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问...

kuchawyz
09/06
0
0
SpringCloud的负载均衡的初步

SpringCloud Ribbon是基于Netfix Ribbon实现的一套客户端 负载均衡的工具。 主要功能:提供客户端的软件负载均衡算法,将Netflix的中间服务连在一起。Ribbon客户端组件提供一系列完善的配置如...

濡沫
08/13
0
0
Spring Cloud学习:02服务消费者(Ribbon&Feign)

在微服务架构中,业务会拆分成一个独立的服务,服务与服务之间基于http restful进行通信。Spring Cloud有两种服务调用方式,一种是Ribbon+restTemplate,另一种是Feign。 1 Ribbon+restTempl...

寒武没有纪
2017/10/21
0
0
Spring Cloud:服务消费(Ribbon)【Dalston版】

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问...

zhaochaochao
09/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用户体验要素——以用户为设计中心

一、用户体验是什么 产品会与外界发生联系,人们如何去使用产品,人们使用产品无非解决两种问题,一,提高效率;二娱乐。而用户体验兼顾着功能和界面两个方面,为的是“提高人们的工作效率”...

铸剑为犁413
53分钟前
0
0
学习设计模式——代理模式

1. 认识代理模式 1. 定义:为其他对象提供一种代理以控制对这个对象的访问。 2. 组织结构: Proxy:代理对象,要实现与目标代理对象的相同的接口,这样就可以使用代理来代替具体的目标对象,...

江左煤郎
今天
1
0
java JDK动态代理

本篇随笔是对java动态代理中的JDK代理方式的具体实现。 首先需要定义一个接口,为其定义了两个方法:   public interface UserService { public void add(); public void delete(); } 然后需...

编程SHA
今天
2
0
轻松理解Dubbo分布式服务框架

Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的...

别打我会飞
今天
3
0
TypeScript基础入门之JSX(一)

转发 TypeScript基础入门之JSX(一) 介绍 JSX是一种可嵌入的类似XML的语法。 它旨在转换为有效的JavaScript,尽管该转换的语义是特定于实现的。 JSX在React框架中越来越受欢迎,但此后也看到了...

durban
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部