SpringCloud 之客户端负载均衡策略
一、负载均衡介绍
负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
1、服务端负载均衡:客户端请求到负载均衡服务器,负载均衡服务器根据自身的算法将该请求转给某台真正提供业务的服务器,该服务器将响应数据给负载均衡服务器,负载均衡服务器最后将数据返回给客服端。(nginx)
2、客服端负载均衡:基于客户端的负载均衡,简单的说就是在客户端程序里面,自己设定一个调度算法,在向服务器发起请求的时候,先执行调度算法计算出向哪台服务器发起请求,然后再发起请求给服务器。
二、负载均衡策略介绍
(1) AbstractLoadBalancerRule
AbstractLoadBalancerRule是一个抽象类,里边主要定义了一个ILoadBalancer,定义它的目的主要是辅助负责均衡策略选取合适的服务端实例。
(2) RandomRule
该负载均衡策略就是随机选择一个服务实例,看源码我们知道,在RandomRule的无参构造方法中初始化了一个Random对象,然后在它重写的choose方法又调用了choose(ILoadBalancer lb, Object key)
这个重载的choose方法,在这个重载的choose方法中,每次利用random对象生成一个不大于服务实例总数的随机数,并将该数作为下标所以获取一个服务实例。
(3) RoundRobinRule
RoundRobinRule这种负载均衡策略叫做线性负载均衡策略,也就是我们在上文所说的BaseLoadBalancer负载均衡器中默认采用的负载均衡策略。这个类的choose(ILoadBalancer lb, Object key)
函数整体逻辑是这样的:开启一个计数器count,在while循环中遍历服务清单,获取清单之前先通过incrementAndGetModulo方法获取一个下标,这个下标是一个不断自增长的数先加1然后和服务清单总数取模之后获取到的(所以这个下标从来不会越界),拿着下标再去服务清单列表中取服务,每次循环计数器都会加1,如果连续10次都没有取到服务,则会报一个警告No available alive servers after 10 tries from load balancer: XXXX
。
(4) RetryRule
看名字就知道这种负载均衡策略带有重试功能。首先RetryRule中又定义了一个subRule,它的实现类是RoundRobinRule,然后在RetryRule的choose(ILoadBalancer lb, Object key)
方法中,每次还是采用RoundRobinRule中的choose规则来选择一个服务实例,如果选到的实例正常就返回,如果选择的服务实例为null或者已经失效,则在失效时间deadline之前不断的进行重试(重试时获取服务的策略还是RoundRobinRule中定义的策略),如果超过了deadline还是没取到则会返回一个null。
(5) WeightedResponseTimeRule
WeightedResponseTimeRule是RoundRobinRule的一个子类,在WeightedResponseTimeRule中对RoundRobinRule的功能进行了扩展,WeightedResponseTimeRule中会根据每一个实例的运行情况来给计算出该实例的一个权重,然后在挑选实例的时候则根据权重进行挑选,这样能够实现更优的实例调用。WeightedResponseTimeRule中有一个名叫DynamicServerWeightTask的定时任务,默认情况下每隔30秒会计算一次各个服务实例的权重,权重的计算规则也很简单,如果一个服务的平均响应时间越短则权重越大,那么该服务实例被选中执行任务的概率也就越大。
(6) ClientConfigEnabledRoundRobinRule
ClientConfigEnabledRoundRobinRule选择策略的实现很简单,内部定义了RoundRobinRule,choose方法还是采用了RoundRobinRule的choose方法,所以它的选择策略和RoundRobinRule的选择策略一致,不赘述。
(7) BestAvailableRule
BestAvailableRule继承自ClientConfigEnabledRoundRobinRule,它在ClientConfigEnabledRoundRobinRule的基础上主要增加了根据loadBalancerStats中保存的服务实例的状态信息来过滤掉失效的服务实例的功能,然后顺便找出并发请求最小的服务实例来使用。然而loadBalancerStats有可能为null,如果loadBalancerStats为null,则BestAvailableRule将采用它的父类即ClientConfigEnabledRoundRobinRule的服务选取策略(线性轮询)。
(8) PredicateBasedRule
PredicateBasedRule是ClientConfigEnabledRoundRobinRule的一个子类,它先通过内部定义的一个过滤器过滤出一部分服务实例清单,然后再采用线性轮询的方式从过滤出来的结果中选取一个服务实例。
(9) ZoneAvoidanceRule
ZoneAvoidanceRule是PredicateBasedRule的一个实现类,只不过这里多一个过滤条件,ZoneAvoidanceRule中的过滤条件是以ZoneAvoidancePredicate为主过滤条件和以AvailabilityPredicate为次过滤条件组成的一个叫做CompositePredicate的组合过滤条件,过滤成功之后,继续采用线性轮询的方式从过滤结果中选择一个出来。使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。
三、使用Ribbon实现负载均衡
Ribbon 工作分为2步:
1.选择Eureka Server,优先选择在同一Zone且负载较少的Server.
2.根据用户指定的策略,在从Server取到的服务注册列表中选择一个地址。
策略包括:轮询,随机,响应时间加权。
关键代码如下:
1.主要是在RestTemplate上加入了@LoadBalanced,让restTemplate具备Ribbon负载均衡的能力。
启动类:
@SpringBootApplication
@EnableEurekaClient
public class ComsumerMovieRibbonApplication { @Bean @LoadBalanced//让restTemplate具备Ribbon负载均衡的能力。 public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ComsumerMovieRibbonApplication.class, args); }
}
2.修改Controller中的微服务地址,修改硬编码为Eureka上注册的服务的ServicId,即用户微服务的application.name;
@RestController
public class MovieController { @Autowired private RestTemplate restTemplate; @GetMapping("/movie/{id}") public User findById(@PathVariable Long id) { //http://localhost:7900/simple/ //VIP Virtual IP:虚拟IP,使用的是服务提供者的ServiceId,也就是application.name //HAProxy HeartBeat //microservice-provider-user:7900 return this.restTemplate.getForObject("http://microservice-provider-user/simple/"+id, User.class); } }
3.application.yml
server: port: 7902 spring: application: name: microservice-comsumer-movie-ribbon eureka: client: serviceUrl: defaultZone: http://user:pass123@localhost:8761/eureka instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
启动Eureka,电影微服务,2个用户微服务。
实现了客户端负载均衡。
SpringCloud 之客户端负载均衡策略相关推荐
- springcloud ribbon 配置负载均衡策略以及自定义策略
一.系统内置的策略有以下几种. 这个负载策略配置说白了就是让 Ribbon 这个客户端负载均衡器怎么进行访问服务提供者列表.是轮流访问?随机访问?权重?等. Ribbon 的负载均衡策略 策略类 ...
- 五、springcloud之客户端负载均衡Ribbon
一.简介 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式: 一种是ribbon+restTemplate, ...
- SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用
什么是SpringCloud 微服务架构 • "微服务"一词源于 Martin Fowler的名为 Microservices的博文,可以在他的官方博客上找到 http://mar ...
- SpringCloud Ribbon中的7种负载均衡策略!
作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而 ...
- tedu 四阶段springcloud学习day02学习总结(idea连接数据库/nacos远端调用及负载均衡策略/Feign方式远端调用)
目录 查看接口有哪些实现类 ctrl + h 一.cmd方式启动Nacos的命令 二.在IDEA中打开MySQL数据库 第一步: 打开View中数据库的工具栏 第二步:添加数据库为MySql 第三步: ...
- SpringCloud笔记(二)使用DiscoveryClient手动实现客户端负载均衡
1.什么是客户端负载均衡(Ribbon)? Ribbon是从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地,然后在本地实现轮训负载均衡策略.既在客户端实现负载均衡. 2.什么是服务端负 ...
- SpringCloud Ribbon(二)之自定义负载均衡策略IRule
一.Ribbon负载均衡策略 一个服务对应一个LoadBalancer,一个LoadBalancer只有一个Rule,LoadBalancer记录服务的注册地址,Rule提供从服务的注册地址中找出一个 ...
- SpringCloud组件:Ribbon的负载均衡策略及原理
来源:blog.csdn.net/wudiyong22/article/details/80829808 Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法 ...
- SpringCloud组件:Ribbon负载均衡策略及执行原理!
大家好,我是磊哥. 今天我们来看下微服务中非常重要的一个组件:Ribbon.它作为负载均衡器在分布式网络中扮演着非常重要的角色. 本篇主要内容如下: 在介绍 Ribbon 之前,不得不说下负载均衡这个 ...
- SpringCloud负载均衡策略
1.创建两个一样的工程 2.浏览器访问两个工程查看启动是否正常 3.eureka服务注册中心查看集群服务 4.Client调用集群服务 restTemplate前段负载均衡策略默认是采用轮询: 5.修 ...
最新文章
- [转]volley-retrofit-okhttp之我们该如何选择网路框架
- 数据结构:选择排序(Selection sort)
- python3.6执行pip3时 Unable to create process using ''
- 6套制造业大数据解决方案免费送,内含详细步骤手把手教会你
- 零基础学Python(第二十一章 OS文件目录)
- 网站服务器睡眠后还能访问吗,远程服务器可以睡眠吗
- android今日头条刷新,仿今日头条刷新vector动画
- MySQL并发复制系列二:多线程复制
- 每日一JAVA----------环境搭建Path,JAVA_HOME,classpath
- java如何实现游戏暂停和恢复_Android:游戏循环暂停/恢复问题
- python notebook_Python Notebook (Jupyter Notebook) 介绍
- 关于常用序号的几点说明(数字序号顺序)
- 美国的卫星导航系统服务器,中国的北斗卫星和美国的gps到底哪个更厉害?
- 【GIS】开源GIS简介
- 打印机显示正在未连接服务器,打印机状态未联机是怎么回事
- 图层蒙版和快速蒙版、路径
- Java游戏开发——flappy bird
- 苹果电脑双系统正确打开方式,虚拟机已经Out了
- Error during job, obtaining debugging information...
- Thinkphp整合微信支付功能
热门文章
- 价值连城 ImageNet图像分类大神 Andrej Karpathy的采访 给AI 深度学习从业者的建议
- 翻译:图解HTTPS工作原理、秘钥、握手、HTTPS,SSL,TLS的区别、证书
- Charles 导出所有request, response, cookie, 导出为HTTP Archive .har
- Docker MySQL 8 慢查询日志监控详解
- mysql自动跑sql发邮件_SQL server 表数据改变触发发送邮件的方法
- 334.递增的三元子序列
- pycharm设置工程运行环境
- php5中使用xslt扩展,.NET_解析在.net中使用XSLT转换xml文档的示例详解,XSL即可扩展的样式表文件。 可 - phpStudy...
- 两个线性空间的可逆线性映射
- 解决vscode中Linter pylint is not installed的问题