SpringCloud使用Zookeeper作为注册中心

服务注册

引入相关依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.4.5</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>zkdemo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>zkdemo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>2020.0.2</spring-cloud.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

配置文件application.yml:

spring:
  cloud:
    zookeeper:
      # Zookeeper服务器地址,集群则以逗号分隔
      connect-string: localhost:2181
  application:
    name: zkdemo

# 使用随机端口
server:
  port: 0

主程序类ZkdemoApplication:

@SpringBootApplication
public class ZkdemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(ZkdemoApplication.class, args);
	}
}

由于配置了使用随机端口,这里直接启动三个ZkdemoApplication运行三个zkdemo服务示例。

启动成功后,在zookeeper中查看节点的变化,会发现在根节点下多出来一个services节点,services节点下是以服务名称命名的服务节点,服务节点下是该服务的实例节点。

[zk: localhost:2181(CONNECTED) 96] ls -R /
/
/services
/services/zkdemo
/services/zkdemo/2030bca0-db25-411d-b1f5-84c790bd1d6f
/services/zkdemo/208834cf-e7e4-496e-a5c0-afcbb78e120f
/services/zkdemo/2c4177e1-20fd-4c66-9ee0-eaf21253039d

实例节点中存储了服务名称、ip地址、端口号、实例ID等相关信息:

[zk: localhost:2181(CONNECTED) 97] get /services/zkdemo/208834cf-e7e4-496e-a5c0-afcbb78e120f
{"name":"zkdemo","id":"208834cf-e7e4-496e-a5c0-afcbb78e120f","address":"localhost","port":64514,"sslPort":null,"payload":{"@class":"org.springframework.cloud.zookeeper.discovery.ZookeeperInstance","id":"zkdemo","name":"zkdemo","metadata":{"instance_status":"UP"}},"registrationTimeUTC":1619424602784,"serviceType":"DYNAMIC","uriSpec":{"parts":[{"value":"scheme","variable":true},{"value":"://","variable":false},{"value":"address","variable":true},{"value":":","variable":false},{"value":"port","variable":true}]}}

[zk: localhost:2181(CONNECTED) 98] get /services/zkdemo/2030bca0-db25-411d-b1f5-84c790bd1d6f
{"name":"zkdemo","id":"2030bca0-db25-411d-b1f5-84c790bd1d6f","address":"localhost","port":64401,"sslPort":null,"payload":{"@class":"org.springframework.cloud.zookeeper.discovery.ZookeeperInstance","id":"zkdemo","name":"zkdemo","metadata":{"instance_status":"UP"}},"registrationTimeUTC":1619424361059,"serviceType":"DYNAMIC","uriSpec":{"parts":[{"value":"scheme","variable":true},{"value":"://","variable":false},{"value":"address","variable":true},{"value":":","variable":false},{"value":"port","variable":true}]}}

[zk: localhost:2181(CONNECTED) 99] get /services/zkdemo/2c4177e1-20fd-4c66-9ee0-eaf21253039d
{"name":"zkdemo","id":"2c4177e1-20fd-4c66-9ee0-eaf21253039d","address":"localhost","port":64475,"sslPort":null,"payload":{"@class":"org.springframework.cloud.zookeeper.discovery.ZookeeperInstance","id":"zkdemo","name":"zkdemo","metadata":{"instance_status":"UP"}},"registrationTimeUTC":1619424510719,"serviceType":"DYNAMIC","uriSpec":{"parts":[{"value":"scheme","variable":true},{"value":"://","variable":false},{"value":"address","variable":true},{"value":":","variable":false},{"value":"port","variable":true}]}}

通过ephemeralOwner字段可以看出,services节点和服务节点为持久节点,实例节点为临时节点:

[zk: localhost:2181(CONNECTED) 100] stat /services
cZxid = 0x118
ctime = Mon Apr 26 16:06:02 CST 2021
mZxid = 0x118
mtime = Mon Apr 26 16:06:02 CST 2021
pZxid = 0x119
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1

[zk: localhost:2181(CONNECTED) 101] stat /services/zkdemo
cZxid = 0x119
ctime = Mon Apr 26 16:06:02 CST 2021
mZxid = 0x119
mtime = Mon Apr 26 16:06:02 CST 2021
pZxid = 0x11e
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 3

[zk: localhost:2181(CONNECTED) 102] stat /services/zkdemo/2030bca0-db25-411d-b1f5-84c790bd1d6f
cZxid = 0x11a
ctime = Mon Apr 26 16:06:02 CST 2021
mZxid = 0x11a
mtime = Mon Apr 26 16:06:02 CST 2021
pZxid = 0x11a
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x100000122cf000d
dataLength = 514
numChildren = 0

当某个实例出现故障停止时,对应的临时节点也会被删除。当服务节点下所有实例节点被删除时,服务节点也会被删除。当services节点下的所有服务节点被删除时,services节点也会被删除。

服务发现

通过DiscoveryClient从注册中心获取对应服务的实例列表:

@SpringBootTest
class ZkdemoApplicationTests {
	@Autowired
	private DiscoveryClient discoveryClient;

	@Test
	public void serviceUrl() {
		List<ServiceInstance> list = discoveryClient.getInstances("zkdemo");
		list.stream().forEach(obj -> System.out.println(obj.getUri().toString()));
	}
}

输出结果:

http://localhost:64401
http://localhost:64475
http://localhost:64514

