面试题答案
一键面试关键策略
- ZoneAvoidanceRule:
- 策略:这是默认的负载均衡策略。它综合考虑了区域(Zone)和可用性。优先选择与客户端处于同一区域且负载较低的服务实例所在的区域,然后在选定区域内选择负载较低的实例。这样可以减少跨区域调用带来的延迟,同时均衡同一区域内实例的负载。
- 实现细节:它通过
ZoneAvoidancePredicate
和AvailabilityPredicate
这两个断言来实现。ZoneAvoidancePredicate
用于判断区域的负载情况,计算区域的负载百分比,若超过阈值则认为该区域“不好”。AvailabilityPredicate
用于判断实例的可用性,例如检查实例的运行状况是否为UP等。只有同时通过这两个断言的实例才会被考虑作为候选实例。
- RandomRule:
- 策略:从服务实例列表中随机选择一个实例。在服务实例性能相近,且希望简单均匀地分配请求时适用。
- 实现细节:通过Java的
Random
类生成一个随机数,这个随机数作为索引去服务实例列表中选择对应的实例。
- RoundRobinRule:
- 策略:以轮询的方式依次选择服务实例。按照实例在列表中的顺序,依次分配请求,保证每个实例都有机会被选中。
- 实现细节:维护一个计数器,每次选择实例后计数器加1,通过取模操作将计数器的值映射到服务实例列表的索引,从而选择对应的实例。
- RetryRule:
- 策略:在指定的重试次数内,尝试从
RoundRobinRule
选择的实例获取响应。如果失败,则尝试下一个实例,直到成功或达到最大重试次数。适用于服务实例偶尔出现故障,但很快能恢复的场景。 - 实现细节:内部包含一个
RoundRobinRule
实例用于选择实例。同时设置了重试时间间隔和最大重试次数。每次请求失败后,等待一定时间间隔后重试,若达到最大重试次数仍失败,则返回失败结果。
- 策略:在指定的重试次数内,尝试从
- BestAvailableRule:
- 策略:选择并发请求数最小的实例。优先选择负载较轻的实例,以提高系统整体的处理能力。
- 实现细节:遍历服务实例列表,获取每个实例的并发请求数(通过
LoadBalancerStats
统计),选择并发请求数最小的实例作为请求目标。
- WeightedResponseTimeRule:
- 策略:根据实例的响应时间来分配权重,响应时间越短权重越高,被选中的概率越大。这种策略能让响应快的实例承担更多的请求。
- 实现细节:它会定期收集每个实例的响应时间,根据响应时间计算权重。响应时间短的实例权重高,在选择实例时,通过权重随机算法,使权重高的实例有更高的概率被选中。
实现细节
- 服务发现:
- Ribbon与Eureka集成,通过Eureka的客户端获取服务实例列表。Eureka Server存储了所有注册服务的实例信息,Ribbon定期从Eureka Server拉取这些信息并缓存到本地。
- 负载均衡器的初始化:
- 在Spring Cloud应用启动时,会根据配置初始化相应的负载均衡器。例如,若使用默认配置,会初始化带有
ZoneAvoidanceRule
策略的负载均衡器。 - 负载均衡器会包含服务实例列表、负载均衡策略以及统计信息等。
LoadBalancerStats
用于统计每个实例的请求数量、响应时间等信息,为某些负载均衡策略(如WeightedResponseTimeRule
、BestAvailableRule
)提供数据支持。
- 在Spring Cloud应用启动时,会根据配置初始化相应的负载均衡器。例如,若使用默认配置,会初始化带有
- 请求处理流程:
- 当客户端发起请求时,Ribbon的负载均衡器会根据配置的负载均衡策略从缓存的服务实例列表中选择一个实例。
- 若选择的实例不可用(如网络故障、实例未启动等),不同的策略会有不同的处理方式。例如
RetryRule
会进行重试,而其他策略可能直接返回请求失败。 - 在请求处理过程中,
LoadBalancerStats
会更新实例的统计信息,如请求开始时记录请求时间,请求结束时记录响应时间,更新请求计数等,以便后续负载均衡策略做出更合理的决策。