4.Ribbon负载均衡
注意,在Spring Cloud 2022.0.2中,Ribbon已经被官方标记为不建议使用的技术。因此,官方不再提供Ribbon的饥饿加载支持。
相反,Spring Cloud推荐使用Spring Cloud LoadBalancer作为替代方案。Spring Cloud LoadBalancer是一个基于Ribbon的新负载均衡器,它提供了更好的性能和可扩展性。它还支持Spring Cloud Gateway和Spring Cloud Circuit Breaker等组件。
4.1 负载均衡原理
服务端负载均衡
服务端负载均衡是在客户端和服务端之间建立一个独立的负载均衡服务器,该服务器既可以是硬件设备(例如 F5),也可以是软件(例如 Nginx)。这个负载均衡服务器维护了一份可用服务端清单,然后通过心跳机制来删除故障的服务端节点,以保证清单中的所有服务节点都是可以正常访问的。
当客户端发送请求时,该请求不会直接发送到服务端进行处理,而是全部交给负载均衡服务器,由负载均衡服务器按照某种算法(例如轮询、随机等),从其维护的可用服务清单中选择一个服务端,然后进行转发。

客户端负载均衡
客户端负载均衡是将负载均衡逻辑以代码的形式封装到客户端(服务消费者)上,即负载均衡器位于客户端。客户端通过服务注册中心(例如 Eureka Server)获取到一份服务端提供的可用服务清单。有了服务清单后,负载均衡器会在客户端发送请求前通过负载均衡算法选择一个服务端实例再进行访问,以达到负载均衡的目的;
客户端负载均衡也需要心跳机制去维护服务端清单的有效性,这个过程需要配合服务注册中心一起完成。

当前实例为例的流程:

因为user-service并不是一个有效的url,需要ribbon负载均衡拦截后查询eureka重新路由,所以上面提到不添加@LoadBalanced
就无法正常访问资源。
4.2 负载均衡策略
查看源码可以得到Ribbon拦截并获取url的流程如图:

其中IRule
接口主要用来定义负载均衡策略,它有 7 个默认实现类,每一个实现类都是一种负载均衡策略。
序号 | 实现类 | 负载均衡策略 |
---|---|---|
1 | RoundRobinRule | 按照线性轮询策略,即按照一定的顺序依次选取服务实例 |
2 | RandomRule | 随机选取一个服务实例 |
3 | RetryRule | 按照 RoundRobinRule(轮询)的策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试(重试时获取服务的策略还是 RoundRobinRule 中定义的策略),如果超过指定时间依然没获取到服务实例则返回 null 。 |
4 | WeightedResponseTimeRule | WeightedResponseTimeRule 是 RoundRobinRule 的一个子类,它对 RoundRobinRule 的功能进行了扩展。 根据平均响应时间,来计算所有服务实例的权重,响应时间越短的服务实例权重越高,被选中的概率越大。刚启动时,如果统计信息不足,则使用线性轮询策略,等信息足够时,再切换到 WeightedResponseTimeRule。 |
5 | BestAvailableRule | 继承自 ClientConfigEnabledRoundRobinRule。先过滤点故障或失效的服务实例,然后再选择并发量最小的服务实例。 |
6 | AvailabilityFilteringRule | 先过滤掉故障或失效的服务实例,然后再选择并发量较小的服务实例。 |
7 | ZoneAvoidanceRule | 默认的负载均衡策略,综合判断服务所在区域(zone)的性能和服务(server)的可用性,来选择服务实例。在没有区域的环境下,该策略与轮询(RandomRule)策略类似。 |
使用如下,也可以自定义负载均衡策略(1.定义一个类实现AbstractLoadBalancer
接口,2.在配置类的myRule()中调用该类实例,3.主启动类注解@RibbonClient指明配置类)
@Bean
public IRule myRule() {
// RandomRule 为随机策略
return new RandomRule();
}
4.3 懒加载
ribbon默认采用懒加载,即第一次访问时才会创建LoadBalancedClient
,请求时间很长;
饥饿加载会在项目启动时创建,降低第一次访问的耗时.
新版本的饥饿加载开启:
spring:
# 开启饥饿加载
loadbalancer:
eager-load:
clients: #指定饥饿加载的服务名称
- user-service
(没注意,不知道有用没,springcloud2022.0.2已经不支持ribbon了)