目录
一、 是什么?
Spring Cloud --> 软件系统开发定制软件系统开发定制大量使用了 Netflix 软件系统开发定制软件系统开发定制公司的开源项目
Spring Cloud Alibaba --> 大量使用了 Alibaba 公司的开源项目
Spring Cloud Ribbon 是基于 Netflix Ribbon 软件系统开发定制实现的一套客户端负载均衡器。软件系统开发定制我们通常说的负载均衡是指将一个请求均匀地分摊到不同的节点单元上执行,负载均衡分为硬件负载均衡和软件负载均衡。
- 硬件负载均衡:比如 F5、深信服、Array 等。
- 软件负载均衡:比如 Nginx、LVS、HAProxy 等(是一个服务器实现的)。
Ribbon 是 Netflix 公司发布的开源项目 (组件、框架、jar包) ,主要功能是提供客户端的软件负载均衡算法,它会从 eureka 中获取一个可用的服务端清单,通过心跳检测来剔除故障的服务端节点以保证清单中都是可以正常访问的服务端节点。
当客户端发送请求,则 ribbon 负载均衡器按某种算法 (比如轮询、权重、 最小连接数等) 从维护的可用服务端清单中取出一台服务端的地址,然后进行请求。
Ribbon非常简单,可以说就是一个 jar 包,这个 jar 包实现了负载均衡算法,Spring Cloud 对 Ribbon 做了二次封装,可以让我们使 RestTemplate 的服务请求,自动转换成客户端负载均衡的服务调用。 Ribbon 支持多种负载均衡算法,还支持自定义的负载均衡算法。
客户端负载均衡 vs 服务端负载均衡
二、采用 Ribbon 实现服务调用
A、加入 Ribbon 的依赖
但是 eureka 已经依赖了 ribbon,所以这里不需要再引用ribbon的依赖
B、要使用 Ribbon,只需要一个注解
@Bean@LoadBalancedpublic RestTemplate restTemplate(){ RestTemplate restTemplate = new RestTemplate(); return restTemplate;}
- 1
- 2
- 3
- 4
- 5
- 6
在 RestTemplate 上面加入 @LoadBalanced
注解,这样就可以实现 RestTemplate 在调用时自动负载均衡。我们这里现在启动了 Eureka 集群 (3个eureka) 和服务提供者集群 (2个service-goods) 和一个服务调用者 (service-portal)
#告诉服务端,服务实例的唯一IDeureka.instance.instance-id=springcloud-service-portal
- 1
- 2
三、Ribbon
Ribbon 的负载均衡策略是由 IRule 接口定义, 该接口由如下实现:
在 jar 包:com.netflix.ribbon # ribbon-loadbalancer 中
要使用 Ribbon 实现负载均衡,在Spring 的配置类里面把对应的负载均衡接口实现类作为一 个 Bean 配置一下就行了。
负载均衡的入口:ILoadBalancer
接口
如果要切换负载均衡策略:
@Beanpublic IRule iRule(){ return new RoundRobinRule();}
- 1
- 2
- 3
- 4
负载均衡实现 | 策略 |
---|---|
RandomRule | 随机 |
RoundRobinRule | 轮询 |
AvailabilityFilteringRule | 先过滤掉由于多次访问故障的服务,以及并发连接数超过阈值的服务,然后对剩下的服务按照轮询策略进行访问。 |
WeightedResponseTimeRule | 根据平均响应时间计算所有服务的权重,响应时间越快服务权重就越大被选中的概率即越高,如果服务刚启动时统计信息不足,则使用RoundRobinRule策略,待统计信息足够会切换到该WeightedResponseTimeRule 策略 |
RetryRule | 先按照RoundRobinRule策略分发,如果分发到的服务不能访问,则在指定时间内进行重试,然后分发其他可用的服务 |
BestAvailableRule | 先过滤掉由于多次访问故障的服务,然后选择一个并发量最小的服务 |
ZoneAvoidanceRule | 综合判断服务节点所在区域的性能和服务节点的可用性,来决定选择哪个服务 |
如果我们没有指定负载均衡策略,Ribbon 默认的负载均衡是 ZoneAvoidanceRule