Zookeeper 依賴項
以下主題涵蓋了如何使用 Spring Cloud Zookeeper 依賴項
使用 Zookeeper 依賴項
Spring Cloud Zookeeper 提供了將應用程式依賴項作為屬性提供的可能性。依賴項是指在 Zookeeper 中註冊的其他應用程式,您可以透過 OpenFeign(一個 REST 客戶端構建器)、RestTemplate
和 WebClient
,透過 Spring Cloud Loadbalancer 來呼叫這些應用程式。
您還可以使用 Zookeeper 依賴項監視器功能來控制和監控您的依賴項狀態。
啟用 Zookeeper 依賴項
引入 org.springframework.cloud:spring-cloud-starter-zookeeper-discovery
依賴項會啟用自動配置,從而設定 Spring Cloud Zookeeper 依賴項。即使您在屬性中提供了依賴項,您也可以將其關閉。為此,將 spring.cloud.zookeeper.dependency.enabled
屬性設定為 false
(預設為 true
)。
設定 Zookeeper 依賴項
請考慮以下依賴項表示示例
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
)。別名是您用於 DiscoveryClient
、Feign
或 RestTemplate
的名稱,用來替代 serviceId
。
在前面的示例中,別名是 newsletter
和 mailing
。以下示例展示了使用 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
模板和版本由 contentTypeTemplate
和 version
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 請求中新增帶有相應值列表的 Accept
和 Cache-Control
頭部。
必需的依賴項
必需的依賴項由 YAML 中的 required
屬性表示。
如果您的應用程式在啟動時需要某個依賴項必須處於可用狀態,您可以在 YAML 檔案中設定 required: true
屬性。
如果您的應用程式在啟動期間無法找到必需的依賴項,它將丟擲異常,並且 Spring 上下文將無法設定成功。換句話說,如果必需的依賴項未在 Zookeeper 中註冊,您的應用程式將無法啟動。
您可以在此文件的 後面部分 閱讀有關 Spring Cloud Zookeeper Presence Checker 的更多資訊。
配置 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
的請求頭部,使其傳遞依賴項配置中設定的帶有版本資訊的頭部和內容型別。如果沒有此設定,這兩個引數將不起作用。