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 作为一个成熟的服务发现框架,在微服务架构中提供了可靠的服务注册与发现机制。通过本教程,您应该能够:
- ✅ 理解 Eureka 的核心概念和架构
- ✅ 部署和配置 Eureka Server
- ✅ 实现服务的注册和发现
- ✅ 应用最佳实践和性能优化策略
- ✅ 处理常见的故障和问题
Eureka 的简单性和可靠性使其成为构建弹性微服务系统的理想选择。随着云原生技术的发展,Eureka 仍然在许多生产环境中发挥着重要作用。
提示:在实际生产环境中,建议结合 Spring Cloud Eureka 等框架使用,以获得更完善的微服务生态支持。
登录后查看全文
热门项目推荐
相关项目推荐
kernelopenEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。C0115
let_datasetLET数据集 基于全尺寸人形机器人 Kuavo 4 Pro 采集,涵盖多场景、多类型操作的真实世界多任务数据。面向机器人操作、移动与交互任务,支持真实环境下的可扩展机器人学习00
mindquantumMindQuantum is a general software library supporting the development of applications for quantum computation.Python059
PaddleOCR-VLPaddleOCR-VL 是一款顶尖且资源高效的文档解析专用模型。其核心组件为 PaddleOCR-VL-0.9B,这是一款精简却功能强大的视觉语言模型(VLM)。该模型融合了 NaViT 风格的动态分辨率视觉编码器与 ERNIE-4.5-0.3B 语言模型,可实现精准的元素识别。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
487
3.61 K
Ascend Extension for PyTorch
Python
298
332
暂无简介
Dart
738
177
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
272
113
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
865
467
仓颉编译器源码及 cjdb 调试工具。
C++
149
880
React Native鸿蒙化仓库
JavaScript
296
343
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
65
20
Dora SSR 是一款跨平台的游戏引擎,提供前沿或是具有探索性的游戏开发功能。它内置了Web IDE,提供了可以轻轻松松通过浏览器访问的快捷游戏开发环境,特别适合于在新兴市场如国产游戏掌机和其它移动电子设备上直接进行游戏开发和编程学习。
C++
52
7