使用Zookeeper进行服务注册与发现
服务注册(ServiceRegistry)与发现(DiscoveryClient)在Spring Cloud中都进行了抽象。除了之前介绍的Eureka外,Spring Cloud也支持使用Zookeeper作为服务的注册中心。基于Zookeeper的服务注册由org.springframework.cloud.zookeeper.serviceregistry.ZookeeperServiceRegistry
实现,服务发现由org.springframework.cloud.zookeeper.discovery.ZookeeperDiscoveryClient
实现。需要使用Zookeeper进行服务注册与发现时需要加入spring-cloud-starter-zookeeper-discovery
依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
spring-cloud-starter-zookeeper-discovery
默认会使用的是基于Zookeeper3.5.X系列的jar包,如果你使用的是Zookeeper3.4.X系列,则需要自己手动的指定依赖Zookeeper3.4.X系列,同时在spring-cloud-starter-zookeeper-discovery
中排除对Zookeeper的依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-all</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.12</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
通常作为服务提供方的应用都是Web应用,所以一般还需要加上spring-boot-starter-web
依赖。Classpath中添加了spring-cloud-starter-zookeeper-discovery
后Spring Cloud默认会把自己注册到地址为localhost:2181
的zookeeper,服务名称默认取${spring.application.name}
,如果没有指定spring.application.name
则默认取application
。注册时会在/services/serviceId
下写入实例信息,比如serviceId指定为service1
,则默认会在/services/service1
目录下创建一个实例对应的节点,写入实例信息。如果你需要连接的Zookeeper的地址不是localhost:2181
,则可以通过spring.cloud.zookeeper.connectString
进行指定。
spring:
application:
name: service1
cloud:
zookeeper:
connect-string: 10.10.10.1:2181
无论是服务提供者还是客户端应用都需要添加spring-cloud-starter-zookeeper-discovery
依赖。服务提供方应用按照上面的配置就已经可以了。客户端应用,如果你使用Feign,则需要添加spring-cloud-starter-openfeign
依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
然后声明@FeignClient
,定义对远程接口的抽象,比如下面这样。
@FeignClient("${feign.service1.name:service1}")
public interface HelloService {
@GetMapping("hello")
String hello();
}
然后在@Configuration
类上声明@EnableFeignClients
以启用对Feign的支持,并将扫描@FeignClient
。
@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
FeignClient将通过@FeignClient
上指定的serviceId到Zookeeper上寻找对应的实例,从而完成相应的调用。
对于客户端应用而言,如果它只作为客户端,而不需要对外提供服务,或者说它不需要作为一个服务注册到Zookeeper中,则我们可以指定spring.cloud.service-registry.auto-registration.enabled=false
或者spring.cloud.zookeeper.discovery.register=false
。
spring:
cloud:
service-registry:
auto-registration:
enabled: false
如果我们的应用中拥有spring-cloud-starter-zookeeper-discovery
,但是我们又不想使用基于Zookeeper的服务发现与注册功能,则可以指定spring.cloud.zookeeper.enabled=false
,如果只是不想使用服务发现功能,则可以指定spring.cloud.zookeeper.discovery.enabled=false
。Spring Cloud Zookeeper不允许我们只启用服务注册功能,而不启用服务发现功能。换言之,启用服务注册功能的前提是启用了服务发现功能。所以如果你的服务提供方不需要依赖其它服务,但是它需要作为一个服务注册到Zookeeper上,你不能指定spring.cloud.zookeeper.discovery.enabled=false
。更多关于Spring Cloud Zookeeper可以指定的信息可以参考org.springframework.cloud.zookeeper.ZookeeperProperties
的源码或API文档。
服务注册到Zookeeper中默认写入的主机地址是主机名,很多时候可能你更希望它写入的是IP地址。此时可以指定spring.cloud.zookeeper.discovery.preferIpAddress=true
。
spring:
cloud:
zookeeper:
discovery:
prefer-ip-address: true
服务注册到Zookeeper中的实例ID默认是当前ApplicationContext的ID,它通常可以做到唯一,但是可读性不强。可能你更希望它能够表现为当前的主机跟端口,则可以指定spring.cloud.zookeeper.discovery.instanceId
为如下这样。
spring:
cloud:
zookeeper:
discovery:
instance-id: ${spring.cloud.client.hostname}:${server.port}
如果你希望instanceId是主机IP和端口的组合,则可以指定instanceId的值为
${spring.cloud.client.ip-address}:${server.port}
。
Spring Cloud Zookeeper在进行服务注册与发现时默认的namespace,或者说根路径是/services
,如果你使用的Zookeeper该路径已经有其它用途了,你可能想要更换这个根路径。可以通过spring.cloud.zookeeper.discovery.root
属性来更换这个根路径,比如下面就指定了根路径是/springcloud
。当更换了默认的根路径时,注意服务提供方和客户端都需要更换这个路径。
spring:
cloud:
zookeeper:
discovery:
root: /springcloud
Spring Cloud Zookeeper底层在与Zookeeper进行交互时使用的是Apache Curator,其会自动注册org.apache.curator.framework.CuratorFramework
类型的bean,所以如果应用中需要自己直接与Zookeeper进行交互时可以直接注入CuratorFramework
,然后通过它与Zookeeper进行交互。
参考文档
(注:本文是基于Spring Cloud Finchley.SR1所写)
相关推荐
在分布式系统中,服务注册与发现是至关重要的一个环节,SpringCloud通过集成不同的注册中心,如Eureka、Consul和Zookeeper,为微服务架构提供了强大的支持。本篇主要聚焦于SpringCloud与Zookeeper的结合,讲解如何...
### Dubbo和Spring Cloud微服务架构对比——服务注册和发现 #### 微服务架构概述 在当前快速发展的软件行业中,微服务架构作为一种重要的设计模式,已经被广泛采纳。它通过将复杂的单体应用拆分为一系列相互独立的...
在选择大版本时,可以访问Alibaba的官方文档,查看“毕业版本依赖关系(推荐使用)”的部分,例如选择了Spring Cloud Hoxton.SR8,对应的Spring Cloud Alibaba版本为2.2.5.RELEASE,而与之匹配的Spring Boot版本为...
在分布式锁方面,Spring Cloud提供了分布式协调的能力,如使用Redis或Zookeeper实现锁的获取与释放。分布式事务处理,例如使用Seata,可以解决跨服务的事务一致性问题。而多数据源的支持,使得应用可以根据业务场景...
《Zookeeper:初学者的春天——SpringCloud集成指南》 Zookeeper,作为分布式协调服务的明星组件,一直以来都是分布式系统中的重要角色。它为大型分布式应用提供了统一的命名服务、配置管理、集群同步等核心功能。...
1. SpringCloud:作为Java领域的微服务框架,SpringCloud提供了全套的服务治理解决方案,包括服务注册与发现、配置中心、负载均衡、熔断机制等。在这个项目中,SpringCloud扮演了构建分布式系统的基石角色,使得各个...
相比于Dubbo,Spring Cloud使用Http REST接口,注册中心采用了自研的Eureka,而非Dubbo中的Zookeeper,这被认为更适合服务发现。 苏宁数据中台包含多个子项目,例如Olap负责数据的加速和查询,百川是指标平台,UDMS...
1. **Eureka服务注册与发现**:理解Eureka Server的角色,服务注册、心跳机制、服务续约和剔除等概念。 2. **Ribbon客户端负载均衡**:使用Ribbon实现客户端的负载均衡,了解其与Dubbo的区别。 3. **Zuul和Spring ...
Eureka 和 ZooKeeper 都可以用于服务注册与发现,但两者存在显著差异: 1. **CAP 理论角度**:ZooKeeper 遵循 CP(Consistency-Persistence),即在分布式系统中保证数据的一致性和持久性;而 Eureka 遵循 AP...
例如,它可以作为服务注册与发现的中心,维护服务实例的状态信息,帮助客户端找到服务的最新位置。同时,ZooKeeper也是分布式锁的常见实现方式,通过创建临时节点实现锁的获取与释放。 总的来说,从Paxos到...
zkspringwf项目是一个基于Spring框架和Zookeeper实现的服务注册与发现的示例。该项目展示了如何将Zookeeper集成到Spring Boot应用中,实现服务的动态注册与发现。 1. 配置Zookeeper:首先,我们需要在Spring Boot的...
在本篇内容中,我们将探讨如何将Apache Dubbo与Spring Boot进行整合,创建一个服务提供者(Provider)和一个服务消费者(Consumer)。...同时,确保Zookeeper服务正常运行,以便于服务注册和发现。
Dubbo支持多种协议,如RPC、REST、Hessian等,并且可以与Zookeeper、Etcd等服务注册中心集成,实现服务的自动注册和发现。 结合这两个技术,我们可以构建出强大的微服务架构。Spring Cloud提供了全面的服务治理,而...
Spring Cloud提供了集成这些服务中心的能力,使得服务注册自动化。 2. **Bean注册**:在Spring框架中,Bean代表了可被Spring管理的对象。开发者可以通过XML配置、注解配置或者Java配置类来注册Bean。例如,使用`@...
在 Spring Cloud 体系中,几乎每个角色都会有两个以上的产品提供选择,比如在注册中心有:Eureka、Consul、zookeeper、etcd 等;网关的产品有 Zuul、Spring Cloud Gateway 等。在注册中心产品中,最常使用的是 ...
Spring Boot Admin用于管理和监控SpringBoot应用程序。 应用程序作为Spring Boot Admin Client向为Spring Boot Admin Server注册(通过HTTP)或使用SpringCloud注册中心(例如Eureka,Consul,Zookeeper)发现。
- ZooKeeper注册中心:讲解ZooKeeper如何作为Dubbo的服务注册与发现组件,理解其节点结构和服务监听机制。 - Nacos与Eureka:对比ZooKeeper,了解Nacos和Eureka在服务注册与发现上的异同。 5. **负载均衡策略** ...
在实际使用过程中,用户应根据自身需求,结合Dubbo的其他组件,如配置中心(如Apollo或Zookeeper)、注册中心(如Eureka或Consul)、服务网关(如Spring Cloud Gateway或Zuul)等,构建完整的微服务体系,实现全方位...
Dubbo作为分布式服务框架,你需要了解其架构,学会创建服务提供者和消费者,同时掌握ZooKeeper的常用命令,它是Dubbo的服务注册与发现工具。 项目实战阶段涉及多个技术,如ElementUI用于前端界面,Quartz进行定时...