Eureka 服务发现原理及实践

引言

随着微服务架构的普及,服务发现成为了分布式系统中的一个重要组成部分。Eureka 是 Netflix 开源的一款基于 REST 服务的服务发现组件,主要用于定位服务,以实现云端中间层服务发现和故障转移。本文将介绍 Eureka 的基本原理,并通过一个简单的实践案例来展示如何使用 Eureka 进行服务发现。

1. Eureka 简介

1.1 什么是 Eureka?

Eureka 是 Netflix 的一款服务发现框架,它基于 REST 服务实现,用于定位服务,以实现云端中间层服务发现和故障转移。Eureka 包含两个组件:Eureka Server 和 Eureka Client。

  • Eureka Server:提供服务注册中心的功能。
  • Eureka Client:是一个 Java 客户端,用于简化与 Eureka Server 的交互;客户端同时具备服务提供者和服务消费者的角色。

1.2 Eureka 的工作原理

Eureka 使用了一个完全去中心化的模型。所有的节点既是服务提供者也是服务消费者。每个节点都会启动一个 Eureka Client,并定期向 Eureka Server 发送心跳消息来表明自己仍然可用。如果 Eureka Server 在一定时间内没有收到某个节点的心跳,它会将该实例从服务注册表中移除。

  • 服务注册:服务启动时,Eureka Client 会向 Eureka Server 注册自身信息(如 IP 地址、端口、服务 ID 等)。
  • 服务发现:当客户端需要调用其他服务时,它会向 Eureka Server 请求服务列表,获取可用的服务实例地址。
  • 服务续约:为了保持服务实例的有效性,客户端每隔一定时间(默认为 30 秒)会向 Eureka Server 发送一次心跳信息,表明服务实例仍然存活。
  • 服务下线:如果 Eureka Server 在一段时间内(默认为 90 秒)没有收到客户端的心跳信息,它会将该服务实例标记为下线。

2. Eureka 实践

2.1 环境准备

  1. Java 环境:确保本地环境已经安装了 Java 11 或更高版本。
  2. Maven:使用 Maven 作为构建工具。
  3. Spring Boot:使用 Spring Boot 2.x 版本。

2.2 创建 Eureka Server

  1. 创建项目:使用 Spring Initializr 创建一个 Spring Boot 项目,添加 spring-boot-starter-eureka-server 依赖。

  2. 配置文件:编辑 application.yml 文件。

     yaml 

    深色版本

    1server:
    2  port: 8761
    3
    4eureka:
    5  instance:
    6    hostname: localhost
    7  client:
    8    register-with-eureka: false
    9    fetch-registry: false
    10    service-url:
    11      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  3. 启动类:添加 @EnableEurekaServer 注解。

     java 

    深色版本

    1import org.springframework.boot.SpringApplication;
    2import org.springframework.boot.autoconfigure.SpringBootApplication;
    3import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    4
    5@SpringBootApplication
    6@EnableEurekaServer
    7public class EurekaServerApplication {
    8
    9    public static void main(String[] args) {
    10        SpringApplication.run(EurekaServerApplication.class, args);
    11    }
    12}
  4. 运行:启动 Eureka Server 应用,访问 http://localhost:8761 查看服务注册界面。

2.3 创建 Eureka Client

  1. 创建项目:使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加 spring-boot-starter-webspring-cloud-starter-netflix-eureka-client 依赖。

  2. 配置文件:编辑 application.yml 文件。

     yaml 

    深色版本

    1server:
    2  port: 8080
    3
    4eureka:
    5  client:
    6    service-url:
    7      defaultZone: http://localhost:8761/eureka/
    8    register-with-eureka: true
    9    fetch-registry: true
    10    instance:
    11      prefer-ip-address: true
    12      lease-expiration-duration-in-seconds: 90
    13      lease-renewal-interval-in-seconds: 30
    14      metadata-map:
    15        instanceId: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
  3. 启动类:添加 @EnableEurekaClient 注解。

     java 

    深色版本

    1import org.springframework.boot.SpringApplication;
    2import org.springframework.boot.autoconfigure.SpringBootApplication;
    3import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    4
    5@SpringBootApplication
    6@EnableEurekaClient
    7public class EurekaClientApplication {
    8
    9    public static void main(String[] args) {
    10        SpringApplication.run(EurekaClientApplication.class, args);
    11    }
    12}
  4. 控制器:创建一个简单的 REST 控制器。

     java 

    深色版本

    1import org.springframework.web.bind.annotation.GetMapping;
    2import org.springframework.web.bind.annotation.RestController;
    3
    4@RestController
    5public class MyController {
    6
    7    @GetMapping("/hello")
    8    public String hello() {
    9        return "Hello from Eureka Client!";
    10    }
    11}
  5. 运行:启动 Eureka Client 应用,再次访问 Eureka Server 的界面,可以看到刚刚启动的服务实例已经被注册。

2.4 服务发现

  1. 创建另一个 Eureka Client:按照上面的步骤创建第二个 Eureka Client。

  2. 调用服务:在第二个 Eureka Client 中添加一个 REST 控制器,用于调用第一个 Eureka Client 的 /hello 接口。

     java 

    深色版本

    1import org.springframework.beans.factory.annotation.Autowired;
    2import org.springframework.web.bind.annotation.GetMapping;
    3import org.springframework.web.bind.annotation.RestController;
    4import org.springframework.web.client.RestTemplate;
    5
    6@RestController
    7public class ServiceDiscoveryController {
    8
    9    private final RestTemplate restTemplate;
    10
    11    @Autowired
    12    public ServiceDiscoveryController(RestTemplate restTemplate) {
    13        this.restTemplate = restTemplate;
    14    }
    15
    16    @GetMapping("/call-service")
    17    public String callService() {
    18        String response = restTemplate.getForObject("http://eureka-client/hello", String.class);
    19        return "Called service: " + response;
    20    }
    21}
  3. 运行:启动第二个 Eureka Client 应用,访问 http://localhost:8081/call-service 来调用第一个 Eureka Client 的接口。

3. 总结

通过本文的学习,你应该已经掌握了 Eureka 服务发现的基本原理,并且能够通过实践案例了解如何在实际项目中使用 Eureka 进行服务注册和服务发现。Eureka 为微服务架构提供了一个简单而有效的服务发现解决方案,能够帮助你构建健壮、可扩展的分布式系统。

你可能感兴趣的:(eureka)