我的GitHub地址:https://github.com/leebingbin/git
在使用Spring Cloud的過程當中,不免會遇到一些問題。因此對Spring Cloud的經常使用問題作一些總結。github
默認狀況下,服務註冊到Eureka Server的過程較慢。在開發或測試時,經常但願可以加速這一
過程,從而提高工做效率。spring
該問題的緣由及解決方案:bootstrap
服務的註冊涉及週期性心跳,默認30秒一次(經過客戶端配置的serviceUrl)。只有當實例、服務端和客戶端的本地緩存中的元數據都相同時,服務才被其餘客戶端發現(因此可能須要3次心跳)。可使用參數 eureka.instance.leaseRenewalInSeconds 修改時間間隔, 從而加快客戶端鏈接到其餘服務的過程。在生產環境中最好堅持使用默認值,由於在服務器內部有一些計算,它們會對續約作出假設。緩存
綜上所述,要想解決服務註冊慢的問題,只須將 eureka.instance.leaseRenewalInSeconds 設成一個更小的值。該配置用於設置 Eureka Client 向 Eureka Server 發送心跳的時間間隔, 默認是30,單位是秒。在生產環境中,建議堅持使用默認值。服務器
在開發環境下,經常但願 Eureka Server 能迅速有效地註銷已中止的微服務實例。然而,因爲 Eureka Server 清理無效節點週期長(默認90秒),以及自我保護模式等緣由,可能會遇到微服務註銷慢甚至不註銷的問題。解決方案以下:mvc
· Eureka Server 端:app
配置關閉自我保護,並按需配置 Eureka Server 清理無效節點的時間間隔。框架
eureka.server.enable-self-preservation # 設爲false, 關閉自我保護, 從而保證會註銷微服務 eureka.server.eviction-interval-timer-in-ms # 清理間隔(單位毫秒,默認是60 * 1000)
· Eureka Client 端:ide
配置開啓健康檢查, 並按需配置續約更新時間和到期時間。
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秒)
值得注意的是,這些配置僅建議開發或測試時使用,生產環境建議堅持使用默認值。
Tips: 配置實例
# Eureka Server配置 eureka: server: enable-self-preservation:false eviction-interval-timer-in-ms:4000
# Eureka Client配置 eureka: client: healthcheck: enabled:true instance: lease-expiration-duration-inseconds:30 lease-renewal-interval-in-seconds:10
· 修改Eureka的續約頻率可能會打破 Eureka 的自我保護特徵;這也意味着在生產環境中,若是想要使用 Eureka 的自我保護特性,應堅持使用默認配置。
Instance ID用於惟一標識註冊到Eureka Server 上的微服務實例。在Eureka Server 的首頁能夠直觀地看到各個微服務的InstanceID 。例如,下圖中的DESKTOP-6063U0F:CONFIG-SERVER:8273 就是Instance ID 。
在 Spring Cloud 中,服務的Instance ID 的默認值是${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}} 。固然若是想要自定義這部份內容,只須在微服務中配置 eureka.instance.instance-id 屬性便可,示例以下:
spring: application: name:movieticketing-provider-user eureka: instance: # 將 Instance ID 設置成IP: 端口的形式 instance-id:${spring.cloud.client.ipAddress}:${server.port}
這樣,就能夠將微服務movieticketing-provider-user 的Instance ID 設爲IP:端口的形式。
註冊信息 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 的問題。
Tips:
1) SpringFox 是一款基於Spring 和 Swagger 的開源的API 文檔框架,前身是 swagger-springmvc 【http://springfox.io/】。
2) Swagger 是一款很是流行的API 文檔框架,它能夠幫助咱們設計、構建、測試、RESTful 接口,也可生成 RESTful 接口文檔。【http://swagger.io/】
本文爲博主原創文章,轉載請註明出處!
https://my.oschina.net/u/3375733/blog/