题目
Spring Cloud Eureka 服务注册与发现的基本实现
信息
- 类型:问答
- 难度:⭐
考点
微服务注册中心,服务发现机制,Eureka客户端配置
快速回答
在Spring Cloud微服务中实现Eureka服务注册与发现需要以下步骤:
- 创建Eureka Server注册中心
- 在服务提供者中添加Eureka Client依赖和配置
- 在服务消费者中使用DiscoveryClient查找服务
- 通过RestTemplate调用远程服务
原理说明
Eureka是Spring Cloud的核心组件,采用CS架构:
- Eureka Server:服务注册中心,管理所有微服务的注册信息
- Eureka Client:嵌入微服务中,负责向Server注册并定期发送心跳
- 服务发现:消费者从注册中心获取服务提供者的网络地址
代码示例
1. Eureka Server配置
// 主类添加注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApp {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApp.class, args);
}
}
// application.yml配置
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false # 自身不注册
fetchRegistry: false # 不获取注册表
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:8761/eureka/
server:
port: 87612. 服务提供者配置
// 主类添加注解
@SpringBootApplication
@EnableDiscoveryClient // 关键注解
public class ProductServiceApp { ... }
// application.yml配置
spring:
application:
name: product-service # 服务名称
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/3. 服务消费者调用
@RestController
public class OrderController {
@Autowired
private DiscoveryClient discoveryClient; // 服务发现客户端
@Autowired
private RestTemplate restTemplate;
@GetMapping("/order/{id}")
public Product getProduct(@PathVariable Long id) {
// 1. 通过服务名获取实例
List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
// 2. 获取第一个可用实例的URL(实际需负载均衡)
String url = instances.get(0).getUri() + "/products/" + id;
// 3. 发起HTTP调用
return restTemplate.getForObject(url, Product.class);
}
}最佳实践
- 使用
@LoadBalanced注解修饰RestTemplate实现客户端负载均衡 - 服务名称(spring.application.name)需保持唯一且语义化
- 生产环境需部署Eureka Server集群实现高可用
常见错误
- 服务未注册:忘记添加
@EnableDiscoveryClient注解 - 连接失败:Eureka Server地址配置错误(defaultZone拼写错误)
- 无法发现服务:消费者和服务提供者未使用相同的注册中心
扩展知识
- 健康检查:Eureka通过心跳机制(默认30秒)检测服务存活
- 自我保护模式:当85%以上服务心跳丢失时,Eureka保护注册信息不删除
- 替代方案:Consul、Zookeeper、Nacos也可作为注册中心