侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

Spring Cloud Eureka 服务注册与发现的基本实现

2025-12-9 / 0 评论 / 4 阅读

题目

Spring Cloud Eureka 服务注册与发现的基本实现

信息

  • 类型:问答
  • 难度:⭐

考点

微服务注册中心,服务发现机制,Eureka客户端配置

快速回答

在Spring Cloud微服务中实现Eureka服务注册与发现需要以下步骤:

  1. 创建Eureka Server注册中心
  2. 在服务提供者中添加Eureka Client依赖和配置
  3. 在服务消费者中使用DiscoveryClient查找服务
  4. 通过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: 8761

2. 服务提供者配置

// 主类添加注解
@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也可作为注册中心