Zookeeper 依賴項

使用 Zookeeper 依賴項

Spring Cloud Zookeeper 提供了將應用程式依賴項作為屬性提供的可能性。依賴項是指在 Zookeeper 中註冊的其他應用程式,您可以透過 OpenFeign(一個 REST 客戶端構建器)、RestTemplateWebClient,透過 Spring Cloud Loadbalancer 來呼叫這些應用程式。

您還可以使用 Zookeeper 依賴項監視器功能來控制和監控您的依賴項狀態。

啟用 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)。別名是您用於 DiscoveryClientFeignRestTemplate 的名稱,用來替代 serviceId

在前面的示例中,別名是 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 和 version 的組合將為每個請求生成一個 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 上下文將無法設定成功。換句話說,如果必需的依賴項未在 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 的請求頭部,使其傳遞依賴項配置中設定的帶有版本資訊的頭部和內容型別。如果沒有此設定,這兩個引數將不起作用。