什么是负载均衡
当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。
在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡要解决的问题。
Ribbon是什么
SpringCloud Ribbon是一个客户端负载均衡工具,它几乎存在于每一个springcloud构建的微服务和基础设施中。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。
客户端负载均衡
负载均衡在系统中是一个非常重要,并且不得不去实施的内容。因为负载均衡是对系统的高可用,网络压力的缓解和处理能力扩容的重要手段之一。关于负载均衡的知识可以参考这篇文章高性能网站实用技巧之负载均衡篇
我们在为服务架构中使用客户端负载均衡非常方便:
- 服务提供者启动多个实例并注册到注册中心
- 服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用
Load Balancer(LB)方案分类
目前主流的LB方案分为两类:
- 集中式LB,即在服务的提供者和服务的消费者之间使用独立的LB设施(可以是硬件如F5,也可以是软件如nginx),由该设施负责把访问请求通过某种策略发至服务提供者。
- 进程内LB:将LB逻辑集成到服务消费者,消费者从服务注册中心获知有哪些服务可用,然后再从这些服务中选择合适的服务器
Ribbon的核心组件
-
ServerList:用于获取地址列表,它可以是静态的(提供一组固定的地址),例如ConfigurationBasedServerList,它是通过设置静态的服务列表;也可以是动态的(从注册中心定期查询地址列表),例如DiscoveryEnabledNIWSServerList
-
ServerListFilter:仅当使用动态ServerList时,用于在原始的服务列表中使用一定的策略过滤掉一部分地址。Ribbon中有两种ServerListFilter的实现:(1)ZoneAffinityServerListFilter:过滤掉与客户端不在同一可用区中的服务,除非同一区中没有可用服务 ;(2)ServerListSubsetFilter:该过滤器确保客户端只能看见所有服务列表中的一个固定子集,它也可以周期性的用新服务替换掉子集中低可用的服务
-
Ping:确保服务可用性的组件
-
IRule:负载均衡策略
Ribbon提供的常用负载均衡策略
- RandomRule:随机选择状态为up的server
- RoundRobinRule:按照线性轮询的方式选择server
- RetryRule:实现了一个具备重试机制的实例选择功能(当请求一个服务实例超时时会触发,可以设置超时时间以及重试次数)
- WeightedResponseTime:根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低
- BestAvailableRule:遍历所有的服务实例,过滤掉故障的实例,找出并发请求数最少的一个,所有可以选出最空闲的实例
- ZoneAvoidanceRule:复合判断server所在区域的性能和server的可用性选择server
负载均衡的单点问题
负载均衡服务器是整个集群所有请求的入口,当请求量过大的时候难免会出现单点问题,这也是集群模式天然的弊端。
要解决这个问题很简单,只要对配置几个Ribbon服务即可
网友评论