Spring Cloud Zookeeper
该项目通过自动配置并绑定到Spring环境和其他Spring编程模型成语,为Spring Boot应用程序提供Zookeeper集成。通过几个简单的注释,您可以快速启用和配置应用程序中的常见模式,并使用基于Zookeeper的组件构建大型分布式系统。提供的模式包括服务发现和配置。智能路由(Zuul)和客户端负载平衡(Ribbon),断路器(Hystrix)通过与Spring Cloud Netflix的集成提供。
安装Zookeeper
请参阅安装文档获取有关如何安装Zookeeper指令。
服务发现与Zookeeper
服务发现是基于微服务架构的关键原则之一。尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱。策展人(一个用于Zookeeper的java库)通过服务发现扩展提供服务发现服务。Spring Cloud Zookeeper利用此扩展功能进行服务注册和发现。
如何激活
包括对org.springframework.cloud:spring-cloud-starter-zookeeper-discovery的依赖将启用将设置Spring Cloud Zookeeper发现的自动配置。
注意 | 您仍然需要包含org.springframework.boot:spring-boot-starter-web的网页功能。 |
---|
注册Zookeeper
当客户端注册Zookeeper时,它提供有关自身的元数据,如主机和端口,ID和名称。
示例Zookeeper客户端:
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
(即完全正常的Spring Boot应用程序)。如果Zookeeper位于localhost:2181以外的地方,则需要配置来定位服务器。例:
application.yml
spring:
cloud:
zookeeper:
connect-string: localhost:2181
警告 | 如果您使用Spring Cloud Zookeeper配置,上述值将需要放置在bootstrap.yml而不是application.yml中。 |
---|
来自Environment的默认服务名称,实例ID和端口分别为${spring.application.name},Spring上下文ID和${server.port}。
@EnableDiscoveryClient将应用程序同时进入Zookeeper“服务”(即注册自己)和“客户端”(即可以查询Zookeeper查找其他服务)。
使用DiscoveryClient
Spring Cloud支持Feign(REST客户端构建器),还支持Spring RestTemplate使用逻辑服务名称而不是物理URL。
您还可以使用org.springframework.cloud.client.discovery.DiscoveryClient,它为Netflix不具体的发现客户端提供简单的API,例如
@Autowired
private DiscoveryClient discoveryClient;
public String serviceUrl() {
List<ServiceInstance> list = discoveryClient.getInstances("STORES");
if (list != null && list.size() > 0 ) {
return list.get(0).getUri().toString();
}
return null;
}
使用Spring Cloud Zookeeper与Spring Cloud Netflix组件
Spring Cloud Netflix提供有用的工具,无论使用哪种DiscoveryClient实现。Feign,Turbine,Ribbon和Zuul均与Spring Cloud Zookeeper合作。
Ribbon与Zookeeper
Spring Cloud Zookeeper提供Ribbon的ServerList的实现。当使用spring-cloud-starter-zookeeper-discovery时,Ribbon默认情况下自动配置为使用ZookeeperServerList。
Spring Cloud Zookeeper和服务注册表
Spring Cloud Zookeeper实现ServiceRegistry接口,允许开发人员以编程方式注册任意服务。
ServiceInstanceRegistration类提供builder()方法来创建可以由ServiceRegistry使用的Registration对象。
@Autowired
private ZookeeperServiceRegistry serviceRegistry;
public void registerThings() {
ZookeeperRegistration registration = ServiceInstanceRegistration.builder()
.defaultUriSpec()
.address("anyUrl")
.port(10)
.name("/a/b/c/d/anotherservice")
.build();
this.serviceRegistry.register(registration);
}
实例状态
Netflix Eureka支持在服务器上注册的实例是OUT_OF_SERVICE,而不是作为活动服务实例返回。这对于诸如蓝色/绿色部署之类的行为非常有用。策展人服务发现配方不支持此行为。利用灵活的有效载荷,让Spring Cloud Zookeeper通过更新一些特定的元数据,然后对Ribbon ZookeeperServerList中的元数据进行过滤来实现OUT_OF_SERVICE。ZookeeperServerList过滤出不等于UP的所有非空实例状态。如果实例状态字段为空,则向后兼容性被认为是UP。将实例POST OUT_OF_SERVICE的状态更改为ServiceRegistry实例状态执行器端点。
----
$ echo -n OUT_OF_SERVICE | http POST http://localhost:8081/service-registry/instance-status
----
NOTE: The above example uses the `http` command from https://httpie.org
Zookeeper依赖关系
使用Zookeeper依赖关系
Spring Cloud Zookeeper可以让您提供应用程序的依赖关系作为属性。作为依赖关系,您可以了解Zookeeper中注册的其他应用程序,您可以通过Feign(REST客户端构建器)以及Spring RestTemplate呼叫。
您还可以从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();
}
路径
代表path yaml属性。
Path是根据Zookeeper注册依赖关系的路径。像Ribbon之前提交的URL,因此这个路径不符合其要求。这就是为什么Spring Cloud Zookeeper将别名映射到正确的路径。
负载平衡器类型
代表loadBalancerType yaml属性。
如果您知道在调用此特定依赖关系时必须应用什么样的负载平衡策略,那么您可以在yaml文件中提供它,并将自动应用。您可以选择以下负载平衡策略之一
-
STICKY - 一旦选择了该实例将始终被调用
-
随机 - 随机选择一个实例
-
ROUND_ROBIN - 一遍又一遍地迭代实例
Content-Type模板和版本
代表contentTypeTemplate和version yaml属性。
如果您通过Content-Type标题版本您的api,那么您不想将此标头添加到您的每个请求中。另外如果你想调用一个新版本的API,你不想漫游你的代码,以增加API版本。这就是为什么您可以提供contentTypeTemplate特殊$version占位符的原因。该占位符将由version yaml属性的值填充。我们来看一个例子。
拥有以下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这两个参数的设置将无法运行。
Spring Cloud Zookeeper依赖关系观察者
依赖关系观察器机制允许您将侦听器注册到依赖关系中。功能实际上是Observator模式的实现。当依赖关系改变其状态(UP或DOWN)时,可以应用一些自定义逻辑。
如何激活
Spring Cloud Zookeeper依赖关系功能需要启用从依赖关系观察器机制中获利。
注册听众
为了注册一个监听器,你必须实现一个接口org.springframework.cloud.zookeeper.discovery.watcher.DependencyWatcherListener,并将其注册为一个bean。该界面为您提供了一种方法:
如果要为特定的依赖关系注册一个侦听器,那么dependencyName将是具体实现的鉴别器。newState将提供您的依赖关系是否已更改为CONNECTED或DISCONNECTED的信息。
存在检查
绑定与依赖关系观察器是称为存在检查器的功能。它允许您在启动应用程序时提供自定义行为,以根据您的依赖关系的状态作出反应。
抽象org.springframework.cloud.zookeeper.discovery.watcher.presence.DependencyPresenceOnStartupVerifier类的默认实现是org.springframework.cloud.zookeeper.discovery.watcher.presence.DefaultDependencyPresenceOnStartupVerifier,它以以下方式工作。
-
如果依赖关系标记为我们required,并且不在Zookeeper中,则在引导时,您的应用程序将抛出异??常并关闭
-
如果依赖关系不是required,org.springframework.cloud.zookeeper.discovery.watcher.presence.LogMissingDependencyChecker将在WARN级别上记录该应用程序
功能可以被覆盖,因为只有当没有DependencyPresenceOnStartupVerifier的bean时才会注册DefaultDependencyPresenceOnStartupVerifier。
分布式配置与Zookeeper
Zookeeper提供了一个分层命名空间,允许客户端存储任意数据,如配置数据。Spring Cloud Zookeeper Config是Config Server和Client的替代方案。在特殊的“引导”阶段,配置被加载到Spring环境中。默认情况下,配置存储在/config命名空间中。根据应用程序的名称和模拟解析属性的Spring Cloud Config顺序的活动配置文件,创建多个PropertySource实例。例如,名为“testApp”的应用程序和“dev”配置文件将创建以下属性源:
config/testApp,dev
config/testApp
config/application,dev
config/application
最具体的物业来源位于顶部,底部最不具体。Properties是config/application命名空间适用于使用zookeeper进行配置的所有应用程序。config/testApp命名空间中的Properties仅适用于名为“testApp”的服务实例。
配置当前在应用程序启动时被读取。发送HTTP POST到/refresh将导致重新加载配置。观看配置命名空间(Zookeeper支持))目前尚未实现,但将来将会添加到此项目中。
如何激活
包括对org.springframework.cloud:spring-cloud-starter-zookeeper-config的依赖将启用将配置Spring Cloud Zookeeper配置的自动配置。
定制
Zookeeper可以使用以下属性自定义配置:
bootstrap.yml
spring:
cloud:
zookeeper:
config:
enabled: true
root: configuration
defaultContext: apps
profileSeparator: '::'
-
enabled将此值设置为“false”将禁用Zookeeper配置
-
root设置配置值的基本命名空间
-
defaultContext设置所有应用程序使用的名称
-
profileSeparator设置用于使用配置文件在属性源中分隔配置文件名称的分隔符的值
spring-cloud.adoc中的未解决的指令 - include :: / Users / sgibb / workspace / spring / spring-cloud-samples / scripts / docs /…/ cli / docs / src / main / asciidoc / spring-cloud-cli。 ADOC []
欢迎关注作者的公众号《Java编程生活》,每日记载Java程序猿工作中遇到的问题