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

相关推荐
Dontla2 天前
Dockerfile解析器指令(Parser Directive)指定语法版本,如:# syntax=docker/dockerfile:1
java·docker·eureka
Dxy12393102162 天前
Docker常用命令详解
docker·容器·eureka
wp90902 天前
Docker命令大全
docker·云原生·eureka
傻傻虎虎2 天前
【CentOS7】docker安装成功后测试,报Unable to find image ‘hello-world:latest‘ locally
docker·容器·eureka
惜.己3 天前
Docker启动失败 Failed to start Docker Application Container Engine.
spring cloud·docker·eureka
敲上瘾5 天前
Docker 容器核心指令与数据库容器化实践
linux·运维·服务器·docker·容器·eureka·dubbo
奋斗的老史6 天前
25年Docker镜像无法下载的四种对策
docker·容器·eureka
小马爱打代码6 天前
Spring Cloud Eureka 核心原理
spring cloud·eureka
小薛博客7 天前
12、Docker基本概念 容器与镜像与安装
docker·容器·eureka
雨中来客7 天前
解决Docker运行hello-world镜像报错问题
docker·eureka