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 等框架使用,以获得更完善的微服务生态支持。
登录后查看全文
热门项目推荐
相关项目推荐
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
最新内容推荐
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
532
3.74 K
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
336
178
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
886
596
Ascend Extension for PyTorch
Python
340
404
暂无简介
Dart
771
191
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
12
1
openJiuwen agent-studio提供零码、低码可视化开发和工作流编排,模型、知识库、插件等各资源管理能力
TSX
986
247
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
416
4.21 K
React Native鸿蒙化仓库
JavaScript
303
355