Eureka高可用部署
2026/1/15大约 4 分钟Eureka高可用集群
Eureka 高可用部署
一、高可用架构
1.1 单点问题
单节点 Eureka Server 存在单点故障风险:
1.2 集群架构
二、集群搭建
2.1 环境准备
| 节点 | 主机名 | IP | 端口 |
|---|---|---|---|
| Eureka 1 | eureka1 | 192.168.1.101 | 8761 |
| Eureka 2 | eureka2 | 192.168.1.102 | 8762 |
| Eureka 3 | eureka3 | 192.168.1.103 | 8763 |
2.2 配置 hosts
# /etc/hosts
192.168.1.101 eureka1
192.168.1.102 eureka2
192.168.1.103 eureka32.3 Eureka Server 1 配置
# application-eureka1.yml
server:
port: 8761
spring:
application:
name: eureka-server
eureka:
instance:
hostname: eureka1
prefer-ip-address: false
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka2:8762/eureka/,http://eureka3:8763/eureka/
server:
enable-self-preservation: true
eviction-interval-timer-in-ms: 600002.4 Eureka Server 2 配置
# application-eureka2.yml
server:
port: 8762
spring:
application:
name: eureka-server
eureka:
instance:
hostname: eureka2
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka1:8761/eureka/,http://eureka3:8763/eureka/2.5 Eureka Server 3 配置
# application-eureka3.yml
server:
port: 8763
spring:
application:
name: eureka-server
eureka:
instance:
hostname: eureka3
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/2.6 启动集群
# 节点1
java -jar eureka-server.jar --spring.profiles.active=eureka1
# 节点2
java -jar eureka-server.jar --spring.profiles.active=eureka2
# 节点3
java -jar eureka-server.jar --spring.profiles.active=eureka3三、客户端配置
3.1 注册到集群
eureka:
client:
service-url:
# 配置所有 Eureka Server 地址
defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/,http://eureka3:8763/eureka/
instance:
prefer-ip-address: true3.2 客户端行为
- 客户端会向所有配置的 Server 注册
- 只从第一个可用的 Server 获取注册表
- 某个 Server 不可用时自动切换
四、Docker 部署
4.1 Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]4.2 docker-compose.yml
version: '3'
services:
eureka1:
build: .
container_name: eureka1
hostname: eureka1
ports:
- "8761:8761"
environment:
- SPRING_PROFILES_ACTIVE=eureka1
networks:
- eureka-net
eureka2:
build: .
container_name: eureka2
hostname: eureka2
ports:
- "8762:8762"
environment:
- SPRING_PROFILES_ACTIVE=eureka2
networks:
- eureka-net
eureka3:
build: .
container_name: eureka3
hostname: eureka3
ports:
- "8763:8763"
environment:
- SPRING_PROFILES_ACTIVE=eureka3
networks:
- eureka-net
networks:
eureka-net:
driver: bridge4.3 启动
docker-compose up -d五、Kubernetes 部署
5.1 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: eureka-config
data:
application.yml: |
spring:
application:
name: eureka-server
eureka:
client:
register-with-eureka: true
fetch-registry: true
server:
enable-self-preservation: true5.2 StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: eureka
spec:
serviceName: eureka
replicas: 3
selector:
matchLabels:
app: eureka
template:
metadata:
labels:
app: eureka
spec:
containers:
- name: eureka
image: eureka-server:latest
ports:
- containerPort: 8761
env:
- name: EUREKA_INSTANCE_HOSTNAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: EUREKA_CLIENT_SERVICEURL_DEFAULTZONE
value: "http://eureka-0.eureka:8761/eureka/,http://eureka-1.eureka:8761/eureka/,http://eureka-2.eureka:8761/eureka/"
volumeMounts:
- name: config
mountPath: /config
volumes:
- name: config
configMap:
name: eureka-config5.3 Headless Service
apiVersion: v1
kind: Service
metadata:
name: eureka
spec:
clusterIP: None
selector:
app: eureka
ports:
- port: 8761
targetPort: 8761六、负载均衡配置
6.1 Nginx 负载均衡
upstream eureka_cluster {
server eureka1:8761;
server eureka2:8762;
server eureka3:8763;
}
server {
listen 80;
server_name eureka.example.com;
location / {
proxy_pass http://eureka_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}6.2 客户端配置
eureka:
client:
service-url:
defaultZone: http://eureka.example.com/eureka/七、监控与告警
7.1 健康检查端点
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
endpoint:
health:
show-details: always7.2 Prometheus 监控
# prometheus.yml
scrape_configs:
- job_name: 'eureka'
metrics_path: '/actuator/prometheus'
static_configs:
- targets:
- 'eureka1:8761'
- 'eureka2:8762'
- 'eureka3:8763'7.3 告警规则
# alert.rules
groups:
- name: eureka
rules:
- alert: EurekaServerDown
expr: up{job="eureka"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Eureka Server {{ $labels.instance }} is down"八、故障转移测试
8.1 测试场景
8.2 测试步骤
- 启动三节点集群
- 注册服务到集群
- 停止其中一个节点
- 验证服务仍可正常注册和发现
- 恢复节点,验证数据同步
九、最佳实践
9.1 部署建议
| 环境 | 节点数 | 说明 |
|---|---|---|
| 开发 | 1 | 单节点即可 |
| 测试 | 2 | 基本高可用 |
| 生产 | 3+ | 推荐奇数个节点 |
9.2 配置建议
eureka:
server:
# 开启自我保护
enable-self-preservation: true
# 续约阈值
renewal-percent-threshold: 0.85
# 剔除间隔
eviction-interval-timer-in-ms: 60000
instance:
# 使用 IP 注册
prefer-ip-address: true
# 心跳间隔
lease-renewal-interval-in-seconds: 30
# 过期时间
lease-expiration-duration-in-seconds: 90十、总结
高可用要点:
- 至少 3 个节点:保证容错能力
- 互相注册:节点间数据同步
- 客户端多地址:自动故障转移
- 监控告警:及时发现问题
