76. Zookeeper 依赖关系
以下主题介绍了如何使用 Spring Cloud Zookeeper 依赖项:
76.1 使用 Zookeeper 依赖项
Spring Cloud Zookeeper 使您可以将 application 的依赖项作为 properties 提供。作为依赖项,您可以了解在 Zookeeper 中注册的其他应用程序以及您希望通过假装(REST client 构建器)和Spring RestTemplate调用的其他应用程序。
您还可以使用 Zookeeper Dependency Watchers 功能来控制和监视依赖项的 state。
76.2 激活 Zookeeper 依赖项
包含对org.springframework.cloud:spring-cloud-starter-zookeeper-discovery
的依赖启用自动配置_set Spring Cloud Zookeeper Dependencies。即使您在 properties 中提供依赖项,也可以关闭依赖项。为此,请将spring.cloud.zookeeper.dependency.enabled
property 设置为 false(默认为true
)。
76.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
。
76.3.1 别名
在根 property 下面,您必须将每个依赖项表示为别名。这是由于 Ribbon 的约束,它要求将 application ID 放在 URL 中。因此,您无法传递任何复杂的路径,例如/myApp/myRoute/name
)。别名是您使用的 name,而不是DiscoveryClient
,DiscoveryClient
,Feign
或RestTemplate
。
在前面的示例中,别名是newsletter
和mailing
。以下 example 显示 Feign 使用newsletter
别名:
@FeignClient("newsletter")
public interface NewsletterService {
@RequestMapping(method = RequestMethod.GET, value = "/newsletter")
String getNewsletters();
}
76.3.2 路径
该路径由path
YAML property 表示,并且是在 Zookeeper 下注册依赖项的路径。如上一节中所述,Ribbon 对 URL 进行操作。因此,此路径不符合其要求。这就是为什么 Spring Cloud Zookeeper maps 将别名转换为正确的路径。
76.3.3 负载均衡器类型
负载均衡器类型由loadBalancerType
YAML property 表示。
如果您知道在调用此特定依赖项时必须应用哪种 load-balancing 策略,则可以在 YAML 文件中提供它,并自动应用它。您可以选择以下负载平衡策略之一:
-
STICKY:一旦被选中,实例总是被调用。
-
随机:随机选取一个实例。
-
ROUND_ROBIN:一遍又一遍地迭代实例。
76.3.4 Content-Type 模板和 Version
Content-Type
模板和 version 由contentTypeTemplate
和version
YAML properties 表示。
如果您在Content-Type
标头中 version 您的 API,则不希望将此标头添加到每个请求中。此外,如果您想调用 API 的新 version,您不希望在 code 周围漫游以提升 API version。这就是为什么你可以为contentTypeTemplate
提供一个特殊的$version
占位符。该占位符将由version
YAML property 的 value 填充。考虑一下contentTypeTemplate
的以下示例:
application/vnd.newsletter.$version+json
进一步考虑以下version
:
v1
contentTypeTemplate
和 version 的组合导致为每个请求创建Content-Type
标头,如下所示:
application/vnd.newsletter.v1+json
76.3.5 默认 Headers
默认 headers 由 YAML 中的headers
map 表示。
有时,每次调用依赖项都需要设置一些默认的 headers。要在 code 中不这样做,您可以在 YAML 文件中设置它们,如下面的 example headers
部分所示:
headers:
Accept:
- text/html
- application/xhtml+xml
Cache-Control:
- no-cache
该headers
部分导致在 HTTP 请求中添加Accept
和Cache-Control
headers 以及适当的值列表。
76.3.6 必需的依赖项
所需的依赖项由 YAML 中的required
property 表示。
如果在 application 引导时需要启用某个依赖项,则可以在 YAML 文件中设置required: true
property。
如果 application 无法在 boot time 期间本地化所需的依赖项,则会抛出 exception,并且 Spring Context 无法设置。换句话说,如果未在 Zookeeper 中注册所需的依赖项,则 application 无法启动。
您可以阅读有关 Spring Cloud Zookeeper Presence Checker 稍后在本文档中的更多信息。
76.3.7 存根
您可以提供包含依赖项存根的 JAR 的 colon-separated 路径,如下面的示例所示:
stubs: org.springframework:myApp:stubs
哪里:
-
org.springframework
是groupId
。 -
myApp
是artifactId
。 -
stubs
是分类器。 (注意stubs
是默认的 value.)
因为stubs
是默认分类器,所以前面的 example 等于以下 example:
stubs: org.springframework:myApp
76.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 和内容类型,如 Dependency configuration 中所示。没有此设置,这两个参数不起作用。 -
spring.cloud.zookeeper.dependency.resttemplate.enabled
(默认情况下启用):启用时,此 property 会修改@LoadBalanced
-annotatedRestTemplate
的请求 headers,使其在依赖 configuration 中使用 version 设置传递 headers 和 content type。没有此设置,这两个参数不起作用。