客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
Netflix:['netfliːks]
ribbon:英[ˈrɪbən]美[ˈrɪbən]
n. 带; 绶带; (打印机的) 色带; 带状物;
v. 把…撕成条带; 用缎带装饰; 形成带状;
LB方案分类
目前主流的LB方案可分成两类:
- 一种是集中式LB, 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;
- 另一种是进程内LB,将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon就属于后者,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。
软负载均衡:
软负载均衡的实现方式有两种,分别是服务端的负载均衡和客户端的负载均衡
服务端负载均衡:当浏览器向后台发出请求的时候,会首先向反向代理服务器发送请求,反向代理服务器会根据客户端部署的ip:port映射表以及负载均衡策略,来决定向哪台服务器发送请求,一般会使用到nginx反向代理技术。
客户端负载均衡:当浏览器向后台发出请求的时候,客户端会向服务注册器(例如:Eureka Server),拉取注册到服务器的可用服务信息,然后根据负载均衡策略,直接命中哪台服务器发送请求。这整个过程都是在客户端完成的,并不需要反向代理服务器的参与。
Ribbon介绍
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。
Ribbon的主要组件与工作流程
Ribbon的核心组件(均为接口类型)有以下几个:
ServerList
用于获取地址列表。它既可以是静态的(提供一组固定的地址),也可以是动态的(从注册中心中定期查询地址列表)。ServerListFilter
仅当使用动态ServerList时使用,用于在原始的服务列表中使用一定策略过虑掉一部分地址。IRule
选择一个最终的服务地址作为LB结果。选择策略有轮询、根据响应时间加权、断路器(当Hystrix可用时)等。
Ribbon在工作时首选会通过ServerList来获取所有可用的服务列表,然后通过ServerListFilter过虑掉一部分地址,最后在剩下的地址中通过IRule选择出一台服务器作为最终结果。
与Eureka结合使用
当与Eureka组合使用Ribbon时,ServerList
接口会使用DiscoveryEnabledNIWSServerList
实现,该实现会通过 EurekaClient 向Eureka服务器获取可用的服务列表。ServerListFilter
默认实现为ZonePreferenceServerListFilter
,其作用是过虑掉不同zone下的服务(即优先选择同一个zone下的地址)。IRule
使用ZoneAvoidanceRule
实现,它是一种复合策略,同时使用ZoneAvoidancePredicate
和AvailabilityPredicate
来判断是否选择某个server,前者以一个区域为单位判断可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的server;后者用于过滤掉连接数过多和断路器处于打开状态的server。该复合策略经过上述两次过虑后最终选择出一个地址作为LB结果。
Ribbon自带负载均衡策略比较
策略名 | 策略声明 | 策略描述 | 实现说明 |
BestAvailableRule | public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule | 选择一个最小的并发请求的server | 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server |
AvailabilityFilteringRule | public class AvailabilityFilteringRule extends PredicateBasedRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) | 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态 |
WeightedResponseTimeRule | public class WeightedResponseTimeRule extends RoundRobinRule | 根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。 | 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。 |
RetryRule | public class RetryRule extends AbstractLoadBalancerRule | 对选定的负载均衡策略机上重试机制。 | 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server |
RoundRobinRule | public class RoundRobinRule extends AbstractLoadBalancerRule | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 | 轮询index,选择index对应位置的server |
RandomRule | public class RandomRule extends AbstractLoadBalancerRule | 随机选择一个server | 在index上随机,选择index对应位置的server |
ZoneAvoidanceRule | public class ZoneAvoidanceRule extends PredicateBasedRule | 复合判断server所在区域的性能和server的可用性选择server | 使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。 |
Ribbon架构图
这里以随机访问策略来举个栗子:
1、ribbon配置文件添加:随机访问策略
service-B.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
其中service-B是我注册到Eureka的serviceID,一共起了3个示例。
2、main类注册:
@Bean@LoadBalancedRestTemplate restTemplate() {return new RestTemplate();}@Beanpublic IRule ribbonRule() {return new RandomRule();//这里配置策略,和配置文件对应}
一定记得加第二个注册,很多文章没有。里面配具体的策略。
3、Controller:
@RestController public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@Autowired private LoadBalancerClient loadBalancerClient; @RequestMapping(value = "/add", method = RequestMethod.GET)public String add(@RequestParam Integer a,@RequestParam Integer b) {this.loadBalancerClient.choose("service-B");//随机访问策略return restTemplate.getForEntity("http://service-B/add?a="+a+"&b="+b, String.class).getBody();}}
关于负载均衡相关的四个配置项
这些配置项的前缀是【客户端名称】.ribbon
The supported properties are listed below and should be prefixed by <clientName>.ribbon.
:
NFLoadBalancerClassName
: should implementILoadBalancer
NFLoadBalancerRuleClassName
: should implementIRule
NFLoadBalancerPingClassName
: should implementIPing
NIWSServerListClassName
: should implementServerList
NIWSServerListFilterClassName
should implementServerListFilter
其中比较重要的是NFLoadBalancerRuleClassName
,我们可以通过这个配置项定制需要的负载均衡规则,可以是ribbon提供的原生的几种规则类,也可以是自己实现的规则类,这些类都实现了IRule接口。
NFLoadBalancerPingClassName
用于配置查看服务器是否存活。
NFLoadBalancerRuleClassName
指定负载均衡器的实现类。当然,可以设置自己实现的负载均衡器。
NIWSServerListClassName
是服务器列表的处理类,用来维护服务器列表的。Ribbon已经实现了动态服务器列表。
NIWSServerListFilterClassName
是服务器的拦截类。
负载均衡的两种配置方法:
一种直接调用ConfigurationManager获取配置实例,然后设置配置属性;一种是在application.yml中配置。
客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍相关推荐
- 深入浅出Spring Cloud Netflix - Ribbon
文章目录 一.负载均衡 1.Load Balance是什么 2.负载均衡的分类 二.Ribbon详解 1.什么是Ribbon 2.Ribbon目前进入维护模式 3.Ribbon的工作流程 4.Ribb ...
- SpringCloud学习笔记3:Spring Cloud Netflix 组件(五大神兽)
一.Spring Cloud Netflix有哪些组件? eureka (提供服务注册与发现功能) ribbon(提供负载均衡功能) Feign(整合了ribbon和Hystrix,具有负载均衡和熔断 ...
- 微服务进阶(四):Spring Cloud netflix概览及架构设计
文章目录 一.Spring Cloud 简介 二.微服务架构 三.Spring Cloud Netflix 组件以及部署 四.Spring Cloud Netflix 组件开发 4.1 注册和监控中心 ...
- SpringCloud学习笔记(6)----Spring Cloud Netflix之负载均衡-Ribbon的使用
1. 什么是负载均衡? 负载均衡,就是分发请求流量到不同的服务器. 负载均衡一般分为两种 1. 服务器端负载均衡(nginx) 2. 客户端负载均衡(Ribbon) 2. 服务提供者(spring-c ...
- 最新版Spring Cloud Alibaba微服务架构-Ribbon负载均衡篇
文章目录 前言 一.Ribbon核心概念 二.服务器端负载均衡和Riboon客户端负载均衡 1.服务器端负载均衡: 2.Riboon客户端负载均衡: 三.Ribbon策略 四.Ribbon配置使用 五 ...
- Spring Cloud的负载均衡Spring Cloud Ribbon和Spring Cloud Feign
一.客户端负载均衡:Spring Cloud Ribbon. Spring Cloud Ribbon是基于HTTP和TCP的客户端负载工具,它是基于Netflix Ribbon实现的.通过Spring ...
- spring cloud中通过配置文件自定义Ribbon负载均衡策略
2019独角兽企业重金招聘Python工程师标准>>> spring cloud中通过配置文件自定义Ribbon负载均衡策略 博客分类: 微服务 一.Ribbon中的负载均衡策略 1 ...
- 带有Netflix Ribbon的Spring Cloud Rest Client-基础知识
在较早的博客文章中,我介绍了Spring Cloud世界中REST客户端的各种选项. 所有选项围绕着基于Netflix OSS的名为Ribbon的组件,该组件处理与承载服务的不同实例之间的调用负载平衡 ...
- 《Spring Cloud Netflix官方文档》1.服务发现:Eureka客户端
1. 服务发现:Eureka客户端 服务发现是微服务架构的关键原则之一.使用手动配置或一些约定方式来处理多服务多实例的方式是非常困难,并且十分脆弱的.Eureka同时是Netflix服务发现的 ...
最新文章
- Java实现清屏功能
- mysql符合安可要求吗,安可是什么意思?演唱太过精彩,粉丝要求返场(再唱一个)...
- 单个节点的缓存容量达到上限 Hash算法一致性
- 车间生产能耗管控方案_如何给生产车间降温 环保空调的这些方案一定能帮到你...
- Ubuntu: 搭建tftp,nfs服务器
- configtx.yaml中文注解
- Exadata中最有用的功能-存储索引
- 服务器的svnserver修改密码
- 手把手教您国外如何充值支付宝/微信教程
- 前端input操作,修改光标颜色,去除背景色
- java cas logout无效_CAS logout 解决方案
- cassandra install troubleshooting
- 【转】一个游戏程序员的学习资料
- 星星机实测,高清打印的口袋打印小精灵
- 新电脑必备的4款宝藏软件,绿色、安全、无捆绑,提高工作效率
- STM32: LCD显示
- C#时间转换几秒几分钟.....前
- 北京联通201校园宽带详解与解除限制方法(最新3.7客户端)
- 使用QGIS配准栅格地图
- 查看服务器GPU使用情况