一, Eureka常見問題
1. Eureka注冊服務慢
- 服務注冊涉及到周期性的心跳,默認30秒一次,只有當實例、服務器端和客戶端本地緩存中的元數據都相同時,服務才能被其他客戶端發現(可能需要三次心跳)。
- 可以使用參數eureka.instance.leaseRenewalintervalInSeconds修改eureka client向eureka server發送心跳間隔,從而加快客戶端連接到其他服務的過程。
在生產環境中最好堅持使用默認值,因為在服務器內部有一些計算,它們會對續約做出假設。
2. 已停止的服務節點注銷慢或者不注銷
- Eureka server清理無效節點的周期比較長(默認90秒),以及自我保護等原因,可能對服務節點注銷慢或者不注銷
- Eureka server配置關閉自我保護,並按需配置清理無效節點的間隔:
eureka:
server:
enable-self-preservation: false # 測試時關閉自我保護機制,保證不可用服務及時踢出
eviction-interval-timer-in-ms: 30000 # 清理間隔 單位是毫秒
- Eureka client端開啟健康檢查,按需配置續約更新時間和到期時間:
eureka:
client:
healthcheck:
enabled: true #開啟健康檢查(需要spring-boot-starter-actuator依賴)
instance:
lease-renewal-interval-in-seconds: 1 # 每間隔1s,向服務端發送一次心跳,證明自己依然”存活“, 默認30秒
lease-expiration-duration-in-seconds: 2 # 告訴服務端,如果我2s之內沒有給你發心跳,就代表我“死”了,將我踢出掉, 默認90秒。
注意:
這些配置一般在開發測試的時候使用,生產環境建議使用默認配置
- 自定義微服務instanceID
eureka:
instance:
instance-id: ${spring.cloud.client.ipAddress}:${server.port} # 將instance-id設置為ip:端口的形式。
二, Hystrix常見問題
1. Hystrix/feign 整合Hystrix后首次訪問失敗的問題
- Hystrix默認超時時間是1秒,首次加載的時候因為服務器緩存,或者創建連接池等原因,就會進入fallback邏輯。由於spring的懶加載機制,因此在某些機器上首次請求的時間可能大於1秒
- 解決方案一,延長Hystrix超時時間:
代碼中修改默認超時配置(改為3秒):
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
public String serverMethod() {
return null;
}
application.properties中設置默認超時時間:
1.默認:(方法上記得要加上@HystrixCommand,否則無效):
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
2.配置具體方法的超時時間
hystrix.command.serverMethod.execution.isolation.thread.timeoutInMilliseconds=3000
- 解決方案二,禁用Hystrix超時:
hystrix.command.default.execution.timeout.enabled: false - 對於feign,可以禁用feign的hystrix功能
feign.hystrix.enabled: false #比較極端,一般不建議使用
三, springcloud 問題定位思路總結
- YAML縮進是否正確:
YAML縮進不正確會導致springcloud 應用無法正常啟動或者配置文件無法加載 - 配置屬性是否正確:
- 配置屬性位置是否正確:
-應當配置在Eureka client 的屬性配置在了Eureka server
-應當配置在bootstrap.yml的屬性,寫在了application.yml中,例如:
spring.cloud.config.uri= http://...
-應當配置在application.yml的屬性,寫在了bootstrap.yml中,例如:
eureka.client.healthcheck.enabled= true
吐槽:博客園的markdown編輯器怎么這么難用
四, springcloud 升級到G版本后網關springcloud-gateway報錯 java.lang.NullPinterExcetervalue:.value 異常
經過排查發現是因為在路由轉發請求頭時沒有判斷值為null的情況導致,過濾掉head為null的情況即可解決