跳到主要内容

Zookeeper 依赖项

TranslateGemma 中英对照 Zookeeper Dependencies

以下主题涵盖如何使用 Spring Cloud Zookeeper 依赖项:

使用 Spring Cloud 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 依赖检查器 [dependency-watcher.md#spring-cloud-zookeeper-dependency-watcher-presence-checker] 的信息。

占位符​

你可以提供一个冒号分隔的路径,指向包含依赖项存根的 JAR 文件,如下例所示:

stubs: org.springframework:myApp:stubs

哪里:

  • org.springframework 是 groupId。

  • myApp 是 artifactId。

  • 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 的请求标头,以便传递带有在依赖项配置中设置的版本号的标头和内容类型。如果没有此设置,则这两个参数将不起作用。