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
在 pom.xml
中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>2021.0.1version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
在 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
创建启动类并添加 @EnableEurekaServer
注解:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
启动应用后,访问 Eureka 控制台:
http://localhost:8761
默认界面会显示"Discovering instances…",稍等片刻即可看到注册信息。
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
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);
}
}
消费者配置与服务提供者类似,只需更改 spring.application.name
和端口:
server:
port: 8082
spring:
application:
name: service-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
@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 Server 会进入自我保护模式,防止误删除有效服务实例。
相关配置:
eureka:
server:
enable-self-preservation: true # 默认开启
renewal-percent-threshold: 0.85 # 续约百分比阈值
自我保护模式开启条件:
• 失效实例占比超过 (numberOfRenewsPerMinExpected - numberOfRenewsPerMinThreshold) / numberOfRenewsPerMinExpected
关闭自我保护模式(不推荐在生产环境使用):
eureka:
server:
enable-self-preservation: false
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/
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
默认使用 Eureka 自带健康检查,可以切换为 Spring Boot Actuator:
management:
endpoint:
health:
show-details: ALWAYS
health:
defaults:
enabled: true
配置健康检查模式:
eureka:
client:
healthcheck:
enabled: true # 开启Spring Boot健康检查
可以在 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");
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 接口:
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 日志系统
• 检查 Eureka Server 是否正常运行
• 检查网络连接和防火墙设置
• 验证服务配置的 Eureka Server 地址是否正确
• 检查服务端口是否被占用
• 检查服务健康状态
• 验证心跳配置是否合理
• 检查网络稳定性
• 调整租约过期时间(leaseExpirationDurationInSeconds)
• 等待一段时间(默认30秒同步周期)
• 检查服务实例元数据中的 status-page-url-path
配置
• 清除浏览器缓存或使用无痕模式访问
• 自我保护模式下会保留失效实例,可通过以下配置关闭:
eureka:
server:
enable-self-preservation: false
• 生产环境谨慎关闭自我保护模式
• 检查集群节点间的网络连接
• 验证各节点的 service-url
配置是否正确
• 检查各节点的时钟是否同步(建议使用 NTP 服务)
Eureka 是微服务架构中重要的服务发现组件,本文介绍了:
• Eureka Server 的搭建与基本配置
• Eureka Client 的服务注册与发现
• 深入配置:自我保护模式、集群、健康检查等
• REST API 和监控管理
• 常见问题与解决方案
通过合理配置 Eureka,可以实现高效可靠的服务发现机制。在实际应用中,建议:
• 生产环境使用集群部署
• 根据业务需求调整心跳和租约配置
• 结合监控系统实现全面监控
• 定期检查和维护服务注册信息