天天看點

JAVA 多使用者商城系統b2b2c-Spring Cloud常見問題與總結(一)

在使用Spring Cloud的過程中,難免會遇到一些問題。是以對Spring Cloud的常用問題做一些總結。

一、Eureka常見問題

1.1 Eureka 注冊服務慢

預設情況下,服務注冊到Eureka Server的過程較慢。在開發或測試時,常常希望能夠加速這一

過程,進而提升工作效率。

該問題的原因及解決方案:

服務的注冊涉及周期性心跳,預設30秒一次(通過用戶端配置的serviceUrl)。隻有當執行個體、服務端和用戶端的本地緩存中的中繼資料都相同時,服務才被其他用戶端發現(是以可能需要3次心跳)。可以使用參數 eureka.instance.leaseRenewalInSeconds 修改時間間隔, 進而加快用戶端連接配接到其他服務的過程。在生産環境中最好堅持使用預設值,因為在伺服器内部有一些計算,它們會對續約做出假設。

綜上所述,要想解決服務注冊慢的問題,隻須将  eureka.instance.leaseRenewalInSeconds 設成一個更小的值。該配置用于設定 Eureka Client 向 Eureka Server 發送心跳的時間間隔, 預設是30,機關是秒。在生産環境中,建議堅持使用預設值。

1.2 已停止的微服務節點登出慢或不登出

在開發環境下,常常希望 Eureka Server 能迅速有效地登出已停止的微服務執行個體。然而,由于 Eureka Server 清理無效節點周期長(預設90秒),以及自我保護模式等原因,可能會遇到微服務登出慢甚至不登出的問題。解決方案如下:

 · Eureka Server 端:

配置關閉自我保護,并按需配置 Eureka Server 清理無效節點的時間間隔。

eureka.server.enable-self-preservation
# 設為false, 關閉自我保護, 進而保證會登出微服務
 
eureka.server.eviction-interval-timer-in-ms
# 清理間隔(機關毫秒,預設是60 * 1000)           

Eureka Client 端:

配置開啟健康檢查, 并按需配置續約更新時間和到期時間。

eureka.client.healthcheck.enabled
# 設為true,開啟健康檢查(需要spring-boot-starter-actuator 依賴)
 
eureka.instance.lease-renewal-interval-in-seconds
# 續約更新時間間隔(預設是30秒)
 
eureka.instance.lease-expiration-duration-in-seconds
# 續約到期時間(預設90秒)           

值得注意的是,這些配置僅建議開發或測試時使用,生産環境建議堅持使用預設值。

1.3 Eureka 的 UNKNOWN 問題總結與解決

注冊資訊 UNKNOWN ,是新手常會遇到的問題。但往往很多新手,并不清楚有兩種 UNKNOWN 的情況,一種是應用名稱 UNKNOWN,另一種是應用狀态 UNKNOWN 。

  1)應用名稱UNKNOWN

應用名稱UNKNOWN 顯然不合适,首先是微服務的名稱不夠語義化,無法直覺看出這是哪個微服務;更重要的是,我們常常使用應用名稱消費對應微服務的接口。

一般來說,有兩種情況會導緻該問題的發生:

· 未配置spring.application.name 或者 eureka.instance.appname 屬性。如果這兩個屬性均不配置,就會導緻應用名稱 UNKNOWN 的問題。

· 某些舊版本的SpringFox 會導緻該問題,例如 SpringFox 2.6.0 。建議使用SpringFox 2.6.1或更新版本。

 2) 微服務執行個體狀态UNKNOWN

微服務執行個體狀态UNKNOWN 同樣很麻煩。一般來講,隻會請求狀态是 UP 的微服務。該問題一般由健康檢查導緻。

eureka.client.healthcheck.enabled=true必須設定在application.yml中,而不能設定在bootstrap.yml 中,否則一些場景下會導緻應用狀态 UNKNOWN 的問題。

JAVA 多使用者商城系統b2b2c