题目
如何使用Spring Cloud Eureka实现服务注册与发现?
信息
- 类型:问答
- 难度:⭐
考点
Eureka服务注册,Eureka服务发现,Spring Cloud基础组件
快速回答
实现服务注册与发现的核心步骤:
- 创建Eureka Server作为注册中心
- 服务提供者通过
@EnableEurekaClient注册到Eureka - 服务消费者通过DiscoveryClient发现服务
- 使用RestTemplate或Feign调用服务
1. 原理说明
Spring Cloud Eureka采用CS架构:
- Eureka Server:注册中心,维护所有微服务的注册信息
- Eureka Client:微服务应用,启动时向Server注册,定期发送心跳
- 服务发现:消费者从Server获取提供者地址列表,通过负载均衡调用
2. 代码实现步骤
2.1 创建Eureka Server
// 主类添加注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}application.yml配置:
server:
port: 8761
eureka:
client:
register-with-eureka: false # 自身不注册
fetch-registry: false # 不获取注册表2.2 服务提供者注册
// 主类添加注解
@SpringBootApplication
@EnableEurekaClient
public class ProductServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ProductServiceApplication.class, args);
}
}application.yml配置:
spring:
application:
name: product-service # 服务名称
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/2.3 服务消费者发现与调用
@RestController
public class OrderController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/order/{id}")
public String getProduct(@PathVariable Long id) {
// 1. 获取服务实例
List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
ServiceInstance instance = instances.get(0); // 简单获取第一个实例
// 2. 构造请求URL
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/products/" + id;
// 3. 使用RestTemplate调用
return new RestTemplate().getForObject(url, String.class);
}
}3. 最佳实践
- 服务命名:使用
spring.application.name定义唯一服务ID - 负载均衡:实际生产应结合Ribbon实现客户端负载均衡(添加
@LoadBalanced注解) - 高可用:部署多个Eureka Server节点相互注册
4. 常见错误
- 服务无法注册:检查Eureka Server地址是否正确,网络是否连通
- UnknownHostException:确保服务名称拼写一致(区分大小写)
- 调用失败:服务提供者未启动或健康检查未通过
5. 扩展知识
- 服务续约:默认每30秒发送心跳,90秒未收到则剔除服务
- 自我保护模式:当85%以上服务心跳丢失时,Eureka保护注册信息不删除
- 替代方案:Consul、Nacos等也可作为注册中心