负载均衡概述
问题背景
在微服务架构中,远程调用往往面临服务实例冗余的情况。假设我们有一个 product-service,它可能部署了多个实例。如果直接通过 DiscoveryClient 获取实例列表并手动选择第一个,流量将全部集中在单台机器上,无法利用集群的并发能力。
List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
// 风险:总是取第一个,导致负载不均
ServiceInstance instance = instances.get(0);
为了解决这个问题,我们需要一种机制,能够根据一定的规则,将请求合理分配到不同的服务实例上,这就是负载均衡的核心价值。
概念解析
负载均衡(Load Balance)是高并发、高可用系统的关键组件。当流量增大时,通常采用增加机器扩容的方式,而负载均衡负责在多个资源间分配负载。
从实现位置来看,主要分为两类:
- 服务端负载均衡:如 Nginx,请求先到达负载均衡器,由其在后端服务器中选择目标。
- 客户端负载均衡:如 Spring Cloud LoadBalancer,客户端直接从注册中心获取服务列表,在本地完成选择。
Spring Cloud 早期默认使用 Ribbon,现已逐步迁移至官方维护的 Spring Cloud LoadBalancer。
Spring Cloud LoadBalancer 实战
快速上手
要在项目中使用 LoadBalancer,核心在于配置 RestTemplate 并启用负载均衡功能。
- 配置 Bean:给
RestTemplate添加@LoadBalanced注解。
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
- 修改调用地址:将 URL 中的 IP 端口替换为服务名称。
public OrderInfo selectOrderById(Integer orderId) {
// 直接使用服务名,无需指定具体 IP
String url + orderInfo.getProductId();
restTemplate.getForObject(url, ProductInfo.class);
orderInfo.setProductInfo(productInfo);
orderInfo;
}


