Zookeeper 相依性

使用 Zookeeper 相依性

Spring Cloud Zookeeper 讓您能夠以屬性方式提供應用程式的相依性。所謂的相依性,您可以理解為註冊在 Zookeeper 中的其他應用程式,而您想要透過 OpenFeign (REST 用戶端建構器)、RestTemplateWebClient,經由 Spring Cloud Loadbalancer 呼叫這些應用程式。

您也可以使用 Zookeeper Dependency Watchers 功能來控制和監控相依性的狀態。

啟用 Zookeeper 相依性

包含 org.springframework.cloud:spring-cloud-starter-zookeeper-discovery 的相依性會啟用自動配置,進而設定 Spring Cloud Zookeeper 相依性。即使您在屬性中提供相依性,您也可以關閉相依性。若要這麼做,請將 spring.cloud.zookeeper.dependency.enabled 屬性設定為 false (預設為 true)。

設定 Zookeeper 相依性

請參考以下相依性表示法的範例

application.yml
spring.application.name: yourServiceName
spring.cloud.zookeeper:
  dependencies:
    newsletter:
      path: /path/where/newsletter/has/registered/in/zookeeper
      loadBalancerType: ROUND_ROBIN
      contentTypeTemplate: application/vnd.newsletter.$version+json
      version: v1
      headers:
        header1:
            - value1
        header2:
            - value2
      required: false
      stubs: org.springframework:foo:stubs
    mailing:
      path: /path/where/mailing/has/registered/in/zookeeper
      loadBalancerType: ROUND_ROBIN
      contentTypeTemplate: application/vnd.mailing.$version+json
      version: v1
      required: true

接下來的幾個章節將逐一介紹相依性的每個部分。根屬性名稱為 spring.cloud.zookeeper.dependencies

別名

在根屬性下方,您必須將每個相依性表示為別名。這是由於 Spring Cloud LoadBalancer 的限制,它要求應用程式 ID 必須放置在 URL 中。因此,您無法傳遞任何複雜路徑,例如 /myApp/myRoute/name)。別名是您用來取代 serviceId 的名稱,適用於 DiscoveryClientFeignRestTemplate

在先前的範例中,別名為 newslettermailing。以下範例顯示搭配 newsletter 別名的 Feign 用法

@FeignClient("newsletter")
public interface NewsletterService {
        @RequestMapping(method = RequestMethod.GET, value = "/newsletter")
        String getNewsletters();
}

路徑

路徑由 path YAML 屬性表示,並且是相依性在 Zookeeper 中註冊的路徑。如前一節所述,Spring Cloud LoadBalancer 運作於 URL 上。因此,此路徑不符合其要求。這就是 Spring Cloud Zookeeper 將別名對應到正確路徑的原因。

負載平衡器類型

負載平衡器類型由 loadBalancerType YAML 屬性表示。

如果您知道在呼叫此特定相依性時必須套用哪種負載平衡策略,您可以在 YAML 檔案中提供它,並且會自動套用。您可以選擇以下負載平衡策略之一

  • STICKY:一旦選擇,將始終呼叫該執行個體。

  • RANDOM:隨機挑選一個執行個體。

  • ROUND_ROBIN:重複且不斷地迭代執行個體。

Content-Type 範本和版本

Content-Type 範本和版本由 contentTypeTemplateversion YAML 屬性表示。

如果您在 Content-Type 標頭中對 API 進行版本控制,您不會希望將此標頭新增到每個請求中。此外,如果您想要呼叫新版本的 API,您不會想要在程式碼中四處尋找以提高 API 版本。這就是為什麼您可以提供帶有特殊 $version 佔位符的 contentTypeTemplate。該佔位符將由 version YAML 屬性的值填寫。請參考以下 contentTypeTemplate 的範例

application/vnd.newsletter.$version+json

進一步參考以下 version

v1

contentTypeTemplate 和版本的組合會為每個請求建立 Content-Type 標頭,如下所示

application/vnd.newsletter.v1+json

預設標頭

預設標頭由 YAML 中的 headers 映射表示。

有時,每次呼叫相依性都需要設定一些預設標頭。為了不在程式碼中執行此操作,您可以在 YAML 檔案中設定它們,如下列範例 headers 區段所示

headers:
    Accept:
        - text/html
        - application/xhtml+xml
    Cache-Control:
        - no-cache

headers 區段會在您的 HTTP 請求中新增 AcceptCache-Control 標頭,並帶有適當的值清單。

必要相依性

必要相依性由 YAML 中的 required 屬性表示。

如果您的應用程式在啟動時需要啟動其中一個相依性,您可以在 YAML 檔案中設定 required: true 屬性。

如果您的應用程式在啟動時無法定位必要的相依性,它會擲回例外狀況,並且 Spring Context 無法設定。換句話說,如果必要的相依性未在 Zookeeper 中註冊,則您的應用程式無法啟動。

您可以稍後在本文件中閱讀更多關於 Spring Cloud Zookeeper Presence Checker 的資訊

存根

您可以提供以冒號分隔的路徑,指向包含相依性存根的 JAR 檔案,如下列範例所示

stubs: org.springframework:myApp:stubs

其中

  • org.springframeworkgroupId

  • myAppartifactId

  • stubs 是分類器。(請注意,stubs 是預設值。)

由於 stubs 是預設分類器,因此先前的範例等於以下範例

stubs: org.springframework:myApp

配置 Spring Cloud Zookeeper 相依性

您可以設定以下屬性來啟用或停用 Zookeeper 相依性功能的各個部分

  • spring.cloud.zookeeper.dependencies:如果您未設定此屬性,則無法使用 Zookeeper 相依性。

  • spring.cloud.zookeeper.dependency.loadbalancer.enabled (預設為啟用):開啟 Zookeeper 特定的自訂負載平衡策略,包括 ZookeeperServiceInstanceListSupplier 和基於相依性的負載平衡 RestTemplate 設定。

  • spring.cloud.zookeeper.dependency.headers.enabled (預設為啟用):此屬性會註冊 FeignBlockingLoadBalancerClient,其會自動附加適當的標頭和內容類型及其版本,如相依性配置中所述。若沒有此設定,這兩個參數將無法運作。

  • spring.cloud.zookeeper.dependency.resttemplate.enabled (預設為啟用):啟用後,此屬性會修改 @LoadBalanced 註解的 RestTemplate 的請求標頭,使其傳遞標頭和內容類型以及在相依性配置中設定的版本。若沒有此設定,這兩個參數將無法運作。