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)。別名是您代替 serviceId 用於 DiscoveryClient、Feign 或 RestTemplate 的名稱。
在前面的示例中,別名是 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 和版本的組合導致為每個請求建立 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 Context 無法設定。換句話說,如果所需的依賴項未在 Zookeeper 中註冊,您的應用程式將無法啟動。
您可以在本文件後面閱讀更多關於 Spring Cloud Zookeeper 存在檢查器的資訊。
配置 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的請求頭,使其傳遞依賴配置中設定的帶有版本的頭和內容型別。如果沒有此設定,這兩個引數將不起作用。