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
的请求头部,使其传递依赖项配置中设置的带有版本信息的头部和内容类型。如果没有此设置,这两个参数将不起作用。