spring cloud eureka常見問題

一、Eureka沒有註銷過期的實例問題

1.方案一

Eureka 通過心跳續約機制來維持和其他實例的通信。實例每30秒會向Eureka Server發送一次心跳,若Eureka Server (默認)90秒內沒有收到實例的心跳,就會註銷該實例。
很有可能因爲註銷的時間沒有過,導致過期微服務依然顯示在Eureka註冊列表,可以多等一段時間。

修改實例續約發送的時間及註銷時間

#客戶端配置
eureka:
  instance:
    lease-renewal-interval-in-seconds: 1		#每一秒發送一次續約
    lease-expiration-duration-in-seconds: 2		#兩秒沒有收到續約將其註銷

注意:正式環境使用Eureka 默認配置即可

2.方案二

若長時間Eureka依然沒有註銷已過期的實例,那就是Eureka的自我保護機制作祟了。
上文所講Eureka會將90秒內沒有心跳的實例註銷掉。在一些特殊情況下網絡發生故障時,Eureka與實例無法正常通信,接收不到心跳續約就可能把健康的實例註銷掉。爲了應對此類問題,Eureka可通過’'自我保護模式"來解決這個問題。
自我保護機制:在短時間內Eureka丟失多個實例時就會開啓自我保護機制(15分鐘內丟失85%的實例續約就會開啓)
自我保護機制Netflix的官方解釋:
https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication

在開發環境中爲了快速測試可以將Eureka的自我保護機制手動關閉,正式環境推薦默認打開(保護服務的健壯性)
關閉方式:在Eureka Server 配置文件中添加eureka.server.enable-self-preservation: false配置即可關閉保護機制

#服務端配置
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:9100/eureka/
  server:
    enable-self-preservation: false			#保護機制

關閉保護機制之後,過期的實例就會在90秒之後被註銷掉。查看Eureka實例註冊頁還會有關閉保護機制的提示
在這裏插入圖片描述

二、請求註冊在Eureka服務中的Zuul網關,Zuul服務請求轉發失敗問題

在接到項目後,經過商量決定使用spring cloud全家桶作爲服務架構。我立馬搭建了一個Eureka服務和Zuul網關服務以及一個系統子服務。在調試過程中(請求註冊在Eureka中的Zuul服務轉發系統子服務)提示轉發錯誤。

錯誤截圖
在這裏插入圖片描述
在排查老半天,發現Zuul的配置文件中配置了

eureka:
  client:
    allow-redirects: false    
    fetch-registry: false     
    service-url:
      defaultZone: http://127.0.0.1:9100/eureka/

allow-redirects:指示服務器是否可以將客戶端請求重定向到備份服務器/集羣
fetch-registry:指示該客戶端是否應從eureka服務器獲取eureka註冊表信息

將配置文件allow-redirects fetch-registry值改爲true

eureka:
  client:
    allow-redirects: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:9100/eureka/

再次請求即解決該問題
在這裏插入圖片描述
複製配置文件粗心大意了,真是粗心害死人…

三、多雲服務器部署微服務,請求不到註冊到Eureka中的實例問題

這個問題需要了解Eureka的服務註冊機制,Eureka默認註冊的微服務所在服務器的機器名而非ip地址。在同一局域網內微服務的訪問是沒問題的,但在多個雲上服務環境中就會出現訪問不到的問題。

如下圖,點擊註冊到Eureka的微服務。訪問路徑爲:機器名+端口號
在這裏插入圖片描述
解決方案:
在需要註冊到Eureka的微服務配置文件中,加上eureka.instance.prefer-ip-address: true配置。會將註冊到Eureka的機器名改成ip地址。

eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
     defaultZone: http://*.*.*.222:9000/eureka/
  instance:
    prefer-ip-address: true

完成以上操作之後,點擊註冊到Eureka微服務。訪問路徑改爲:ip+端口號
在這裏插入圖片描述
通過上述操作,問題就應該解決掉了。
但上圖顯示還是訪問失敗,這時候就需要檢查微服務所在的服務器的網絡配置信息了。

登陸服務所在服務器執行ifconfig -a命令。查看到阿里雲服務器網卡地址爲:172.26.47.206,與註冊到Eureka中的信息一致。172.26.*.*很明顯是一個內網地址,這就是換成ip+port還無法訪問的原因
在這裏插入圖片描述
補充:存在多張網卡的服務器可能會出現此類問題,可以通過配置文件指定實例綁定服務器的指定ip。
spring.cloud.inetutils.ignored-interfaces: - docker0 -veth.*配置忽略docker0網卡以及veth開頭的所有網卡
spring.cloud.inetutils.preferredNetworks: - 192.168 - 10.0指定使用的網絡地址
但在極端情況下,如本次案例,阿里雲服務器網卡綁定內部局域網地址,沒有綁定外網ip的網卡。這樣只能通過最粗暴的方式———配置文件中直接指定服務器的外網ip(詳情請看下文)
當服務器的外網地址被修改,該實例配置文件所指定的ip也要做對應的修改

解決方案:
在需要註冊到Eureka的微服務配置文件中,加上以下配置
指定服務器的外網ip地址
eureka.instance.ip-address: 39.*.*.*
指定註冊到Eureka的顯示格式(默認:機器名+應用名+端口)
eureka.instance.instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port}

eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
     defaultZone: http://39.*.*.*:9100/eureka/
  instance:
    prefer-ip-address: true
    instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port}
    ip-address: 39.*.*.*

啓動服務再查看Eureka註冊列表查看,點擊服務連接可以正常訪問該服務
在這裏插入圖片描述這樣就解決了多雲服務器環境下,訪問不到Eureka列表中的微服務的問題

(以上問題如按此方案沒有解決,歡迎留言。可以共同研究解決)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章