ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Zookeeper系列(5):使用Zookeeper作为注册中心

2021-04-30 09:05:24  阅读:155  来源: 互联网

标签:系列 zkdemo Zookeeper value variable 注册 services 节点 localhost


服务注册

引入相关依赖:

<?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进行调用。

标签:系列,zkdemo,Zookeeper,value,variable,注册,services,节点,localhost
来源: https://www.cnblogs.com/seve/p/14708700.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有