服务调用这里就不演示了,可以使用Feign或RestTemplate进行调用。

以上就是SpringCloud使用Zookeeper作为注册中心的详细内容,更多关于Zookeeper作为注册中心的资料请关注我们其它相关文章!

(0)

相关推荐

  • 在Java中操作Zookeeper的示例代码详解

    依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.0</version> </dependency> 连接到zkServer //连接字符串,zkServer的ip.port,如果是集群逗号分隔 String connectStr = "192.

  • SpringBoot系列教程之dubbo和Zookeeper集成方法

    今日学习新的内容:dubbo   dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,一款高性能.轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现. zookeeper   zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等. SpringBoot整合dubbo和Zookeeper 1.了解Dubbo基本

  • Python通过zookeeper实现分布式服务代码解析

    借助zookeeper可以实现服务器的注册与发现,有需求的时候调用zookeeper来发现可用的服务器,将任务均匀分配到各个服务器上去. 这样可以方便的随任务的繁重程度对服务器进行弹性扩容,客户端和服务端是非耦合的,也可以随时增加客户端. zk_server.py import threading import json import socket import sys from kazoo.client import KazooClient # TCP服务端绑定端口开启监听,同时将自己注册到z

  • springcloud集成zookeeper的方法示例

    为什么使用zookeeper Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储, Zookeeper 作用主要是用来维护和监控存储的数据的状态变化,通过监控这些数据状态的变化,从而达到基于数据的集群管理. zookeeper 核心 Zookeeper的数据模型是树结构,在内存数据库中,存储了整棵树的内容,包括所有的节点路径.节点数据.ACL信息,Zookeeper会定时将这个数据存储到磁盘上. zoo

  • SpringCloud用Zookeeper搭建配置中心的方法

    本文介绍了SpringCloud +Zookeeper完成配置中心,分享给大家,具有如下: 使用场景 项目配置更改不需要打包,重启 提供配置文件的可视化界面 和springcloud快速整合 为什么使用zookeeper Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储, Zookeeper 作用主要是用来维护和监控存储的数据的状态变化,通过监控这些数据状态的变化,从而达到基于数据的集群管理. 怎么使

  • 2020最新IDEA SpringBoot整合Dubbo的实现(zookeeper版)

    首先,要在电脑上安装配置好zookeeper哦~ 这是我云服务器上的zookeeper状态 接下来,开始整合 1. 准备一个dubbo-api的SpringBoot项目 用来存储Entity类和Server接口的项目,配置文件无须改动. entity – User // Lombok注解 相当于Setter Getter toString() @Data public class User implements Serializable { // 序列化很重要!!! private static

  • 基于Spring Cloud Zookeeper实现服务注册与发现

    服务注册 1.添加Spring Cloud Zookeeper依赖: <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> <exclusions> <exclusion> <grou

  • Zookeeper全局唯一ID生成方案解析

    系统唯一ID生成分案有很多种,例如:数据库 auto_increment,UUID,Redis生成ID(Redis原子操作INCR和INCRBY),Twiitter的snowflake算法,ZooKeeper生成ID,MongoDb的ObjectId,下面我们就看一下ZooKeeper实现分布式系统唯一ID. public int idGen() throws Exception { String zkAddress = "127.0.0.1:2181"; String idNode

  • SpringBoot中dubbo+zookeeper实现分布式开发的应用详解

    总体实现思路是启动一个生产者项目注册, 将所含服务注册到zookeeper的注册中心, 然后在启动一个消费者项目,将所需服务向zookeeper注册中心进行订阅, 等待注册中心的通知 注册中心基于负载均衡算法给消费者匹配到合适的生产者主机,然后通知消费者可以使用 实现生产者 导入zookeeper依赖包 <!-- Dubbo Spring Boot Starter --> <dependency> <groupId>org.apache.dubbo</groupI

  • 如何用python 操作zookeeper

    ZooKeeper 简介 ZooKeeper 是一个分布式的.开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等.ZooKeeper 支持大部分开发语言,除了某些特定的功能只支持 Java 和 C.python 通过 kazoo 可以实现操作 ZooKeeper . 一.安装 这个简单,使用 pip 命令安装 pip3

  • 关于idea+centos7+zookeeper报错connectionloss,timeout问题

    之前一直报错连接不上,检查了很多遍ip也对着,端口也是,配置等等都没有问题,也能ping通linux主机,一整天没调通,烦都烦死了. 后来第二天继续调试,发现之前关闭防火墙的时候,使用的是systemctl stop firewalld这个命令,会报错未找到firewalld,以为是我的linux主机没有firewall 但是当我使用firewall-cmd --state 时发现防火墙在运行.这时候才发现我之前的关闭防火墙命令对于centos7可能不适用.我是centos7.9:然后关闭防火墙

  • SpingBoot+Dubbo+Zookeeper实现简单分布式开发的应用详解

    开始接触分布式概念,学习之前要准备搭建Dubbo和Zookeeper环境的简单搭建. Window下安装Zookeeper和Dubbo-admin 1.Apache官网下载Zookeeper 点击官网地址下载最新版 下载完成后,打开apache-zookeeper-3.6.2-bin\bin下zkServer.cmd,正常第一次都会闪退的,因为没有配置好zoo.cfg配置文件. 将conf目录下的zoo_sample.cfg文件,复制一份,重命名为zoo.cfg 在apache-zookeepe

随机推荐