SpringCloud-Ribbon负载均衡
1.Ribbon
参考:尚硅谷
1.1Ribbon的负载均衡策略
1.轮询RoundRobinRule:按照服务列表轮流选择(默认)
2.随机RandomRule:按照服务列表随机选择
3.RetryRule:先按照RoundRobinRule获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务。
4.WeightedResponseTimeRule 对RoundRobinRule的扩展,响应速度越快实例选择权重越大,越容易被选择。
5.BestAvailableRule:会过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
6.AvailabilityFilteringRule:先过滤掉故障实例,在选择并发量较小的实例。
7.ZooAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器。
1.2Ribbon负载均衡替换
这个配置类不能放在@ComponentScan所扫描的当前包以及子包下否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,达不到特殊化定制的目的了。
主启动类上面的@SpringBootApplication注解上面有@ComponentScan注解,所以这个启动类所在的包及其子包都是在@CompentScan这个注解的扫描范围内。
所以我们要另外在这个包之外再建一个包。
然后在这个Myrule配置类里写上新的负载均衡的规则。
@Configuration
public class Myrule {@Beanpublic IRule myRule(){return new RandomRule();//将默认轮询负载均衡策略设置为随机}
}
然后我们还要告诉主启动类你的负载均衡策略用的到底是哪一个在启动类上加上注解@RibbonClient
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = Myrule.class)
public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class,args);}
}
name我现在这个服务消费者要访问CLOUD-PAYMENT-SERVICE这个微服务,configuration是新加了一个配置类,调整负载均衡的策略。
1.3Ribbon负载均衡轮询算法原理
负载均衡算法:rest接口第几次请求数 % 服务器集群数量 = 实际调用服务器位置下标,每次服务重启后rest接口从1开始。List instances = discoveryClient.getInstances(微服务服务名);
例:List[0] instances = 127.0.0.1:8002,List[1] instances = 127.0.0.1:8001,
8001和8002两台机器构成集群,他们共计两台机器,集群总数为2
按照轮询算法原理:当请求总数为1时:1%2=1对应下标位置为1,则获得服务地址为127.0.0.1:8001
当请求总数为2时:2%2 = 0对应下标位置为0,则获得服务地址为127.0.0.1:8002,
当请求总数为3时:3%2 = 0对应下标位置为1,则获得服务地址为127.0.0.1:8001,
以此类推…
如果这时候服务器重启了那就从1开始算。
1.4RoundRobinRule源码分析
一切规则都是IRule这个接口,AbstractLoadBalancerRule是它的抽象类一切具体的措施都继承这个抽象类。
package com.netflix.loadbalancer;public interface IRule {Server choose(Object var1);//选择哪一台服务器提供服务void setLoadBalancer(ILoadBalancer var1);ILoadBalancer getLoadBalancer();
}
IRule这个接口中的choose是具体选择哪一台机器提供服务我们下面具体分析的RoundRobinRule的思想也集中在这个函数里。下面我们来看一下RoundRobinRule中的相关代码(只与choose有关的)
public class RoundRobinRule extends AbstractLoadBalancerRule{private AtomicInteger nextServerCyclicCounter;//代表第几次访问public RoundRobinRule() {this.nextServerCyclicCounter = new AtomicInteger(0);}public RoundRobinRule(ILoadBalancer lb) {this();this.setLoadBalancer(lb);}//设置负载均衡策略public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {//如果负载均衡策略为空则它没有选择任何策略返回空log.warn("no load balancer");return null;} else {Server server = null;int count = 0;//设置轮询次数while(true) {if (server == null && count++ < 10) {//如果轮询次数超过10List<Server> reachableServers = lb.getReachableServers();//拿到所有活着的服务器List<Server> allServers = lb.getAllServers();//拿到服务器集群上的所有服务器int upCount = reachableServers.size();//拿到活着服务器的数量int serverCount = allServers.size();//拿到服务器集群上的所有服务器数量if (upCount != 0 && serverCount != 0) {int nextServerIndex = this.incrementAndGetModulo(serverCount);//计算下一个服务器的节点坐标server = (Server)allServers.get(nextServerIndex);//拿到节点服务器的下标if (server == null) {Thread.yield();} else {if (server.isAlive() && server.isReadyToServe()) {return server;}server = null;}continue;}log.warn("No up servers available from load balancer: " + lb);return null;}if (count >= 10) {log.warn("No available alive servers after 10 tries from load balancer: " + lb);}return server;}}}private int incrementAndGetModulo(int modulo) {int current;int next;do {current = this.nextServerCyclicCounter.get();//获得当前已有的请求总数next = (current + 1) % modulo;//加1取模得到下一个机器的下标} while(!this.nextServerCyclicCounter.compareAndSet(current, next));比较并交换return next;}
}
SpringCloud-Ribbon负载均衡相关推荐
- 四、SpringCloud——Ribbon负载均衡Ribbon自定义
1 Ribbon简介 1)是什么 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项目,主要功 ...
- SpringCloud Ribbon负载均衡介绍及使用
一.什么是Ribbon Ribbon为Netflix发布的一款客户端负载均衡器.在SpringCloud中Eureka一般配合Ribbon使用,Ribbon利用从Rureka中获取到服务提供者列表信息 ...
- 【SpringCloud】Ribbon:负载均衡
什么是Ribbon? 并且Eureka中已经集成了Ribbon,所以我们无需引入新的依赖 如果要引入也是可以以的,依赖如下 <dependency><groupId>org.s ...
- JavaEE进阶知识学习-----SpringCloud(六)Ribbon负载均衡
Ribbon负载均衡 Ribbon概述 Spring Cloude Ribbon是基于Netfilx Ribbon实现的一套客户端 负载均衡的工具,简单说,Ribbon是Netfilix发布的开源项目 ...
- SpringCloud源码:Ribbon负载均衡分析
本文主要分析 SpringCloud 中 Ribbon 负载均衡流程和原理. SpringCloud版本为:Edgware.RELEASE. 一.时序图 和以前一样,先把图贴出来,直观一点: 二.源码 ...
- SpringCloud:Ribbon负载均衡(基本使用、 负载均衡、自定义配置、禁用 Eureka 实现 Ribbon 调用)
现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现在的问题,所有的微服务汇集到了 Eureka 之 ...
- SpringCloud的Ribbon负载均衡
Spring Cloud Ribbon相关学习: 简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具. 简单的说,Ribbon是Netflix ...
- SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)...
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册 ...
- SpringCloud[04]Ribbon负载均衡服务调用
文章目录 Ribbon负载均衡服务调用 1. 概述 1. Ribbon是什么 2. Ribbon能做什么 2. Ribbon负载均衡演示 1. 架构说明 2. Ribbon的POM依赖 3. Rest ...
- SpringCloud LoadBalancerClient 负载均衡原理
LoadBalancerClient 是 SpringCloud 提供的一种负载均衡客户端,Ribbon 负载均衡组件内部也是集成了 LoadBalancerClient 来实现负载均衡.那么 Loa ...
最新文章
- IDEA设置单个文件、单个包、单个项目的编码格式
- 现实迷途 第七章 特殊客户
- java datetime和date_Java 8时间接口localDateTime和Date的对比
- 织梦调用css的标签,织梦dede常用的调用标签(个人总结)
- 青少年蓝桥杯_2020_steam考试_中级组_第四题
- iis php win安装kangle_Win2008 R2 IIS7.5+PHP5(FastCGI)+MySQL5环境搭建教程
- 为游戏开发者总结的20个 Unity 建议和技巧
- FZU 1914 Funny Positive Sequence
- 划重点:微信小程序1月9日正式上线
- C#开发终端式短信的原理和方法 .
- 4种基于像素分割的文本检测算法
- 遍历树,找出所有叶子路径
- Tableau最新版安装下载
- 解决Maven:Cannot resolve com.oracle.ojdbc:ojdbc6:11.2.0.1.0报红找不到问题,解决方案亲测有效详细图文教程 问题描述(ojdbc6)
- SQL日志文件损坏或丢失造成数据库置疑的解决办法
- PHP后台管理-基于Thinkphp5.0开发
- 《网络协议从入门到底层原理》学习笔记
- 基于KEIL RTX CMSIS-RTOS在STM32单片机上的一些使用心得
- 2022中国汽车测试及质量监控博览会邀请函
- 平板有必要买触控笔吗?好用又便宜的触控笔推荐