SpringCloud升級之路2020.0.x版-18.Eureka的客戶端核心設計和配置


本系列代碼地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford

image

Eureka 客戶端配置就是訪問 Eureka Server 的客戶端相關配置,包括 Eureka Server 地址的配置,拉取服務實例信息相關配置,當前實例注冊相關配置和 http 連接相關配置。在 Spring Cloud 中,Eureka 客戶端配置以 eureka.client 開頭,對應配置類為 EurekaClientConfigBean

其中,Eureka 客戶端有三個比較重要的定時任務,以及相關配置,這里用圖的方式給大家展示出來了:

讀取服務實例相關流程
image

定時檢查實例信息以及實例狀態並同步到 Eureka Server

image

定時心跳相關流程

image

image

可以直接指定 Eureka Server 的地址,並且,這些配置可以動態修改,並且可以配置刷新時間。例如:

eureka:
    client:
      service-url:
        # 默認eureka集群,這里必須是defaultZone,不能用-替換大寫,與其他的配置不一樣,因為實在EurekaClientConfigBean里面寫死的
        defaultZone: http://127.0.0.1:8211/eureka/
        zone1: http://127.0.0.1:8212/eureka/
        zone2: http://127.0.0.1:8213/eureka/
        zone3: http://127.0.0.1:8214/eureka/
      # 如果上面 eureka server 地址相關配置更新了,多久之后會重新讀取感知到
      eureka-service-url-poll-interval-seconds: 300

也可以通過 DNS 獲取 Eureka Server,例如:

eureka:
    client:
      # 是否使用 dns 獲取,如果指定了則通過下面的 dns 配置獲取,而不是上面的 service-url
      use-dns-for-fetching-service-urls: true
      # dns 配置
      # eureka-server-d-n-s-name: eureka.com
      # dns 配置的 eureka server 的 port
      # eureka-server-port: 80
      # dns 配置的 eureka server 的 port 后面的 uri 前綴 context
      # eureka-server-u-r-l-context: /eureka

同時,可能有不同的 Eureka Server 部署在不同的可用區域(zone)上,這里也可以配置 Eureka Client 的 zone 配置:

eureka:
    client:
      # 可用區列表,key 為 region,value 為 zone
      availability-zones:
        region1: zone1, zone2
        region2: zone3
      # 所在區域,通過這個讀取 availability-zones 獲取 zone,然后通過 zone 讀取 service-url 獲取對應的 eureka url
      # 這里的邏輯對應的類是 ConfigClusterResolver 和 ZoneAffinityClusterResolver
      region: region1
      # 如果設置為 true,則同一個 zone 下的 eureka 會跑到前面優先訪問。默認為 true
      prefer-same-zone-eureka: true

image

我們可以配置是否從 Eureka 上面拉取服務實例信息,一般本地測試的時候,可能我們不想使用 Eureka 上面的注冊實例的信息,就可以通過這個配置禁用 Eureka Client 從 Eureka 上面獲取微服務實例信息。

eureka:
    client:
      # 是否從 eureka 上面拉取實例
      fetch-registry: true

拉取服務實例信息的請求,也是可以配置是拉取壓縮信息還是完整信息,以及是否通過增量拉取獲取實例信息。Eureka 增量拉取機制實現很簡單,就是新注冊或者淘汰的實例會放入最近修改隊列,隊列中的信息會作為增量拉取的響應返回。增量拉取可能會丟失某些實例的更新,但是節省網絡流量,在網絡不好的情況下可以使用增量拉取。增量拉取中有版本控制,如果版本有差異,還是會通過全量拉取,之后再進行增量拉取。

eureka:
    client:
      # 是否禁用增量拉取,如果網絡條件不好,可以禁用,每次都會拉取全量。增量拉取中有版本控制,如果版本有差異,還是會通過全量拉取,之后再進行增量拉取。
      disable-delta: false
      # 客戶端請求頭指定服務端返回的實例信息是壓縮的信息還是完整信息,默認是完整信息
      # full, compact
      client-data-accept: full
      # 針對增量拉取,是否每次都日志差異
      log-delta-diff: true

拉取后的實例會被保存到本地緩存中,本地緩存具有過期時間:

