Skip to content

负载均衡

一、项目中的负载均衡实现

在微服务项目中,我们使用 Ribbon 实现客户端负载均衡。Feign远程调用时,底层默认集成Ribbon,自动为服务调用提供负载均衡能力。


二、Ribbon负载均衡流程

  1. 服务消费者(如order-service)发起远程调用请求;
  2. Ribbon从注册中心拉取目标服务的实例列表;
  3. Ribbon根据配置的负载均衡策略,选择一个服务实例;
  4. 向选中的服务实例发起远程调用。

三、Ribbon内置负载均衡策略

策略说明
RoundRobinRule简单轮询服务列表,按顺序依次选择服务器
RandomRule随机选择一个可用的服务器
WeightedResponseTimeRule按响应时间分配权重,响应时间越长,权重越小
BestAvailableRule忽略短路服务器,选择并发数较低的服务器
RetryRule包含重试机制,失败时重新选择可用服务器
AvailabilityFilteringRule先过滤非健康实例,再选择连接数较小的实例
ZoneAvoidanceRule(默认)区域敏感策略,优先选择同区域内可用服务器,再轮询

四、自定义负载均衡策略实现

通过实现 IRule 接口自定义负载均衡规则,有两种配置方式:

1. 全局生效(所有服务调用)

创建配置类,通过 @Bean 注册自定义规则:

java
@Bean
public IRule customRule() {
    return new MyCustomRule(); // 自定义规则类
}

2. 局部生效(指定服务调用)

在配置文件中为特定服务指定负载均衡规则:

yaml
userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.example.MyCustomRule

面试相关问题

  1. 问:你们项目的负载均衡是如何实现的?答: 项目中使用Ribbon实现客户端负载均衡,Feign远程调用时底层自动集成Ribbon,通过内置或自定义策略选择服务实例,实现请求的分发和负载均衡。

  2. 问:Ribbon有哪些内置负载均衡策略?答: 常见的有轮询(RoundRobinRule)、随机(RandomRule)、权重响应时间(WeightedResponseTimeRule)、区域敏感(ZoneAvoidanceRule,默认)等策略,根据不同场景选择合适的策略。

  3. 问:如何自定义Ribbon的负载均衡策略?答: 实现IRule接口,重写choose方法定义规则,然后通过配置类(全局)或配置文件(局部)注册自定义规则,即可生效。

  4. 问:客户端负载均衡和服务端负载均衡的区别是什么?答: Ribbon属于客户端负载均衡,由服务消费者在本地根据策略选择实例;服务端负载均衡(如Nginx、Gateway)由独立服务器分发请求,二者位置和实现方式不同。

Powered by VitePress 1.6.4 | 持续更新中