Eureka 在設計時,認爲分佈式環境的網絡是不可靠的,可能會出現網絡緣由致使 EurekaServer 沒有收到實例的心跳git
而這卻並不能說明實例就宕了,因此 EurekaServer 缺省會打開保護模式,它主要是網絡分區場景下的一種保護github
一旦進入保護模式,EurekaServer 將會嘗試保護其服務註冊表中的信息,再也不刪除裏面的數據(即不會註銷任何微服務)spring
相關介紹,詳見:https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communicationbootstrap
在這種機制下,它仍然鼓勵客戶端再去嘗試調用這個所謂 down 狀態的實例,若確實調用失敗,那麼斷路器就派上用場了網絡
關於斷路器,在接下來的系列文章中,我會詳細介紹並演示app
經過修改註冊中心的配置文件 application.yml,便可打開或關閉註冊中心的自我保護模式分佈式
eureka: server: enable-self-preservation: false # 關閉自我保護模式(缺省爲打開)
自我保護模式打開時,已關停節點是會一直顯示在 Eureka 首頁的spring-boot
關閉自我保護模式後,因爲其默認的心跳週期比較長等緣由,要過一下子纔會發現已關停節點被自動踢出了微服務
若想盡快的及時踢出,那就只有修改默認的心跳週期參數了,以下所示測試
註冊中心的配置文件 application.yml 須要修改的地方爲
eureka: server: enable-self-preservation: false # 關閉自我保護模式(缺省爲打開) eviction-interval-timer-in-ms: 1000 # 續期時間,即掃描失效服務的間隔時間(缺省爲60*1000ms)
微服務的配置文件 application.yml 須要修改的地方爲
eureka: instance: lease-renewal-interval-in-seconds: 5 # 心跳時間,即服務續約間隔時間(缺省爲30s) lease-expiration-duration-in-seconds: 15 # 發呆時間,即服務續約到期時間(缺省爲90s) client: healthcheck: enabled: true # 開啓健康檢查(依賴spring-boot-starter-actuator)
關於續期、心跳、發呆時間的關係,詳見上一篇文章中的有關分析:https://jadyer.cn/2017/01/16/springcloud-eureka/
注意:更改 Eureka Server 的更新頻率將打破註冊中心的的自我保護功能
生產環境不建議自定義這些配置,詳見https://github.com/spring-cloud/spring-cloud-netflix/issues/373
修改微服務的 eureka.instance.lease-renewal-interval-in-seconds 參數(即心跳時間),即可解決此問題
詳見:http://cloud.spring.io/spring-cloud-static/Camden.SR4/#_why_is_it_so_slow_to_register_a_service
若是把微服務的 eureka.client.healthcheck.enabled 屬性配置在 bootstrap.yml 裏面,可能會引發一些不良反應
好比,實際測試發現,Eureka 首頁顯示的服務狀態,本應是 UP(1),卻變成大紅色的粗體 UNKNOWN(1)
Tips:bootstrap.yml 一般會在鏈接 Spring Cloud Config 搭建的配置中心時使用,接下來的本系列文章中會有介紹和演示
Eureka 首頁顯示的微服務名默認爲:機器主機名:應用名稱:應用端口
也就是:${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}
咱們也能夠修改微服務的配置文件,定製它註冊到註冊中心時顯示的名字,以下所示
eureka: instance: # instance-id: ${spring.application.name} # 修改顯示的微服務名爲:應用名稱 instance-id: ${spring.cloud.client.ipAddress}:${server.port} # 修改顯示的微服務名爲:IP:端口
一樣能夠知道,兩個相同的服務(端口不一樣),若是註冊時設置的都是 eureka.instance.instance-id=${spring.application.name}
那麼 Eureka 首頁只會看到一個服務名字,而沒法區分有幾個實例註冊上來了(由於註冊上來的實例名都是相同的),這是要注意的
既然微服務顯示的名稱容許修改,那麼其對應的點擊連接,也是能夠修改的
一樣的,仍是修改微服務的配置文件,以下所示
eureka: instance: # ip-address: 192.168.6.66 # 只有prefer-ip-address=true時纔會生效 prefer-ip-address: true # 設置微服務調用地址爲IP優先(缺省爲false)
Eureka 首頁顯示的微服務調用地址,默認是這樣的:http://jadyer-pc:2100/info
而在設置 prefer-ip-address=true 以後,調用地址會變成:http://10.16.18.95:2100/info
這時若再設置 ip-address=192.168.6.66,則調用地址會變成:http://192.168.6.66:2100/info