SpringCloud使用Zookeeper作为注册中心

作者:布禾 时间:2023-11-21 20:28:20 

目录
  • 服务注册

  • 服务发现

服务注册

引入相关依赖:


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

来源:https://www.cnblogs.com/seve/archive/2021/04/30/14708700.html

标签:SpringCloud,Zookeeper,注册中心
0
投稿

猜你喜欢

  • SpringBoot使用Maven插件进行项目打包的方法

    2022-12-21 21:07:34
  • Java利用MessageFormat实现短信模板的匹配

    2023-02-19 11:41:54
  • Flutter开发技巧ListView去除水波纹方法示例

    2021-12-27 14:15:24
  • Java实现五子棋的基础方法

    2021-07-11 12:32:08
  • Java连接ftp服务器实例代码

    2022-04-26 23:12:37
  • 详解Jackson 使用以及性能介绍

    2023-02-21 00:08:31
  • Kotlin中ListView与RecyclerView的应用讲解

    2023-01-24 01:26:44
  • SpringAOP+RabbitMQ+WebSocket实战详解

    2023-01-01 18:40:25
  • Android Studio和Gradle使用不同位置JDK的问题解决

    2023-06-27 17:35:04
  • springboot结合vue实现增删改查及分页查询

    2023-11-24 15:53:44
  • SpringMVC请求参数的使用总结

    2022-11-30 22:23:18
  • Unity3D使用UGUI开发原生虚拟摇杆

    2021-10-04 17:28:26
  • 一文搞懂String的intern()方法

    2022-05-28 12:05:35
  • Android中Activity启动默认不显示输入法解决方法

    2022-12-27 20:49:30
  • java实现监听u盘示例分享

    2023-10-20 02:14:05
  • c#图片缩放图片剪切功能实现(等比缩放)

    2022-08-17 04:46:13
  • JAVA HashMap详细介绍和示例

    2023-04-07 00:17:43
  • mybatis @Alias注解在类上的使用方式(推荐)

    2023-11-20 00:30:03
  • 了解Java虚拟机JVM的基本结构及JVM的内存溢出方式

    2023-02-20 03:08:51
  • SpringBoot如何使用自定义注解实现接口限流

    2023-11-25 07:22:37
  • asp之家 软件编程 m.aspxhome.com