SpringCloud系列第03節之註冊中心Eureka進階

自我保護模式

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

服務狀態UNKNOWN

若是把微服務的 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

相關文章
相關標籤/搜索