1. 程式人生 > >Spring Cloud構建企業級匯流排-第十一部分常見問題

Spring Cloud構建企業級匯流排-第十一部分常見問題

  • 問題一:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
         答:預設情況下,如果Eureka Server在一定時間內沒有接收到某個微服務例項的心跳,Eureka Server將會登出該例項(預設90秒)。但是當網路分割槽故障發生時,微服務與Eureka Server之間無法正常通訊,以上行為可能變得非常危險了——因為微服務本身其實是健康的,此時本不應該登出這個微服務。
Eureka通過“自我保護模式”來解決這個問題——當Eureka Server節點在短時間內丟失過多客戶端時(可能發生了網路分割槽故障),那麼這個節點就會進入自我保護模式。一旦進入該模式,Eureka Server就會保護服務登錄檔中的資訊,不再刪除服務登錄檔中的資料(也就是不會登出任何微服務)。當網路故障恢復後,該Eureka Server節點會自動退出自我保護模式。綜上,自我保護模式是一種應對網路異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目登出任何健康的微服務。使用自我保護模式,可以讓Eureka叢集更加的健壯、穩定。在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保護模式。
  • 問題二:Eureka的高可用方案 上面的例子中,Eureka只有一個8761的註冊中心,那麼如何避免單點問題呢?
答:我們可以採用叢集的方式來解決。 比如現在有三臺機器:Server1、Server2和Server3.在高可用方案中,三臺機器要兩兩註冊。比如S1要向S2、S3分別進行註冊,目前他無法實現註冊的傳遞性。 這樣一來,如果Server1宕機,我們還可以繼續從Server2和3中獲取服務。
  • 問題三:為什麼不用zookeeper做註冊中心 在使用dubbo時,一般都結合zk(作為註冊中心)來使用。那為什麼SpringCloud中使用Eureka,而不是zk呢?
答:我們來比較一下,在CAP理論中,zk更看重C和P,即一致性和分割槽容錯性。但Eureka更在意的是A和P,A為高可用。zk中有master和follower區別,當進入選舉模式時,就無法正常對外提供服務。但Eureka中,叢集是對等的,地位是相同的,雖不能保證一致性,但至少可以提供註冊服務。 根據不同的業務場景,各有取捨吧。
  • 問題四:spring eurake中使用IP註冊:在開發spring cloud的時候遇到一個很奇葩的問題,就是服務向spring eureka中註冊例項的時候使用的是機器名,然後出現localhost、xxx.xx等這樣的內容,如下圖:

答:大量網上說是eureka.instance.preferIpAddress=true,但是實際上貌似這個引數並沒有起作用,最後修改C:\Windows\System32\drivers\etc\hosts檔案新增主機名對映解決了。
  • 問題五:斷路器feigh:com.netflix.discovery.shared.transport.TransportException:  Cannot execute request on any known server
解決方法:缺少配置檔案application.properties檔案
  • 問題六:Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'profile' in string value "${profile}"

    解決方法:配置檔案中檔案目錄和名字不對。分散式配置客戶端必須要bootstrap.properties檔案。spring.cloud.config.label表示配置的檔名。spring.application.nam表示檔案中key值。spring.cloud.config.label表示配置檔案上級目錄名。
  • 問題七:No label found for: trunk
 解決辦法:目錄結構有問題。
  • 問題八:如何解決Eureka Server不踢出已關停的節點的問題
     在開發過程中,我們常常希望Eureka Server能夠迅速有效地踢出已關停的節點,但是新手由於Eureka自我保護模式,以及心跳週期長的原因,常常會遇到Eureka Server不踢出已關停的節點的問題。解決方法如下:伺服器端配置:
eureka:
  server:
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 4000
客戶端配置:
eureka:
  client:
    healthcheck:
      enabled: true
  instance:
    lease-expiration-duration-in-seconds: 30 
    lease-renewal-interval-in-seconds: 10
  • 問題九:如何解決重新整理不允許:Method Not Allowed HttpRequestMethodNotSupportedException
 解決方法:沒有配置庫檔案
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>