Eureka
Eureka 是 Netflix 开发的服务注册与发现组件,采用客户端-服务器(CS)架构,包含 Eureka Server(注册中心,存储所有服务实例信息)和 Eureka Client(微服务客户端,定期向 Server 发送心跳)两部分。
适用场景:Spring Cloud 微服务架构的服务注册与发现、需要高可用的服务治理场景。
⚠️ 注意:Eureka 2.x 已停止开源,新项目推荐使用 Nacos。
核心组件
| 组件 | 说明 |
|---|---|
| Eureka Server | 服务注册中心,存储可用服务信息 |
| Eureka Client | 微服务客户端,向 Server 发送心跳 |
快速开始
服务端
- 引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>- 配置:
server.port=8761
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/- 启动类添加
@EnableEurekaServer
客户端
- 引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>- 配置:
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90
eureka.instance.ip-address=true
eureka.instance.instance-id=${spring.application.name}:${server.port}
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/核心概念
Eureka 架构包含三个核心组件:Server(注册中心)、Provider(服务提供者)和 Consumer(服务消费者)。
服务注册(Register)
服务启动时发送 POST 请求到 /eureka/apps/{APP_NAME},Server 写入注册表并同步到其他节点。
服务续约(Renew)
服务定期发送 PUT 请求(心跳机制,证明自己还活着)到 /eureka/apps/{APP_NAME}/{instanceId},默认 30 秒一次。超过 90 秒未续约则剔除。
服务剔除(Eviction)
Server 启动定时任务,默认每 60 秒扫描超过 90 秒未续约的服务并剔除。
集群部署
生产环境部署多个 Eureka Server 组成集群:
# eureka8761 配置
eureka.client.service-url.defaultZone=http://eureka8762:8762/eureka/,http://eureka8763:8763/eureka/自我保护机制
Eureka 的自我保护机制:宁可保留所有微服务,也不盲目移除健康的服务。
- 网络故障时,即使没有心跳也不会立即移除服务
- 网络恢复后,服务可以继续被消费
- 避免因网络抖动导致的服务误删
潜在问题
自我保护期间,如果服务本身已故障,消费者可能调用到已故障的服务,需要配合熔断机制使用。
安全认证
引入 security 依赖后配置账号密码:
spring.security.user.name=admin
spring.security.user.password=admin关闭 CSRF:
@Configuration
@EnableWebSecurity
public class EurekaSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
super.configure(http);
}
}常见问题处理
服务注册失败
- 检查 Eureka Server 是否正常运行
- 确认
eureka.client.service-url.defaultZone配置正确 - 检查网络连通性
自我保护误触发
- 调整阈值:
eureka.server.renewal-percent-threshold=0.85 - 增加 Eureka Server 节点数量
- 检查网络稳定性