主题切换
负载均衡
一、项目中的负载均衡实现
在微服务项目中,我们使用 Ribbon 实现客户端负载均衡。Feign远程调用时,底层默认集成Ribbon,自动为服务调用提供负载均衡能力。
二、Ribbon负载均衡流程
- 服务消费者(如order-service)发起远程调用请求;
- Ribbon从注册中心拉取目标服务的实例列表;
- Ribbon根据配置的负载均衡策略,选择一个服务实例;
- 向选中的服务实例发起远程调用。
三、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面试相关问题
问:你们项目的负载均衡是如何实现的?答: 项目中使用Ribbon实现客户端负载均衡,Feign远程调用时底层自动集成Ribbon,通过内置或自定义策略选择服务实例,实现请求的分发和负载均衡。
问:Ribbon有哪些内置负载均衡策略?答: 常见的有轮询(RoundRobinRule)、随机(RandomRule)、权重响应时间(WeightedResponseTimeRule)、区域敏感(ZoneAvoidanceRule,默认)等策略,根据不同场景选择合适的策略。
问:如何自定义Ribbon的负载均衡策略?答: 实现IRule接口,重写choose方法定义规则,然后通过配置类(全局)或配置文件(局部)注册自定义规则,即可生效。
问:客户端负载均衡和服务端负载均衡的区别是什么?答: Ribbon属于客户端负载均衡,由服务消费者在本地根据策略选择实例;服务端负载均衡(如Nginx、Gateway)由独立服务器分发请求,二者位置和实现方式不同。