首页
/ Eureka 开源项目使用教程

Eureka 开源项目使用教程

2026-01-16 09:20:02作者:申梦珏Efrain

概述

Eureka 是 Netflix 开源的服务发现框架,主要用于 AWS 云环境中的中间层服务器发现、负载均衡和故障转移。作为微服务架构的核心组件,Eureka 在 Netflix 的中层基础设施中扮演着关键角色。

核心概念

概念 说明
Eureka Server 服务注册中心,负责服务实例的注册与发现
Eureka Client 服务提供者和消费者,负责注册服务和发现其他服务
InstanceInfo 服务实例信息,包含主机名、端口、状态等元数据
ApplicationInfoManager 应用信息管理器,管理服务实例的状态信息

架构设计

flowchart TD
    A[Eureka Client 服务提供者] -->|注册服务| B[Eureka Server]
    C[Eureka Client 服务消费者] -->|发现服务| B
    B -->|返回服务实例列表| C
    C -->|调用服务| A

环境准备

系统要求

  • Java 8 或更高版本
  • Gradle 构建工具
  • Tomcat 或其他 Servlet 容器(用于部署 Eureka Server)

项目结构

eureka/
├── eureka-client/          # 客户端核心模块
├── eureka-core/           # 服务端核心模块  
├── eureka-server/         # 服务器部署模块
├── eureka-examples/       # 示例代码
└── eureka-resources/      # 资源文件

快速开始

1. 构建项目

# 克隆项目
git clone https://gitcode.com/gh_mirrors/eu/eureka

# 进入项目目录
cd eureka

# 构建项目
./gradlew build

2. 部署 Eureka Server

方式一:使用 Tomcat 部署

# 复制 WAR 文件到 Tomcat
cp ./eureka-server/build/libs/eureka-server-*.war $TOMCAT_HOME/webapps/eureka.war

# 配置启动参数(在 tomcat/bin/setenv.sh 中)
JAVA_OPTS=" \
  -Deureka.waitTimeInMsWhenSyncEmpty=0 \
  -Deureka.numberRegistrySyncRetries=0"

# 启动 Tomcat
$TOMCAT_HOME/bin/startup.sh

方式二:直接运行示例

# 启动 Eureka Server
./gradlew :eureka-server:run

# 访问管理界面
# http://localhost:8080/eureka

3. 服务注册示例

创建服务提供者:

package com.example.service;

import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.EurekaInstanceConfig;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.appinfo.MyDataCenterInstanceConfig;
import com.netflix.appinfo.providers.EurekaConfigBasedInstanceInfoProvider;
import com.netflix.discovery.DefaultEurekaClientConfig;
import com.netflix.discovery.DiscoveryClient;
import com.netflix.discovery.EurekaClient;

public class ServiceProvider {
    
    private static ApplicationInfoManager applicationInfoManager;
    private static EurekaClient eurekaClient;

    public static void main(String[] args) {
        // 初始化应用信息管理器
        EurekaInstanceConfig instanceConfig = new MyDataCenterInstanceConfig();
        InstanceInfo instanceInfo = new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get();
        applicationInfoManager = new ApplicationInfoManager(instanceConfig, instanceInfo);
        
        // 初始化 Eureka 客户端
        eurekaClient = new DiscoveryClient(applicationInfoManager, new DefaultEurekaClientConfig());
        
        // 注册服务
        applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.UP);
        
        System.out.println("服务注册成功!");
        
