一、什么是ribbon

1、ribbon介绍
(1)ribbon是一个基于http和tcp的客户端负载均衡工具,它是基于Netflix Ribbon实现的。
(2)它不像springcloud服务注册中心、配置中心、API网关那样独立部署,但是它几乎存在于每个springcloud微服务中。包括feign提供的声明式服务调用也是基于该ribbon实现的。
(3)ribbon默认提供很多种负载均衡算法,例如轮询、随机等等。甚至包括自定义的负载均衡算法。
(4)他解决并提供了微服务的负载均衡的问题。

2、负载均衡解决方案的分类
目前业界主流的负载均衡方案可分为两类:
第一类:集中式负载均衡,即在服务的消费方和提供方之间使用独立的负载均衡设施(可以是硬件,如F5,也可以是软件,如nginx),由该设施把访问请求通过某种策略转发至服务的提供方;
第二类:进程内负载均衡,将负载均衡逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一台合适的服务器。
ribbon就属于后者,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

3、ribbon的架构图

集中式负载均衡:

java实现负载均衡的加权轮询算法 java负载均衡框架_ide

进程内负载均衡:

java实现负载均衡的加权轮询算法 java负载均衡框架_ide_02

二、负载均衡策略

1、轮询策略(默认)(RoundRobinRule)RoundRobinRule
轮询策略表示每次都顺序取下一个provider,比如一共有5个provider,第1次取第1个,第2次取第2个,以此类推。

2、权重轮询策略—WeightedResponseTimeRule
(1)根据每个provider的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。
(2)原理:一开始为轮询策略,并开启一个计时器,每30秒收集一次每个provider的平均响应时间,当信息足够时,给每个provider附上一个权重,并按权重随机选择provider权重越高的provider会被高概率选中。

3、随机策略(RandomRule)
从provider列表中随机选择一个provider。

4、最少并发数策略(BestAvailableRule)
选择正在请求中的并发数最小的provider,除非这个provider在熔断中。

5、在“选定的负载均衡策略”基础上进行重试机制(RetryRule)
(1)“选定的负载均衡策略”这个策略是轮询策略RoundRobinRule。
(2)该重试策略先设定一个阈值时间段,如果在这个阈值时间段内当选择provider不成功,则一直尝试采用“选定的负载均衡策略:轮询策略”最后选择一个可用的provider。A失败了会去重试B。

6、可用性敏感策略(AvailabilityFilteringRule)
过滤性能差的provider,有两种:
第一种,过滤掉在erueka中一直处于连接失败的provider
第二种,过滤掉高并发的provider

7、区域敏感性策略(ZoneAvoidanceRule)
(1)以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的provider。
(2)如果这个ip区域内有一个或多个实例不可达或响应变慢,都会降低该ip区域内其他ip被选中的权重。

8、代码设置负载均衡策略
在springboot启动类中添加:

@Bean
	public IRule ribbonRule() {
		return new RandomRule();
	}

9、配置文件设置负载均衡策略

#设置负载均衡策略
provider-NAME.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

三、点对点直连,开发调试ribbon

java实现负载均衡的加权轮询算法 java负载均衡框架_负载均衡_03

1、剔除eureka
2、加入ribbon依赖包
3、修改配置文件

#禁用eureka
ribbon.eureka.enabled=false
#指定具体的服务实例清单
provider-NAME.ribbon.listOfServers=192.168.10.61:8081