72. Zookeeper 依赖关系

72.1 使用 Zookeeper 依赖项

Spring Cloud Zookeeper 使您可以将 application 的依赖项作为 properties 提供。作为依赖项,您可以理解在 Zookeeper 中注册的其他应用程序,以及您希望通过假装(REST client 构建器)和Spring RestTemplate调用的应用程序。

您还可以从 Zookeeper Dependency Watchers 功能中受益,该功能允许您控制和监视依赖项的 state,并决定如何处理它。

72.2 如何激活 Zookeeper 依赖项

  • 包含对org.springframework.cloud:spring-cloud-starter-zookeeper-discovery的依赖将启用 auto-configuration,这将设置 Spring Cloud Zookeeper 依赖项。

  • 如果必须正确设置spring.cloud.zookeeper.dependencies部分 - 请查看后续部分以获取更多详细信息,然后 feature 为 active

  • 即使您在 properties 中提供了依赖项,也可以关闭依赖项。只需将 property spring.cloud.zookeeper.dependency.enabled设置为 false(默认为true)。

72.3 设置 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

现在让我们逐个完成依赖的每个部分。根 property name 是spring.cloud.zookeeper.dependencies

72.3.1 别名

在根 property 下面,由于 Ribbon 的约束,你必须通过别名来表示每个依赖项(application id 必须放在 URL 中,因此你不能传递像/foo/bar/name 这样的复杂路径)。别名将是您将使用的 name,而不是_I_,FeignRestTemplate的 serviceId。

在上述示例中,别名是newslettermailing。 使用newsletter的 Feign 用法示例如下:

@FeignClient("newsletter")
public interface NewsletterService {
        @RequestMapping(method = RequestMethod.GET, value = "/newsletter")
        String getNewsletters();
}

72.3.2 路径

path yaml property 代表。

Path 是在 Zookeeper 下注册依赖项的路径。就像 Ribbon 在 URL 上运行之前所呈现的那样,这条路径不符合其要求。这就是为什么 Spring Cloud Zookeeper maps 将别名转换为正确的路径。

72.3.3 负载均衡器类型

loadBalancerType yaml property 代表。

如果您知道在调用此特定依赖项时必须应用哪种负载平衡策略,那么您可以在 yaml 文件中提供它,它将自动应用。您可以选择以下负载平衡策略之一

  • STICKY - 一旦被选中,实例将始终被调用

  • 随机 - 随机选择一个实例

  • ROUND_ROBIN - 一遍又一遍地遍历实例

72.3.4 Content-Type 模板和 version

contentTypeTemplateversion yaml property 代表。

如果您通过Content-Type标头 version 您的 api,那么您不希望将此标头添加到您的每个请求中。此外,如果您想调用 API 的新 version,您不希望在 code 周围漫游以提升 API version。这就是为什么你可以为contentTypeTemplate提供一个特殊的$version占位符。该占位符将由version yaml property 的 value 填充。我们来看一个 example。

拥有以下contentTypeTemplate

application/vnd.newsletter.$version+json

以及version

v1

将导致为每个请求设置Content-Type标头:

application/vnd.newsletter.v1+json

72.3.5 默认 headers

由 yaml 中的headers map 表示

有时每次调用依赖项都需要设置一些默认的 headers。在 code 中不要在 code 中执行此操作,您可以在 yaml 文件中设置它们。拥有以下headers部分:

headers:
    Accept:
        - text/html
        - application/xhtml+xml
    Cache-Control:
        - no-cache

导致在 HTTP 请求中添加AcceptCache-Control headers 以及适当的值列表。

72.3.6 强制性依赖

由 yll 中的required property 代表

如果您的 application 启动时需要启动其中一个依赖项并运行 running,那么在 yaml 文件中设置required: true property 就足够了。

如果你的 application 在 boot time 期间无法本地化所需的依赖项,它将抛出 exception 并且 Spring Context 将无法设置。换句话说,如果在 Zookeeper 中未注册所需的依赖项,则 application 将无法启动。

您可以在以下部分中阅读有关 Spring Cloud Zookeeper Presence Checker 的更多信息。

72.3.7 存根

您可以为包含依赖项存根的 JAR 提供冒号分隔的路径。 例

stubs: org.springframework:foo:stubs

意味着对于特定的依赖项可以在以下位置找到:

  • groupId:org.springframework

  • artifactId:foo

  • 分类器:stubs - 这是默认的 value

这实际上等于

stubs: org.springframework:foo

因为stubs是默认分类器。

72.4 配置 Spring Cloud Zookeeper 依赖项

您可以设置一堆 properties 来启用/禁用 Zookeeper Dependencies 功能的部分。

  • spring.cloud.zookeeper.dependencies - 如果你没有设置这个 property,你将不会受益于 Zookeeper 依赖项

  • spring.cloud.zookeeper.dependency.ribbon.enabled(默认情况下启用) - Ribbon 需要显式 global configuration 或特定的依赖项。通过打开此 property 运行时负载平衡策略可以解决问题,您可以从 Zookeeper 依赖项的loadBalancerType部分中获利。需要此 property 的 configuration 具有LoadBalancerClient的_impleration,它委托给下一个项目符号中的ILoadBalancer

  • spring.cloud.zookeeper.dependency.ribbon.loadbalancer(默认启用) - 由于这个 property,自定义ILoadBalancer知道传递给 Ribbon 的 URI 部分实际上可能是必须在 Zookeeper 中解析为正确路径的别名。如果没有此 property,您将无法在嵌套的 paths 下注册 applications。

  • spring.cloud.zookeeper.dependency.headers.enabled(默认情况下启用) - 此 property 会注册这样一个RibbonClient,它会自动添加适当的 headers 和内容类型以及 version,如依赖性 configuration 中所示。没有这两个参数的设置将无法运行。

  • spring.cloud.zookeeper.dependency.resttemplate.enabled(默认情况下启用) - 启用时将修改@LoadBalanced annotated RestTemplate的请求 headers,以便它通过 headers 和 content type 并在依赖_seiguration 中设置 version。如果这两个参数的设置无法运行。