使用Zookeeper依赖关系
Spring Cloud Zookeeper可以让您提供应用程序的依赖关系作为属性。作为依赖关系,您可以了解Zookeeper中注册的其他应用程序,您可以通过Feign(REST客户端构建器)以及SpringRestTemplate呼叫。
您还可以从Zookeeper依赖关系观察者功能中受益,这些功能可让您控制和监视依赖关系的状态,并决定如何处理。
如何激活Zookeeper依赖关系
包括对org.springframework.cloud:spring-cloud-starter-zookeeper-discovery的依赖将启用将自动配置Spring Cloud Zookeeper依赖关系的自动配置。
如果您必须正确设置spring.cloud.zookeeper.dependencies部分 - 请查看后续部分以获取更多详细信息,然后该功能处于活动状态
即使您在属性中提供依赖关系,也可以关闭依赖关系。只需将属性spring.cloud.zookeeper.dependency.enabled设置为false(默认为true)。
设置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。
别名
在根属性下面,由于Ribbon的限制,必须通过别名来表示每个依赖关系(应用程序ID必须放在URL中,因此您不能传递任何复杂的路径,如/ foo / bar / name )。别名将是您将使用的名称,而不是DiscoveryClient,Feign或RestTemplate的serviceId。
在上述例子中,别名是newsletter和mailing。使用newsletter的Feign使用示例为:
@FeignClient("newsletter")
public interface NewsletterService {
@RequestMapping(method = RequestMethod.GET, value = "/newsletter")
String getNewsletters();
}
路径
代表pathyaml属性。
Path是根据Zookeeper注册依赖关系的路径。像Ribbon之前提交的URL,因此这个路径不符合其要求。这就是为什么Spring Cloud Zookeeper将别名映射到正确的路径。
负载平衡器类型
代表loadBalancerTypeyaml属性。
如果您知道在调用此特定依赖关系时必须应用什么样的负载平衡策略,那么您可以在yaml文件中提供它,并将自动应用。您可以选择以下负载平衡策略之一
STICKY - 一旦选择了该实例将始终被调用
随机 - 随机选择一个实例
ROUND_ROBIN - 一遍又一遍地迭代实例
Content-Type模板和版本
代表contentTypeTemplate和versionyaml属性。
如果您通过Content-Type标题版本您的api,那么您不想将此标头添加到您的每个请求中。另外如果你想调用一个新版本的API,你不想漫游你的代码,以增加API版本。这就是为什么您可以提供contentTypeTemplate特殊$version占位符的原因。该占位符将由versionyaml属性的值填充。我们来看一个例子。
拥有以下contentTypeTemplate:
application/vnd.newsletter.$version+json
和以下version:
v1
将导致为每个请求设置Content-Type标题:
application/vnd.newsletter.v1+json
默认标题
由yaml代表headers映射
有时每次调用依赖关系都需要设置一些默认标头。为了不在代码中这样做,您可以在yaml文件中设置它们。拥有以下headers部分:
headers:
Accept:
- text/html
- application/xhtml+xml
Cache-Control:
- no-cache
结果在您的HTTP请求中添加适当的值列表的Accept和Cache-Control标头。
强制依赖
在yaml中由required属性表示
如果您的一个依赖关系在您的应用程序启动时需要启动并运行,则可以在yaml文件中设置required: true属性。
如果您的应用程序无法在引导期间本地化所需的依赖关系,则会抛出异常,并且Spring上下文将无法设置。换句话说,如果Zookeeper中没有注册所需的依赖关系,则您的应用程序将无法启动。
您可以在以下部分阅读有关Spring Cloud Zookeeper存在检查器的更多信息。
存根
您可以为包含依赖关系的存根的JAR提供冒号分隔路径。例
stubs: org.springframework:foo:stubs
意味着对于特定的依赖关系可以在下面找到:
groupId:org.springframework
artifactId:foo
分类器:stubs- 这是默认值
这实际上等于
stubs: org.springframework:foo
因为stubs是默认分类器。
配置Spring Cloud Zookeeper依赖关系
有一些属性可以设置为启用/禁用Zookeeper依赖关系功能的部分。
spring.cloud.zookeeper.dependencies- 如果您不设置此属性,则不会从Zookeeper依赖关系中受益
spring.cloud.zookeeper.dependency.ribbon.enabled(默认情况下启用) - Ribbon需要显式的全局配置或特定的依赖关系。通过打开此属性,运行时负载平衡策略解决是可能的,您可以从Zookeeper依赖关系的loadBalancerType部分获利。需要此属性的配置具有LoadBalancerClient的实现,委托给下一个子弹中的ILoadBalancer
spring.cloud.zookeeper.dependency.ribbon.loadbalancer(默认情况下启用) - 感谢这个属性,自定义ILoadBalancer知道传递给Ribbon的URI部分实际上可能是必须被解析为Zookeeper。没有此属性,您将无法在嵌套路径下注册应用程序。
spring.cloud.zookeeper.dependency.headers.enabled(默认情况下启用) - 此属性注册这样的一个RibbonClient,它会自动附加适当的头文件和内容类型,其中包含依赖关系配置中显示的版本。没有这两个参数的设置将不会运行。
spring.cloud.zookeeper.dependency.resttemplate.enabled(默认情况下启用) - 启用时将修改@LoadBalanced注释的RestTemplate的请求标头,以便它通过依赖关系配置中设置的版本的标题和内容类型。Wihtout这两个参数的设置将无法运行。