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 为微服务架构提供了一个简单而有效的服务发现解决方案,能够帮助你构建健壮、可扩展的分布式系统。

相关推荐
努力努力再努力wz4 天前
【Docker入门系列】从 LXC 到 containerd:一文梳理 Docker 容器运行时架构演进与轻量化原理
docker·eureka·架构
梅梅绵绵冰7 天前
Docker容器化平台
docker·容器·eureka
jiao糖瓜子7 天前
Docker 完全指南:从镜像容器到生产部署
docker·容器·eureka·镜像·仓库
yanwumuxi8 天前
Milvus使用和改进
云原生·eureka·milvus
xhaxy9 天前
docker
docker·容器·eureka
一技安身9 天前
【信创】Docker‑Compose V2 两种离线部署(独立模式、插件模式)简易教程
java·docker·eureka
重生之我是Java开发战士10 天前
【Spring Cloud】Eureka服务注册发现与LoadBalancer负载均衡
spring cloud·eureka·负载均衡
重生之我来学Python11 天前
Docker套装的简介、安装、超级详细教程
linux·docker·容器·eureka·github
起名真的太难了11 天前
Docker 项目部署
docker·容器·eureka
码力斜杠哥11 天前
Docker Compose快速入门笔记
笔记·docker·eureka