        // 保持服务运行
        try {
            Thread.sleep(Long.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

4. 服务发现示例

创建服务消费者:

package com.example.consumer;

import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.EurekaInstanceConfig;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.appinfo.MyDataCenterInstanceConfig;
import com.netflix.appinfo.providers.EurekaConfigBasedInstanceInfoProvider;
import com.netflix.discovery.DefaultEurekaClientConfig;
import com.netflix.discovery.DiscoveryClient;
import com.netflix.discovery.EurekaClient;

public class ServiceConsumer {
    
    public static void main(String[] args) {
        // 初始化 Eureka 客户端
        EurekaInstanceConfig instanceConfig = new MyDataCenterInstanceConfig();
        InstanceInfo instanceInfo = new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get();
        ApplicationInfoManager applicationInfoManager = 
            new ApplicationInfoManager(instanceConfig, instanceInfo);
        
        EurekaClient eurekaClient = 
            new DiscoveryClient(applicationInfoManager, new DefaultEurekaClientConfig());
        
        // 发现服务
        String serviceName = "MY-SERVICE";
        InstanceInfo serviceInstance = eurekaClient.getNextServerFromEureka(serviceName, false);
        
        if (serviceInstance != null) {
            System.out.println("发现服务实例: " + serviceInstance.getHostName() + 
                             ":" + serviceInstance.getPort());
            
            // 调用服务
            callService(serviceInstance.getHostName(), serviceInstance.getPort());
        }
        
        eurekaClient.shutdown();
    }
    
    private static void callService(String host, int port) {
        // 实现服务调用逻辑
        System.out.println("调用服务: " + host + ":" + port);
    }
}

配置详解

Eureka Server 配置

eureka-server.properties 中配置:

# 服务器端口
server.port=8761

# Eureka 配置
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

# 实例配置
eureka.instance.hostname=localhost
eureka.instance.port=8761

Eureka Client 配置

在应用程序的配置文件中:

# Eureka 服务器地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

# 实例信息
eureka.instance.appname=my-service
eureka.instance.instanceId=${spring.application.name}:${spring.application.instance_id:${random.value}}
eureka.instance.preferIpAddress=true

# 心跳配置
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90

高级特性

1. 健康检查机制

Eureka 通过心跳机制监控服务实例的健康状态:

sequenceDiagram
    participant Client as Eureka Client
    participant Server as Eureka Server
    
    Client->>Server: 注册服务
    Server-->>Client: 注册成功
    loop 每30秒
        Client->>Server: 发送心跳
        Server-->>Client: 确认心跳
    end
    Note over Client,Server: 如果90秒内无心跳<br/>标记实例为DOWN

2. 自我保护模式

当 Eureka Server 在短时间内丢失过多客户端时,会进入自我保护模式:

// 配置自我保护模式
eureka.server.enable-self-preservation=true
eureka.server.renewal-percent-threshold=0.85

3. 区域和可用区支持

// 配置区域感知
eureka.client.region=us-east-1
eureka.client.availability-zones.us-east-1=us-east-1a,us-east-1b

// 配置服务端区域映射
eureka.client.service-url.us-east-1a=http://ec2-1:8761/eureka/
eureka.client.service-url.us-east-1b=http://ec2-2:8761/eureka/

最佳实践

1. 服务注册最佳实践

public class ServiceRegistrationBestPractice {
    
    @PostConstruct
    public void registerService() {
        // 先注册为 STARTING 状态
        applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.STARTING);
        
        // 执行初始化逻辑
        initializeService();
        
        // 初始化完成后改为 UP 状态
        applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.UP);
    }
    
    @PreDestroy  
    public void deregisterService() {
        // 优雅关闭:先改为 DOWN 状态
        applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.DOWN);
        
        // 等待一段时间让负载均衡器感知
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // 处理异常
        }
        
        // 关闭 Eureka 客户端
        eurekaClient.shutdown();
    }
}

2. 服务发现最佳实践

public class ServiceDiscoveryBestPractice {
    
    public InstanceInfo discoverService(String serviceName) {
        List<InstanceInfo> instances = eurekaClient.getInstancesByVipAddress(serviceName, false);
        
        if (instances.isEmpty()) {
            throw new ServiceNotFoundException("Service not found: " + serviceName);
        }
        
        // 使用负载均衡策略选择实例
        InstanceInfo selectedInstance = loadBalancer.selectInstance(instances);
        
        return selectedInstance;
    }
    
    // 简单的轮询负载均衡器
    private InstanceInfo roundRobinSelect(List<InstanceInfo> instances) {
        int index = (int) (System.currentTimeMillis() % instances.size());
        return instances.get(index);
    }
}

故障排除

常见问题及解决方案

问题 原因 解决方案
服务注册失败 网络连接问题 检查 Eureka Server URL 配置
心跳超时 网络延迟或服务繁忙 调整 lease-renewal-interval
服务发现为空 服务未注册或注册延迟 检查服务状态,等待注册完成
自我保护模式 大量服务实例下线 检查网络或调整阈值

监控和日志

# 查看 Eureka Server 状态
curl http://localhost:8761/eureka/apps

# 查看特定服务实例
curl http://localhost:8761/eureka/apps/MY-SERVICE

# 启用详细日志
logging.level.com.netflix.eureka=DEBUG
logging.level.com.netflix.discovery=DEBUG

性能优化

1. 客户端缓存配置

# 注册表获取间隔(秒)
eureka.client.registry-fetch-interval-seconds=30

# 初始注册表获取超时(秒)
eureka.client.initial-instance-info-replication-interval-seconds=40

# 缓存刷新超时(秒)
eureka.client.cache-refresh-executor-timeout-seconds=20

2. 服务器端优化

# 响应缓存过期时间(毫秒)
eureka.server.response-cache-auto-expiration-in-seconds=180

# 注册表同步线程数
eureka.server.registry-sync-retries=0

# Peer 节点更新间隔
eureka.server.peer-eureka-nodes-update-interval-ms=30000

总结

Eureka 作为一个成熟的服务发现框架,在微服务架构中提供了可靠的服务注册与发现机制。通过本教程,您应该能够:

  1. ✅ 理解 Eureka 的核心概念和架构
  2. ✅ 部署和配置 Eureka Server
  3. ✅ 实现服务的注册和发现
  4. ✅ 应用最佳实践和性能优化策略
  5. ✅ 处理常见的故障和问题

Eureka 的简单性和可靠性使其成为构建弹性微服务系统的理想选择。随着云原生技术的发展,Eureka 仍然在许多生产环境中发挥着重要作用。

提示:在实际生产环境中,建议结合 Spring Cloud Eureka 等框架使用,以获得更完善的微服务生态支持。

登录后查看全文
热门项目推荐
相关项目推荐