eureka:
    client:
      # eureka client 刷新本地緩存時間
      # 默認30s
      registry-fetch-interval-seconds: 5
      # 只保留狀態為 UP 的實例,默認為 true
      filter-only-up-instances: true
      # eureka client 刷新本地緩存(定時拉取 eureka 實例列表)線程池大小,默認為 2
      cache-refresh-executor-thread-pool-size: 2
      # eureka client 刷新本地緩存(定時拉取 eureka 實例列表)線程池任務最大延遲時間,這個配置是定時拉取任務延遲(registry-fetch-interval-seconds)的倍數,默認 10 倍
      cache-refresh-executor-exponential-back-off-bound: 10

同時,在 Spring Cloud 環境中,只要是基於 spring-cloud-commons 的微服務實現(其實所有 Spring Cloud 實現都是基於這個實現的),服務發現的 Client: DiscoveryClient(同步環境) 與 ReactiveDiscoveryClient(異步環境)都是使用的 Composite 的實現,也就是內部有多種服務發現 Client,服務發現按照一定順序調用每一個服務發現 Client,這里也可以配置 Eureka Client 的順序。

eureka:
    client:
      #在spring cloud 環境中,DiscoveryClient 用的其實都是 CompositeDiscoveryClient,這個 CompositeDiscoveryClient 邏輯其實就是多個 DiscoveryClient 共存,先訪問一個,沒找到就通過下一個尋找
      #這個order決定了順序,默認為 0
      order: 0

image

我們在本地測試的時候,可能不想將本地這個實例注冊到 Eureka Server 上面,這也是可以配置的:

eureka:
    client:
      # 是否將自己注冊到 eureka 上面
      register-with-eureka: true

同時,Eureka 本身的設計中,Eureka 實例信息以及配置是可以改變的,那么多久會同步到 Eureka Server 上呢?注意這個和心跳請求不一樣,這個是可以單獨配置的:

eureka:
    client:
	  # 實例信息同定時同步到 Eureka Server 的間隔時間。每隔這么長時間,檢查實例信息(即eureka.instance配置信息)是否發生變化,如果發生變化,則同步到 Eureka Server,默認 30s
      # 主要檢查兩類信息,分別是服務地址相關信息,以及服務過期時間與刷新時間配置信息
      instance-info-replication-interval-seconds: 30
      # 實例信息同定時同步到 Eureka Server 的初始延遲時間,默認 40s
      initial-instance-info-replication-interval-seconds: 40

還有一些其他配置我們可能也用的到:

eureka:
    client:
	  # 是否在初始化的時候就注冊到 eureka,一般設置為 false,因為實例還不能正常提供服務
      should-enforce-registration-at-init: false
      # 是否在關閉的時候注銷實例,默認為 true
      should-unregister-on-shutdown: true
      # 是否對於實例狀態改變更新進行限流,默認為 true
      on-demand-update-status-change: true

image

Eureka Client 基於 Http 請求獲取服務實例信息,這里可以針對 Http 客戶端進行配置:

eureka:
    client:
      # 代理相關配置
      # proxy-host:
      # proxy-port:
      # proxy-user-name:
      # proxy-password:
      # 是否對於發往 Eureka Server 的 http 請求啟用 gzip,目前已經過期了,只要 Eureka Server 啟用了 gzip,請求就是 gzip 壓縮的
      g-zip-content: true
      # httpclient 的鏈接超時,默認 5s
      eureka-server-connect-timeout-seconds: 5
      # httpclient 的讀取超時,默認 5s
      eureka-server-read-timeout-seconds: 8
      # httpclient 的空閑連接超時,默認 30s
      eureka-connection-idle-timeout-seconds: 30
      # httpclient 的總連接數量,默認 200
      eureka-server-total-connections: 200
      # httpclient 的每個 host 的連接數量
      eureka-server-total-connections-per-host: 50
	  # tls 相關配置,默認沒有啟用
#      tls:
#        enabled: false
#        key-password:
#        key-store:
#        key-store-password:
#        key-store-type:
#        trust-store:
#        trust-store-password:
#        trust-store-type:

我們這一節詳細分析了 Eureka 的客戶端配置。下一節,我們將開始分析 Eureka Server 相關的配置。

微信搜索“我的編程喵”關注公眾號,每日一刷,輕松提升技術,斬獲各種offer


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM