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_,Feign
或RestTemplate
的 serviceId。
在上述示例中,别名是newsletter
和mailing
。 使用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
由contentTypeTemplate
和version
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 请求中添加Accept
和Cache-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
annotatedRestTemplate
的请求 headers,以便它通过 headers 和 content type 并在依赖_seiguration 中设置 version。如果这两个参数的设置无法运行。