SpringCloud Eureka 使用教程
目录
- Eureka 简介
- 环境准备
- 搭建 Eureka Server
• 3.1 Maven 依赖
• 3.2 配置文件
• 3.3 启动类注解
• 3.4 访问控制台 - 创建 Eureka Client
• 4.1 服务提供者配置
• 4.2 服务消费者配置 - Eureka 深入配置
• 5.1 自我保护模式
• 5.2 集群配置
• 5.3 健康检查
• 5.4 元数据配置
• 5.5 实例配置 - Eureka REST API
- 监控与管理
- 常见问题与解决
Eureka 简介
Eureka 是 Netflix 开源的服务发现组件,属于 Spring Cloud Netflix 项目。它提供了服务注册与发现的功能,包含两个核心组件:
• Eureka Server: 服务注册中心,提供服务注册和发现功能
• Eureka Client: 服务提供者和消费者,注册到 Eureka Server 并从中获取服务列表
Eureka 特点:
• 高可用性:支持集群部署
• 弹性:自我保护模式防止网络分区时的雪崩效应
• 易于集成:与 Spring Cloud 生态无缝集成
环境准备
• JDK 1.8 或更高版本
• Maven 3.x
• Spring Boot 2.5.x 或 2.6.x
• Spring Cloud 2020.x 或 2021.x
推荐使用 IDE:IntelliJ IDEA 或 Eclipse
搭建 Eureka Server
3.1 Maven 依赖
在 pom.xml
中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.2 配置文件
在 application.yml
中添加以下配置:
server:
port: 8761
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false # 不向 Eureka 注册自己
fetch-registry: false # 不从 Eureka 获取注册信息
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# 关闭自我保护模式(默认开启)
# eureka:
# server:
# enable-self-preservation: false
# 关闭客户端刷新缓存时间(默认30秒)
# eureka:
# client:
# registry-fetch-interval-seconds: 5
3.3 启动类注解
创建启动类并添加 @EnableEurekaServer
注解:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3.4 访问控制台
启动应用后,访问 Eureka 控制台:
http://localhost:8761
默认界面会显示"Discovering instances…",稍等片刻即可看到注册信息。
创建 Eureka Client
4.1 服务提供者配置
Maven 依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
application.yml 配置
server:
port: 8081
spring:
application:
name: service-provider
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true # 使用IP地址注册
启动类注解
@SpringBootApplication
@EnableEurekaClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
4.2 服务消费者配置
消费者配置与服务提供者类似,只需更改 spring.application.name
和端口:
server:
port: 8082
spring:
application:
name: service-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
添加 RestTemplate Bean
@Configuration
public class ConsumerConfig {
@Bean
@LoadBalanced // 启用负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
调用示例
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/call-provider")
public String callProvider() {
return restTemplate.getForObject("http://service-provider/hello", String.class);
}
}
Eureka 深入配置
5.1 自我保护模式
当短时间内大量服务心跳丢失时,Eureka Server 会进入自我保护模式,防止误删除有效服务实例。
相关配置:
eureka:
server:
enable-self-preservation: true # 默认开启
renewal-percent-threshold: 0.85 # 续约百分比阈值
自我保护模式开启条件:
• 失效实例占比超过 (numberOfRenewsPerMinExpected - numberOfRenewsPerMinThreshold) / numberOfRenewsPerMinExpected
关闭自我保护模式(不推荐在生产环境使用):
eureka:
server:
enable-self-preservation: false
5.2 集群配置
单节点配置示例
eureka:
client:
service-url:
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/,http://peer3:8763/eureka/
多节点配置(不同服务器)
server1:
eureka:
instance:
hostname: peer1
client:
service-url:
defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/
server2:
eureka:
instance:
hostname: peer2
client:
service-url:
defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/
server3:
eureka:
instance:
hostname: peer3
client:
service-url:
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
使用 Docker 部署集群
FROM openjdk:8-jdk-alpine
COPY target/eureka-server.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
启动命令:
docker run -d -p 8761:8761 --name eureka1 eureka-server
docker run -d -p 8762:8761 --name eureka2 eureka-server
docker run -d -p 8763:8761 --name eureka3 eureka-server
5.3 健康检查
默认使用 Eureka 自带健康检查,可以切换为 Spring Boot Actuator:
management:
endpoint:
health:
show-details: ALWAYS
health:
defaults:
enabled: true
配置健康检查模式:
eureka:
client:
healthcheck:
enabled: true # 开启Spring Boot健康检查
5.4 元数据配置
可以在 Eureka 中添加自定义元数据,供服务发现时使用:
eureka:
instance:
metadata-map:
zone: shanghai
version: 1.0.0
custom-info: this is custom metadata
在客户端获取元数据:
ApplicationInfoManager applicationInfoManager = ApplicationInfoManager.getInstance();
InstanceInfo instanceInfo = applicationInfoManager.getInfo();
Map<String, String> metadata = instanceInfo.getMetadata();
String zone = metadata.get("zone");
5.5 实例配置
心跳配置
eureka:
instance:
lease-renewal-interval-in-seconds: 30 # 心跳间隔,默认30秒
lease-expiration-duration-in-seconds: 90 # 租约过期时间,默认90秒
状态页面与健康检查路径
eureka:
instance:
status-page-url-path: /actuator/info
health-check-url-path: /actuator/health
Eureka REST API
Eureka 提供了丰富的 REST API 接口:
获取注册服务列表
GET /eureka/apps
获取特定服务实例
GET /eureka/apps/{appName}
注册新服务实例
POST /eureka/apps/{appName}
Content-Type: application/json
{
"instance": {
"hostName": "localhost",
"app": "service-provider",
"ipAddr": "127.0.0.1",
"port": {"$": 8081, "@enabled": "true"},
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
}
}
}
注销服务实例
DELETE /eureka/apps/{appName}/{instanceId}
完整 API 文档参考:Eureka REST Operations
监控与管理
Eureka 提供基本的管理界面,访问:
http://localhost:8761/
控制台主要功能:
• 查看所有注册服务
• 查看服务实例状态
• 手动注销服务实例
• 查看服务注册统计信息
对于生产环境监控,建议结合:
• Spring Boot Actuator
• Prometheus + Grafana
• ELK 日志系统
常见问题与解决
1. 服务无法注册到 Eureka
• 检查 Eureka Server 是否正常运行
• 检查网络连接和防火墙设置
• 验证服务配置的 Eureka Server 地址是否正确
• 检查服务端口是否被占用
2. 服务频繁上下线
• 检查服务健康状态
• 验证心跳配置是否合理
• 检查网络稳定性
• 调整租约过期时间(leaseExpirationDurationInSeconds)
3. Eureka 控制台不显示服务
• 等待一段时间(默认30秒同步周期)
• 检查服务实例元数据中的 status-page-url-path
配置
• 清除浏览器缓存或使用无痕模式访问
4. 自我保护模式问题
• 自我保护模式下会保留失效实例,可通过以下配置关闭:
eureka:
server:
enable-self-preservation: false
• 生产环境谨慎关闭自我保护模式
5. 集群同步问题
• 检查集群节点间的网络连接
• 验证各节点的 service-url
配置是否正确
• 检查各节点的时钟是否同步(建议使用 NTP 服务)
总结
Eureka 是微服务架构中重要的服务发现组件,本文介绍了:
• Eureka Server 的搭建与基本配置
• Eureka Client 的服务注册与发现
• 深入配置:自我保护模式、集群、健康检查等
• REST API 和监控管理
• 常见问题与解决方案
通过合理配置 Eureka,可以实现高效可靠的服务发现机制。在实际应用中,建议:
• 生产环境使用集群部署
• 根据业务需求调整心跳和租约配置
• 结合监控系统实现全面监控
• 定期检查和维护服务注册信息