使用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所写)
相关推荐
Zookeeper作为注册中心搭建SpringCloud实现服务注册及发现
适用最新的spring cloud稳定版,微服务注册中心适用最新稳定版zookeeper。适用spring cloud gateway作为网关服务的demo
Zookeeper服务注册与发现 Consul服务注册与发现 Ribbon负载均衡服务调用 OpenFeign服务接口调用 Hystrix断路器 zuul路由网关 Gateway新一代网关 SpringCloud Config 分布式配置中心 SpringCloud Bus 消息...
SpringCloud中集成Zookeeper实现服务注册与发现示例代码 SpringCloud中集成Zookeeper实现服务注册与发现示例代码 SpringCloud中集成Zookeeper实现服务注册与发现示例代码 SpringCloud中集成Zookeeper实现服务注册与...
21.尚硅谷_SpringCloud_EurekaServer服务注册中心建立 22.尚硅谷_SpringCloud_将已有的部门微服务注册进Eureka服务中心 23.尚硅谷_SpringCloud_微服务完善_主机映射名称修改 24.尚硅谷_SpringCloud_微服务完善_主机...
主要介绍了springcloud集成zookeeper的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
21.硅谷学习_SpringCloud_EurekaServer服务注册中心建立 22.硅谷学习_SpringCloud_将已有的部门微服务注册进Eureka服务中心 23.硅谷学习_SpringCloud_微服务完善_主机映射名称修改 24.硅谷学习_SpringCloud_...
2.该项目提高了自己对Spring Boot整合Dubbo的理解,并深刻的认识到了服务者与消费者之间的调用及流程 4. Dubbo配置全部采用yml文件配置,方便,易读 5. 简化了开发流程,完整的Spring Boot工程 6. 适用于Dubbo初学者...
资料 1-0SpringCloud-课程介绍.avi 1-1SpringCloud-系统进化理论概述.avi 1-2SpringCloud-系统进化理论背景.avi 1-3SpringCloud-什么是微服务架构.avi ...3-5SpringCloud-搭建与配置Eureka服务注册中心.avi 3-6Spr
springcloud以zookeeper作为注册中心
6.Zookeeper服务注册与发现 7.Consul服务注册与发现 8.Ribbon负载均衡服务调用 9.OpenFeign服务接口调用 10.Hystrix断路器 11.Zuul路由网关 12.Gateway新一代网关 13.SpringCloud Config分布式配置中心 14.Spring...
服务注册与发现 5 搭建注册中心 6 常用注册中心框架 6 注册中心环境搭建 6 注册服务提供者 8 服务消费者 11 高可用注册中心 14 Eureka高可用原理 14 Eureka集群环境搭建 14 Eureka详解 17 使用Eureka闭源...
Spring Cloud Zookeeper对Zookeeper的封装,使之能配合其它 Spring Cloud项目使用,一般当作注册中心。 Spring Cloud Bus分布式消息队列,是对Kafka MQ的封装,实现可靠消息。 Spring Cloud Config将配置信息中央...
Spring Cloud是基于Spring Boot提供的一套微服务解决方案,包括服务注册与发现、配置中心、全链路监控、服务网关、负载均衡、熔断器等功能。它利用Spring Boot的开发便利性,简化了分布式系统基础设施的开发,为开发...
Java高级架构线路图学习路线内含Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、 高并发等架构技术(nginx+redis+zookeeper+activemq+storm+dubbo+netty+jvm+并发编程锁+项目实战)点击链接加入...
Spring Cloud是一系列框架的集合,其基于Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,构建了服务治理(发现注册)、配置中心、消息总线、负载均衡、断路器、数据监控、分布式会话和集群状态管理等...
Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单...
后端: springcloud全家桶 项目名: 酒店管理系统 功能点: 酒店管理,OTA直连 技术栈: 前端: react网页web框架,app 使用谷歌跨平台框架 flutter 后端: springcloud全家桶 项目名: 酒店管理系统 功能点: 酒店...
21.尚硅谷_SpringCloud_EurekaServer服务注册中心建立 22.尚硅谷_SpringCloud_将已有的部门微服务注册进Eureka服务中心 23.尚硅谷_SpringCloud_微服务完善_主机映射名称修改 24.尚硅谷_SpringCloud_微服务完善_...
基于SpringCloud的秒杀项目,集合了zookeeper、redis、支付宝支付、nacos、RocketMQ、Seata分布式事务等技术的项目,核心业务是秒杀以及支付订单。 基于SpringCloud的秒杀项目,集合了zookeeper、redis、支付宝支付...