在微服务架构中,基于 Eureka(服务注册中心)和 RestTemplate(HTTP 客户端)实现负载均衡是常见的方案,核心是通过 Eureka 获取服务实例列表,再结合负载均衡策略选择具体服务实例进行调用。以下是详细实现方式和原理:
一、核心组件角色
二、实现步骤
1. 搭建 Eureka Server
- 引入依赖(Maven):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 启动类注解:添加@EnableEurekaServer开启注册中心功能。
- 配置文件(application.yml):
yaml
server:
port: 8761 # Eureka Server默认端口
eureka:
client:
register-with-eureka: false # 自身不注册到Eureka
fetch-registry: false # 不获取服务列表(纯注册中心模式)
server:
enable-self-preservation: false # 关闭自我保护模式(开发环境用)
2. 服务提供者注册到 Eureka
- 引入依赖:
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 启动类注解:添加@EnableEurekaClient(或@SpringBootApplication,Spring Cloud 2.0 + 可省略)。
- 配置文件:
yaml
spring:
application:
name: service-provider # 服务名(消费者将通过该名称调用)
server:
port: 8081 # 多个实例需不同端口(如8081、8082)
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # Eureka Server地址
- 启动多个实例:通过–server.port=8081和–server.port=8082启动同一服务的多个实例,模拟集群。
3. 服务消费者配置(核心)
- 引入依赖:除 Eureka Client 依赖外,需添加负载均衡依赖(Spring Cloud 默认集成 Ribbon 作为负载均衡器):
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
- 配置 RestTemplate:通过@LoadBalanced注解开启负载均衡功能(底层会自动结合 Ribbon):
java
运行
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced // 关键:开启负载均衡,自动集成Ribbon
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
- 调用服务:使用服务名(而非具体 IP: 端口)作为 URL,RestTemplate 会自动从 Eureka 获取实例并负载均衡:
java
运行
@Service
public class ConsumerService {
@Autowired
private RestTemplate restTemplate;
public String callProvider() {
// 服务名"service-provider"对应提供者的spring.application.name
String url = "http://service-provider/hello"; // 无需写具体IP:端口
return restTemplate.getForObject(url, String.class);
}
}
4. 负载均衡策略配置
默认情况下,Ribbon 使用轮询策略(依次调用每个实例),可通过配置修改策略:
- 全局配置(所有服务生效):
yaml
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 随机策略
- 针对特定服务配置(仅对 "service-provider" 生效):
yaml
service-provider: # 服务名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule # 权重响应时间策略
常见策略类:
- RoundRobinRule:轮询(默认)
- RandomRule:随机
- WeightedResponseTimeRule:根据响应时间加权(响应快的实例权重高)
- RetryRule:重试机制(失败后重试其他实例)
- BestAvailableRule:选择并发量最低的实例
三、原理说明
服务注册与发现:
- 服务提供者启动时,向 Eureka Server 注册自身信息(服务名、IP、端口等)。
- Eureka Server 维护服务实例列表,并定期检查心跳(默认 30 秒一次),移除无心跳的实例。
- 服务消费者启动时,向 Eureka Server 订阅服务,定期拉取(默认 30 秒一次)服务实例列表到本地缓存。
负载均衡执行流程:
- 消费者调用restTemplate.getForObject("http://service-provider/hello")时,@LoadBalanced注解会触发 Ribbon 的拦截器。
- 拦截器将服务名 "service-provider" 解析为 Eureka 中的实例列表。
- 根据配置的负载均衡策略(如轮询),从列表中选择一个实例(如 192.168.1.100:8081)。
- 将 URL 替换为具体 IP: 端口(如http://192.168.1.100:8081/hello),发起实际请求。
四、注意事项
yaml
service-provider:
ribbon:
ConnectTimeout: 2000 # 连接超时(毫秒)
ReadTimeout: 5000 # 读取超时(毫秒)
通过以上配置,即可基于 Eureka 和 RestTemplate 实现服务间的负载均衡调用,提升系统的可用性和扩展性。
评论前必须登录!
注册