#作者:Unstopabler
文章目錄
- 1. Eureka 服務啟動故障處理
- 1.1 端口占用導致啟動失敗
- 1.2 配置文件錯誤導致啟動失敗
- 1.3 依賴沖突與類加載錯誤
- 2. 服務注冊與發現異常
- 2.1 服務無法注冊到 Eureka
- 2.2 Eureka 控制臺看不到注冊的服務
- 2.3 服務注冊后立即被剔除
- 3. Eureka 集群同步問題
- 3.1 集群節點無法相互發現
- 3.2 集群數據不一致
- 3.3 集群腦裂問題
- 4. 服務續約與心跳異常
- 4.1 服務頻繁下線與上線(抖動)
- 4.2 服務續約失敗
- 4.3 服務實例狀態不一致
1. Eureka 服務啟動故障處理
1.1 端口占用導致啟動失敗
# 檢查Eureka默認端口(8761)占用情況
netstat -tulpn | grep 8761
lsof -i :8761
# 終止占用進程
kill -9 $(lsof -t -i :8761)
# 嘗試指定其他端口啟動
java -jar eureka-server.jar --server.port=8762
# 查看啟動日志定位錯誤
java -jar eureka-server.jar --debug 2>&1 | grep -i "error\|exception"
# 檢查應用配置文件
cat src/main/resources/application.yml
# 或外部配置文件
cat /etc/eureka/application.yml
1.2 配置文件錯誤導致啟動失敗
# 檢查配置文件語法(YAML格式)
yamllint src/main/resources/application.yml
# 常見配置錯誤檢查:
# 1. 縮進錯誤(使用空格而非制表符)
# 2. 集群節點URL格式錯誤
# 3. 配置項名稱拼寫錯誤(如"eureka.client.serviceUrl.defaultZone")
# 使用簡化配置測試啟動
cat > /tmp/test-eureka.yml << 'EOF'
server:port: 8761
eureka:client:registerWithEureka: falsefetchRegistry: falseserviceUrl:defaultZone: http://localhost:8761/eureka/
EOF
java -jar eureka-server.jar --spring.config.location=file:/tmp/test-eureka.yml
1.3 依賴沖突與類加載錯誤
# 查看啟動時的類沖突日志
java -jar eureka-server.jar 2>&1 | grep -i "classdefnotfound\|noclassdeffound\|conflict"
# 檢查依賴樹
mvn dependency:tree | grep -i "eureka\|netflix\|spring-cloud"
# 排除沖突依賴
# 在pom.xml中添加:
# <dependency>
# <groupId>org.springframework.cloud</groupId>
# <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
# <exclusions>
# <exclusion>
# <groupId>沖突的groupId</groupId>
# <artifactId>沖突的artifactId</artifactId>
# </exclusion>
# </exclusions>
# </dependency>
# 清理并重新構建
mvn clean package -DskipTests
java -jar target/eureka-server.jar
2. 服務注冊與發現異常
2.1 服務無法注冊到 Eureka
# 查看客戶端服務日志
tail -f /var/log/service/application.log | grep -E "eureka\|register"
# 檢查Eureka客戶端配置
grep -A 10 "eureka.client" /etc/service/application.yml
# 測試Eureka服務器可達性
curl -i http://eureka-server:8761/eureka/apps/
# 檢查客戶端網絡連接
nc -zv eureka-server 8761
telnet eureka-server 8761
# 臨時關閉客戶端防火墻測試
systemctl stop firewalld # 或ufw disable
2.2 Eureka 控制臺看不到注冊的服務
# 查看Eureka服務器日志
tail -f /var/log/eureka/server.log | grep -i "register\|cancel\|renew"
# 檢查服務實例狀態
curl -s http://eureka-server:8761/eureka/apps/<SERVICE-ID> | xmllint --format -
# 檢查服務實例的健康狀態
curl -s http://service-instance:port/health | jq .
# 檢查Eureka服務器的自我保護機制是否觸發
curl -s http://eureka-server:8761/eureka/status | jq .
# 若isSelfPreservationModeEnabled為true,可能導致服務不被剔除
2.3 服務注冊后立即被剔除
# 查看Eureka服務器的剔除日志
grep -i "evict\|expire\|cancel" /var/log/eureka/server.log
# 檢查服務實例的續約配置
grep -A 5 "eureka.instance.lease" /etc/service/application.yml
# 檢查服務實例的心跳狀態
curl -s http://eureka-server:8761/eureka/apps/<SERVICE-ID>/<INSTANCE-ID> | grep -i "lastDirtyTimestamp\|status"
# 調整續約配置(在客戶端)
cat >> /etc/service/application.yml << 'EOF'
eureka:instance:lease-renewal-interval-in-seconds: 30 # 心跳間隔lease-expiration-duration-in-seconds: 90 # 超時時間
EOF
systemctl restart service-instance
3. Eureka 集群同步問題
3.1 集群節點無法相互發現
# 查看集群節點狀態
curl -s http://eureka-server1:8761/eureka/peer/nodes | jq .
# 檢查集群配置
grep -A 5 "eureka.client.serviceUrl" /etc/eureka/application.yml
# 測試節點間網絡連通性
ping -c 3 eureka-server2
curl -i http://eureka-server2:8761/eureka/apps
# 檢查節點間的通信日志
tail -f /var/log/eureka/server.log | grep -i "replicate\|peer\|sync\|heartbeat"
# 重啟集群節點(按順序)
systemctl restart eureka-server2
# 等待同步完成后再重啟其他節點
systemctl restart eureka-server1
3.2 集群數據不一致
# 比較不同節點的服務列表
curl -s http://eureka-server1:8761/eureka/apps | sha256sum
curl -s http://eureka-server2:8761/eureka/apps | sha256sum
# 查看數據同步錯誤日志
grep -i "replication error\|sync failed" /var/log/eureka/server.log
# 檢查節點間的復制延遲
curl -s http://eureka-server1:8761/actuator/metrics/eureka.server.peer.replication.delay | jq .
# 手動觸發數據同步
curl -X POST http://eureka-server1:8761/eureka/peer/sync
# 清理節點緩存并重啟
rm -rf /tmp/eureka/*
systemctl restart eureka-server
3.3 集群腦裂問題
# 檢查各節點的集群視圖
for node in eureka-server1 eureka-server2 eureka-server3; doecho "Node $node:"curl -s http://$node:8761/eureka/peer/nodes | jq '.nodes | length'
done
# 查看網絡分區日志
grep -i "network partition\|isolation" /var/log/eureka/server.log
# 檢查節點間的網絡連接
for node in eureka-server2 eureka-server3; donc -zv eureka-server1 8761nc -zv eureka-server1 8080 # 應用端口
done
# 隔離問題節點
# 在健康節點上移除問題節點
curl -X DELETE http://eureka-server1:8761/eureka/peer/eureka-server3:8761
# 修復網絡后重新加入集群
# 在問題節點修改配置指向健康節點
sed -i 's/defaultZone: .*/defaultZone: http:\/\/eureka-server1:8761\/eureka\/,http:\/\/eureka-server2:8761\/eureka\//' /etc/eureka/application.yml
systemctl restart eureka-server3
4. 服務續約與心跳異常
4.1 服務頻繁下線與上線(抖動)
# 查看服務實例的心跳日志
tail -f /var/log/service/application.log | grep -i "heartbeat\|renew\|eureka"
# 檢查服務實例的資源使用情況
top -p $(pgrep -f service-instance)
free -h
# 檢查網絡穩定性
mtr eureka-server --report
# 調整Eureka服務器的超時配置
cat >> /etc/eureka/application.yml << 'EOF'
eureka:server:eviction-interval-timer-in-ms: 60000 # 驅逐間隔(1分鐘)enable-self-preservation: true
EOF
systemctl restart eureka-server
# 調整客戶端的心跳配置
cat >> /etc/service/application.yml << 'EOF'
eureka:instance:lease-renewal-interval-in-seconds: 10lease-expiration-duration-in-seconds: 30
EOF
systemctl restart service-instance
4.2 服務續約失敗
# 查看續約失敗日志
grep -i "renewal failed\|rejected\|404" /var/log/service/application.log
# 檢查Eureka服務器響應狀態
curl -i http://eureka-server:8761/eureka/apps/<SERVICE-ID>/<INSTANCE-ID>/renew
# 驗證服務實例的instance-id配置
grep -i "eureka.instance.instance-id" /etc/service/application.yml
# 檢查服務實例的網絡連接
curl -i http://eureka-server:8761/eureka/
# 重新注冊服務
curl -X POST http://service-instance:port/actuator/eureka/register
4.3 服務實例狀態不一致
# 查看服務實例在Eureka中的狀態
curl -s http://eureka-server:8761/eureka/apps/<SERVICE-ID> | xmllint --format - | grep -i "status"
# 查看服務實例的實際狀態
curl -s http://service-instance:port/health | jq .status
# 檢查健康檢查配置
grep -A 10 "healthcheck" /etc/service/application.yml
# 手動更新服務狀態
curl -X POST http://service-instance:port/actuator/health
# 強制服務實例重新注冊
curl -X POST http://service-instance:port/actuator/eureka/deregister
curl -X POST http://service-instance:port/actuator/eureka/register