文档章节

Spring Cloud 负载均衡-Ribbon

jurson86
 jurson86
发布于 2017/08/25 14:22
字数 914
阅读 189
收藏 2
点赞 0
评论 0

一、 什么是负载均衡 

负载均衡就是分发请求流量到不同的服务器。 
 
负载均衡一般分为两种: 
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
博文 246
码字总数 242323
作品 0
深圳
个人站长
Spring Cloud构建微服务架构—服务消费(Ribbon)

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

itcloud
06/28
0
0
Spring Cloud学习:02服务消费者(Ribbon&Feign)

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

寒武没有纪
2017/10/21
0
0
【Spring Cloud】分布式必学springcloud(四)——客户端负载均衡Ribbon

一、前言 前几篇博客,对springcloud的注册中心Eureka做了说明,并且提供者可以注册到注册中心上,客户端可以面向服务的调用Restful接口。有的时候我们需要对提供者做负载均衡,SpringCloud...

kisscatforever
04/20
0
0
揭秘最新版本Spring Cloud 负载均衡之迷-Ribbon(一)

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现,它可以通过客户端配置的ribbonServerList服务端列表去轮训访问达到负载均衡的作用。当Ribbon跟Eur...

魔都太阳神
07/20
0
0
Spring Cloud Netflix架构浅析

最近接触微服务这块的东西,对这方面有了一些了解,拿出来和大家分享一下。 微服务框架Spring Boot+Spring Cloud Spring Cloud是基于Spring Boot的一整套实现微服务的框架,可以说,Spring ...

海岸线的曙光
2017/12/20
0
0
手把手教学系列——疯狂Spring Cloud教学视频

大家好,我是《疯狂Spring Cloud微服务架构实战》一书的作者杨恩雄,该书的配套教学视频已经录制完成,目的是为了让更多的朋友能轻松地学习Spring Cloud。本书与配套视频,适合Spring Cloud的...

杨大仙的程序空间
2017/10/18
0
24
SpringCloud负载均衡

Ribbon 配合eureka可以不用配置文件,自动实现负载均衡。 consumer可以根据项目服务名称进行访问,如果多个服务名称一致,自动实现负载均衡。 Feign 一套基于Netflix Feign实现的声明式服务调...

JavionXiong
06/22
0
0
spring cloud 建一个服务消费者client-feign(最好用这种方式)

Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign默认集成了Ribbon,...

lsjlgo
05/28
0
0
spring cloud 建一个服务消费者client-ribbon

在它的pom.xml文件分别引入起步依赖spring-cloud-starter-eureka、spring-cloud-starter-ribbon、spring-boot-starter-web 在工程的配置文件指定服务的注册中心地址为http://localhost:8761...

lsjlgo
05/28
0
0
【Spring Cloud】分布式必学springcloud(六)——服务容错Hystrix

一、前言 在上篇博客中,小编向大家介绍了springcloud负载均衡的Ribbon。它可以帮助我们把服务器请求转换为负载均衡请求。但是当ribbon在调用的时候,如果没有调用成功。会引起雪崩效应。微服...

kisscatforever
04/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
今天
0
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部