使用 Zookeeper 依赖项

Spring Cloud Zookeeper 使你能够提供应用程序的依赖项 作为属性。作为依赖项,您可以了解已注册的其他应用程序 在 Zookeeper 中,您希望通过 OpenFeign(REST 客户端构建器)和 Spring Cloud Loadbalancer 调用它。RestTemplateWebClient

您还可以使用 Zookeeper 依赖项观察程序功能来控制和监视 依赖项的状态。

激活 Zookeeper 依赖项

包括对 enables 的依赖 设置 Spring Cloud Zookeeper 依赖项的自动配置。即使您提供 属性中的依赖项,您可以关闭依赖项。为此,请将该属性设置为 false(默认为 )。org.springframework.cloud:spring-cloud-starter-zookeeper-discoveryspring.cloud.zookeeper.dependency.enabledtrue

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

接下来的几节将逐一介绍依赖项的每个部分。root 属性 name 是 。spring.cloud.zookeeper.dependencies

别名

在根属性下,必须将每个依赖项表示为别名。 这是由于 Spring Cloud LoadBalancer 的约束,它要求将应用程序 ID 放在 URL 中。 因此,您不能通过任何复杂的路径,例如 )。 别名是您使用的名称,而不是 for 、 或 。/myApp/myRoute/nameserviceIdDiscoveryClientFeignRestTemplate

在前面的示例中,别名是 和 。 以下示例显示了使用别名的 Feign 用法:newslettermailingnewsletter

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

路径

该路径由 YAML 属性表示,是在 Zookeeper 下注册依赖项的路径。 如上一节所述,Spring Cloud LoadBalancer 对 URL 进行操作。 因此,此路径不符合其要求。 这就是 Spring Cloud Zookeeper 将别名映射到正确路径的原因。path

负载均衡器类型

负载均衡器类型由 YAML 属性表示。loadBalancerType

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

  • STICKY:选择后,始终调用实例。

  • RANDOM:随机选择一个实例。

  • ROUND_ROBIN:一遍又一遍地迭代实例。

Content-Type模板和版本

模板和版本由 和 YAML 属性表示。Content-TypecontentTypeTemplateversion

如果在标头中对 API 进行版本控制,则不希望添加此标头 满足您的每个要求。此外,如果要调用新版本的 API,则不需要 想要在代码中漫游以提高 API 版本。这就是为什么您可以提供一个特殊的占位符。该占位符将由 YAML 属性的值填充。请考虑以下示例:Content-TypecontentTypeTemplate$versionversioncontentTypeTemplate

application/vnd.newsletter.$version+json

进一步考虑以下几点:version

v1

和 version 的组合会导致为每个请求创建一个标头,如下所示:contentTypeTemplateContent-Type

application/vnd.newsletter.v1+json

默认标头

默认标头由 YAML 中的映射表示。headers

有时,每次调用依赖项都需要设置一些默认标头。不要 在代码中执行此操作,可以在 YAML 文件中设置它们,如以下示例部分所示:headers

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

该部分导致添加 和 标头 HTTP 请求中相应的值列表。headersAcceptCache-Control

必需的依赖项

必需的依赖项由 YAML 中的属性表示。required

如果在应用程序启动时需要启动其中一个依赖项,则可以设置 YAML 文件中的属性。required: true

如果应用程序在启动期间无法本地化所需的依赖项,则会抛出 异常,并且 Spring Context 无法设置。换言之,您的应用程序不能 如果未在 Zookeeper 中注册所需的依赖项,则启动。

您可以在本文档后面阅读有关 Spring Cloud Zookeeper 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 的自定义负载均衡策略,包括基于依赖项的负载均衡设置。ZookeeperServiceInstanceListSupplierRestTemplate

  • spring.cloud.zookeeper.dependency.headers.enabled(默认启用):此属性注册一个自动将适当的标头和内容类型追加到其版本中,如依赖项配置中所示。 如果没有此设置,这两个参数将不起作用。FeignBlockingLoadBalancerClient

  • spring.cloud.zookeeper.dependency.resttemplate.enabled(默认启用):启用后,此属性将修改 -annotated 的请求标头,以便它传递具有依赖项配置中设置的版本的标头和内容类型。 如果没有此设置,这两个参数将不起作用。@LoadBalancedRestTemplate