在微服务架构中,Eureka 作为服务注册与发现中心,能够让各个微服务实例在启动时将自身的信息注册到 Eureka 服务器,并从 Eureka 服务器获取其他服务的实例信息。而 Ribbon 是一个客户端负载均衡器,负责在多个服务实例之间进行负载均衡,将客户端的请求合理地分配到不同的服务实例上。下面将详细介绍 Eureka 与 Ribbon 混合使用的相关内容。
集成配置
依赖添加
在 Spring Cloud 项目中,使用 spring-cloud-starter-netflix-eureka-client
时会自带 spring-cloud-starter-ribbon
引用。在 Maven 项目的 pom.xml
中添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件设置
在应用的配置文件(如 application.yml
或 application.properties
)中进行相关配置:
# 开启从 Eureka 获取服务列表
ribbon.eureka.enabled=true
# 请求连接超时时间,单位 ms
ribbon.ConnectTimeout=1000
# 请求处理的超时时间,单位 ms
ribbon.ReadTimeout=3000
# 是否重试所有的接口
ribbon.OkToRetryOnAllOperations=false
# 切换实例的重试次数
ribbon.MaxAutoRetriesNextServer=2
# 对当前实例的重试次数,当 Eureka 中可以找到服务,但是服务连不上时将会重试
ribbon.MaxAutoRetries=1
如果使用 application.properties
,则配置如下:
ribbon.eureka.enabled=true
ribbon.ConnectTimeout=1000
ribbon.ReadTimeout=3000
ribbon.OkToRetryOnAllOperations=false
ribbon.MaxAutoRetriesNextServer=2
ribbon.MaxAutoRetries=1
工作原理
Ribbon 在与 Eureka 混合使用时,工作过程分为两步:
- 选择 Eureka Server:优先选择在同一个区域内负载较少的 Eureka Server。
- 选择服务实例:根据用户指定的负载均衡策略,在从 Eureka Server 获取到的服务注册列表中选择一个具体的服务实例地址。
负载均衡策略
Ribbon 提供了多种负载均衡策略,常见的有:
- 轮询(RoundRobinRule):按顺序循环选择服务实例,这是默认的策略。例如,有三个服务实例 A、B、C,请求会依次发送到 A、B、C、A、B、C……
- 随机(RandomRule):每次随机选择一个服务实例,适用于请求量不均衡的场景。
- 加权轮询(WeightedRoundRobinRule):根据每个实例的权重动态分配流量,适用于不同处理能力的服务实例。比如,服务实例 A 的权重为 2,服务实例 B 的权重为 1,那么在多次请求中,A 被选中的概率是 B 的两倍。
使用示例
以下是一个使用 RestTemplate 和 Ribbon 结合 Eureka 的简单示例:
服务提供者
创建一个简单的 Spring Boot 服务提供者,在 application.yml
中配置服务名和端口:
spring:
application:
name: microservice-provider
server:
port: 8001
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
创建一个简单的控制器:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProviderController {
@GetMapping("/hello")
public String hello() {
return "Hello from provider!";
}
}
服务消费者
在服务消费者项目中,配置 Eureka 客户端和 Ribbon:
spring:
application:
name: microservice-consumer
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
创建一个配置类,注入 RestTemplate 并使用 Ribbon 进行负载均衡:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
创建一个控制器来调用服务提供者的接口:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/callProvider")
public String callProvider() {
return restTemplate.getForObject("http://microservice-provider/hello", String.class);
}
}
注意事项
- 服务名一致性:服务提供者和消费者在 Eureka 中注册和调用时使用的服务名要保持一致,否则 Ribbon 无法正确找到对应的服务实例。
- 超时设置:合理设置
ribbon.ConnectTimeout
和ribbon.ReadTimeout
,避免因超时时间过短导致请求频繁失败,或过长导致响应时间过长。 - 重试机制:根据实际业务需求,合理配置重试次数和是否重试所有操作,避免无限重试导致系统资源浪费。
通过以上步骤,就可以实现 Eureka 与 Ribbon 的混合使用,让微服务系统更加稳定和高效地运行。
原创文章,作者:zhiji,如若转载,请注明出处:https://zube.cn/archives/22