78. Zookeeper Dependencies
以下主题介绍了如何使用 Spring Cloud Zookeeper 依赖项:
78.1 使用 Zookeeper 依赖关系
Spring Cloud Zookeeper 使您可以将应用程序的依赖项作为属性提供。作为依赖项,您可以了解在 Zookeeper 中注册的其他应用程序,并希望通过Feign(RESTClient 端构建器)和Spring RestTemplate调用它们。
您还可以使用 Zookeeper 依赖关系观察器功能来控制和监视依赖关系的状态。
78.2 激活 Zookeeper 依赖关系
在org.springframework.cloud:spring-cloud-starter-zookeeper-discovery
上包含依赖项将启用自动配置,以设置 Spring Cloud Zookeeper 依赖项。即使您在属性中提供了依赖关系,也可以关闭依赖关系。为此,请将spring.cloud.zookeeper.dependency.enabled
属性设置为 false(默认为true
)。
78.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
接下来的几节将逐一遍历依赖项的每个部分。根属性名称为spring.cloud.zookeeper.dependencies
。
78.3.1 Aliases
在 root 属性下,您必须将每个依赖项表示为别名。这是由于 Ribbon 的约束所致,它要求将应用程序 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();
}
78.3.2 Path
该路径由path
YAML 属性表示,并且是在 Zookeeper 下注册依赖项的路径。如previous section中所述,功能区在 URL 上运行。结果,该路径不符合其要求。这就是为什么 Spring Cloud Zookeeper 将别名 Map 到正确的路径。
78.3.3 负载均衡器类型
负载均衡器类型由loadBalancerType
YAML 属性表示。
如果您知道在调用此特定依赖项时必须应用哪种负载平衡策略,则可以在 YAML 文件中提供它,并自动应用它。您可以选择以下负载平衡策略之一:
-
STICKY:选择后,将始终调用该实例。
-
随机:随机选择一个实例。
-
ROUND_ROBIN:反复遍历实例。
78.3.4Content Type 模板和版本
Content-Type
模板和版本由contentTypeTemplate
和version
YAML 属性表示。
如果您在Content-Type
Headers 中对 API 进行版本控制,则不想将此 Headers 添加到每个请求中。另外,如果要调用 API 的新版本,则不想在代码中漫游以提高 API 版本。因此,您可以为contentTypeTemplate
提供特殊的$version
占位符。该占位符将由version
YAML 属性的值填充。考虑以下contentTypeTemplate
的示例:
application/vnd.newsletter.$version+json
进一步考虑以下version
:
v1
contentTypeTemplate
和版本的组合会为每个请求创建Content-Type
Headers,如下所示:
application/vnd.newsletter.v1+json
78.3.5 默认标题
默认 Headers 由 YAML 中的headers
Map 表示。
有时,每次对依赖项的调用都需要设置一些默认头。要在代码中不要这样做,可以在 YAML 文件中进行设置,如以下示例headers
部分所示:
headers:
Accept:
- text/html
- application/xhtml+xml
Cache-Control:
- no-cache
该headers
部分将在您的 HTTP 请求中添加Accept
和Cache-Control
Headers 以及相应的值列表。
78.3.6 必需的依赖关系
所需的依存关系由 YAML 中的required
属性表示。
如果在应用程序启动时需要构建依赖关系之一,则可以在 YAML 文件中设置required: true
属性。
如果您的应用程序在启动期间无法本地化所需的依赖关系,则会引发异常,并且 Spring Context 无法设置。换句话说,如果所需的依赖项未在 Zookeeper 中注册,则您的应用程序将无法启动。
您可以阅读有关 Spring Cloud Zookeeper 在线状态检查器本文档后面的更多信息。
78.3.7 Stubs
您可以提供一个冒号分隔的指向 JAR 的路径,其中包含依赖项的存根,如以下示例所示:
stubs: org.springframework:myApp:stubs
where:
-
org.springframework
是groupId
。 -
myApp
是artifactId
。 -
stubs
是分类器。 (请注意stubs
是默认值.)
因为stubs
是默认分类器,所以前面的示例等于以下示例:
stubs: org.springframework:myApp
78.4 配置 Spring Cloud Zookeeper 依赖关系
您可以设置以下属性来启用或禁用部分 Zookeeper 依赖关系功能:
-
spring.cloud.zookeeper.dependencies
:如果不设置此属性,则不能使用 Zookeeper 依赖关系。 -
spring.cloud.zookeeper.dependency.ribbon.enabled
(默认情况下启用):功能区需要显式全局配置或特定的依赖项配置。通过启用此属性,可以实现运行时负载平衡策略解析,并且您可以使用 Zookeeper 依赖关系的loadBalancerType
部分。需要此属性的配置具有LoadBalancerClient
的实现,该实现委派给下一个项目符号中提供的ILoadBalancer
。 -
spring.cloud.zookeeper.dependency.ribbon.loadbalancer
(默认情况下启用):由于使用此属性,自定义ILoadBalancer
知道传递给 Ribbon 的 URI 部分实际上可能是必须在 Zookeeper 中解析为正确路径的别名。没有此属性,您将无法在嵌套路径下注册应用程序。 -
spring.cloud.zookeeper.dependency.headers.enabled
(默认情况下启用):此属性注册一个RibbonClient
,该属性会自动将适当的 Headers 和 Content Type 及其版本附加在 Dependency 配置中。没有此设置,这两个参数将不起作用。 -
spring.cloud.zookeeper.dependency.resttemplate.enabled
(默认情况下启用):启用后,此属性将修改@LoadBalanced
Comments 的RestTemplate
的请求 Headers,以使其传递 Headers 和 Content Type 以及在依赖项配置中设置的版本。没有此设置,这两个参数将不起作用。