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

相关推荐
牟同學1 小时前
Hermes Agent Docker 离线部署完整指南
docker·容器·eureka·hermes
kaisun6416 小时前
Docker 构建网络问题排查
网络·docker·eureka
开开心心就好1 天前
小白友好的程序联网封锁实用工具
windows·eureka·计算机外设·rabbitmq·word·excel·csdn开发云
IT策士2 天前
第17篇 Docker Compose 进阶实战:多 Compose 文件与环境覆盖
docker·容器·eureka
希望永不加班2 天前
SpringBoot 服务注册与发现:Nacos/Consul/Eureka
java·spring boot·eureka·consul·java-consul
菜萝卜子2 天前
【Docker】Harbor 代理缓存(Pull-Through Cache)配置与使用指南
spring cloud·云原生·eureka
dj80452 天前
docker 安装注意事项与使用
spring cloud·docker·eureka
天下·第二3 天前
如何在【x86】服务器上打包构建【arm】镜像
服务器·arm开发·eureka
Nontee4 天前
Docker基础
docker·容器·eureka