zookeeper+Springboot实现服务器动态上下线监听教程详解

目录
  • zookeeper+Springboot实现服务器动态上下线监听教程
  • 一.什么是服务器动态上下线监听
  • 二.为什么要实现对服务器上下线的监听
  • 三.编码实现
  • 四.测试
    • 1.启动客户端,开启监听
    • 2.按照下面的流程启动服务器端

zookeeper+Springboot实现服务器动态上下线监听教程

一.什么是服务器动态上下线监听

客户端能够实时洞察到服务器上下线的变化,现在我们看看下面三个变化给集群、服务器、客户端三者的变化

初始情况

服务器3启动

服务器2下线

从上面的图我们可以知道,在集群中,每当一台服务器上线时,都会在集群中注册一个有序且临时的节点,并通知客户端;在服务器下线的时候,服务器所注册的节点也会被删除,并通知客户端。在这样的结构下,客户端便能够通过集群实时监听服务器的上下线。

二.为什么要实现对服务器上下线的监听

在开发中,这种结构应用的非常广泛,核心用处如下:

  • 用于监听节点数据产生的变化,在zk中可以配置集群的通用配置,当配置数据发生了变化之后通知所有订阅该节点的Watcher,该节点发生事件类型
  • 用于监听节点状态的变化,比如创建一个节点、删除一个节点等对节点的操作
  • 管理客户端与服务端连接的生命周期

三.编码实现

建议大家在实现之前可以先对zookeeper的一些API操作有一些了解,这些我在我的另外一篇文章做了详细的介绍,有需要的小伙伴可以移步去看看喔。

基于Springboot整合zookeeper实现对节点的创建、监听与判断

https://www.jb51.net/article/252816.htm

1.在集1.在zookeeper集群中创建一个servers节点

 create /servers "servers"

2.创建一个简单的springboot工程并引入zookeeper

 <!--引入对应的zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.7.1</version>
        </dependency>

3.编写DistributeServer(分布式服务端)

package com.canrioyuan.zookeepertest.zkcase1;

import org.apache.zookeeper.*;

import java.io.IOException;

//分布式服务器端
public class DistributeServer {

    //对应的zookeeper客户端连接,连接之间不能存在空格
    private String connectString = "192.168.154.133:2181,192.168.154.134:2181,192.168.154.135:2181";
    //超时时间,我们设置成2s
    private int sessionTimeout = 2000;
    //声明zookeeper服务器端
    private ZooKeeper zkServer;

    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        //1.获取zookeeper连接
        DistributeServer distributeServer = new DistributeServer();
        distributeServer.getConnect();

        //2.注册服务器
        distributeServer.register(args[0]);

        //3.启动
        distributeServer.business(args[0]);
    }

    private void business(String url) throws InterruptedException {
        System.out.println("url为" + url + "的服务器正在工作中");
        Thread.sleep(Long.MAX_VALUE);
    }

    private void register(String url) throws InterruptedException, KeeperException {
        //创建一个节点
        zkServer.create("/servers/" + url, url.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);

        System.out.println("url为" + url + "的服务器已经上线");
    }

    //创建到zookeeper的客户端连接
    private void getConnect() throws IOException {
        zkServer = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {

            }
        });
    }
}

4.分布式客户端

package com.canrioyuan.zookeepertest.zkcase1;

import org.apache.zookeeper.*;

import java.io.IOException;

import java.util.List;

//分布式客户端
public class DistributeClient {
    //对应的zookeeper客户端连接,连接之间不能存在空格
    private String connectString = "192.168.154.133:2181,192.168.154.134:2181,192.168.154.135:2181";
    //超时时间,我们设置成2s
    private int sessionTimeout = 2000;
    //声明zookeeper客户端
    private static ZooKeeper zkClient;
    private final String PARENT_NODE = "/servers";

    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        //1.获取zookeeper连接
        DistributeClient distributeClient = new DistributeClient();
        distributeClient.getConnect();

        //2.获取servers中的子节点信息
        distributeClient.getServerList();

        //3.业务逻辑
        distributeClient.business();
    }

    private void business() throws InterruptedException {
        System.out.println("客户端正在工作中......");
        Thread.sleep(Long.MAX_VALUE);
    }

    private void getServerList() throws InterruptedException, KeeperException {
        List<String> children = zkClient.getChildren(PARENT_NODE, true);

        for (String child : children) {
            System.out.println(child);
        }
    }

    private void getConnect() throws IOException {
        zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                try {

                    getServerList();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (KeeperException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

四.测试

1.启动客户端,开启监听

2.按照下面的流程启动服务器端

输入对应的服务器名,如我输入的就是:server1

启动成功后结果如下所示:

关注客户端的监听状况,发现已经监听到集群中已经出现了一个节点

为了使输出更明显,我们在zookeeper中的servers节点下创建一个server2的持久节点

此时客户端也监听到了集群中节点的变化

4.此时我们关闭服务器端,再来观察一下客户端的监听情况

此时我们发现客户端中只输出了server2这个节点

至此,我们便成功实现了简单的zookeeper集群对服务器端上下线的监听。

至此,我们zookeeper+Springboot实现服务器动态上下线监听教程就结束啦~

到此这篇关于zookeeper+Springboot实现服务器动态上下线监听的文章就介绍到这了,更多相关zookeeper动态上下线监听内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-06-23

浅谈Java(SpringBoot)基于zookeeper的分布式锁实现

通过zookeeper实现分布式锁 1.创建zookeeper的client 首先通过CuratorFrameworkFactory创建一个连接zookeeper的连接CuratorFramework client public class CuratorFactoryBean implements FactoryBean<CuratorFramework>, InitializingBean, DisposableBean { private static final Logger LOGG

zookeeper监听器原理的详解

1)监听原理详解: 1)首先要有一个main()线程 2)在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener). 3)通过connect线程将注册的监听事件发送给Zookeeper. 4)在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中. 5)Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程. 6)listener线程内部调用了process()方法. 2)常

SpringBoot整合Dubbo zookeeper过程解析

这篇文章主要介绍了SpringBoot整合Dubbo zookeeper过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 docker pull zookeeper docker run --name zk01 -p 2181:2181 --restart always -d 2e30cac00aca 表明zookeeper已成功启动 Zookeeper和Dubbo• ZooKeeperZooKeeper 是一个分布式的,开放源码的分布式

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

Springboot 整合 Dubbo/ZooKeeper 实现 SOA 案例解析

一.为啥整合 Dubbo 实现 SOA Dubbo 不单单只是高性能的 RPC 调用框架,更是 SOA 服务治理的一种方案. 核心: 远程通信,向本地调用一样调用远程方法. 集群容错 服务自动发现和注册,可平滑添加或者删除服务提供者. 我们常常使用 Springboot 暴露 HTTP 服务,并走 JSON 模式.但慢慢量大了,一种 SOA 的治理方案.这样可以暴露出 Dubbo 服务接口,提供给 Dubbo 消费者进行 RPC 调用.下面我们详解下如何集成 Dubbo. 二.运行 spring

viper配置框架的介绍支持zookeeper的读取和监听

viper作为配置框架,其功能非常的强大,我们没有理由不去了解一下.我们先看官网对它的功能简介: viper是完整配置解决方案,他可以处理所有类型和格式的配置文件,他有如下功能: 设置默认配置 支持读取 JSON TOML YAML HCL 和 Java 属性配置文件 监听配置文件变化,实时读取读取配置文件内容 读取环境变量值 读取远程配置系统 (etcd Consul) 和监控配置变化 读取命令 Flag 值 读取 buffer 值 读取确切值 乍一看,未免有相见恨晚之感,可仔细一想,不免脑袋

Android 常见的图片加载框架详细介绍

Android 常见的图片加载框架 图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行图片加载. 开源框架的源码还是挺复杂的,但使用较为简单.大部分框架其实都差不多,配置稍微麻烦点,但是使用时一般只需要一行,显示方法一般会提供多个重载方法,支持不同需要.这样会减少很不必要的麻烦.同时,第三方框架的使用较为方便,这大大的减少了工作量.提高了开发效率.

基于Tomcat 数据源的原理、配置、使用介绍

1.数据源的作用及操作原理 在程序代码中使用数据源是可以提升操作性能的,这种性能的提升依靠于运行的原理. 传统JDBC操作步骤 1.加载数据库驱动程序,数据库驱动程序通过CLASSPATH配置: 2.通过DriverManager类取得数据库连接对象: 3.通过Connection实例化PreparedStatement对象,编写SQL命令操作数据库: 4.数据库属于资源操作,操作完成后进行数据库的关闭以释放资源.如图所示: 对于不同的用户只有操作不同,但是对于1.2.4三个步骤很明显是一个重复

Node.js开源应用框架HapiJS介绍

一.HapiJS介绍 HapiJS是一个开源的.基于Node.js的应用框架,它适用于构建应用程序和服务,其设计目标是让开发者把精力集中于开发可重用的应用程序的业务逻辑,向开发者提供构建应用程序业务逻辑所需的基础设施.HapiJS目前的最新版本为7.2.0版. 二.HapiJS安装和项目配置 1.安装Hapi库 HapiJS的安装很简单,执行如下命令: 复制代码 代码如下: $ sudo npm install hapi -g hapi@7.2.0 /usr/local/lib/node_mod

thinkPHP5.0框架配置格式、加载解析与读取方法

本文实例讲述了thinkPHP5.0框架配置格式.加载解析与读取方法.分享给大家供大家参考,具体如下: ThinkPHP支持多种格式的配置格式,但最终都是解析为PHP数组的方式. PHP数组定义 返回PHP数组的方式是默认的配置定义格式,例如: //项目配置文件 return [ // 默认模块名 'default_module' => 'index', // 默认控制器名 'default_controller' => 'Index', // 默认操作名 'default_action' =

Java Spring-Cache key配置注意事项介绍

为了提升项目的并发性能,考虑引入本地内存Cache,对:外部数据源访问.Restful API调用.可重用的复杂计算 等3种类型的函数处理结果进行缓存.目前采用的是spring Cache的@Cacheable注解方式,缓存具体实现选取的是Guava Cache. 具体缓存的配置此处不再介绍,重点对于key的配置进行说明: 1.基本形式 @Cacheable(value="cacheName", key"#id") public ResultDTO method(i

freetds简介、安装、配置及使用介绍

什么是FreeTDS 简单的说FreeTDS是一个程序库,可以实现在Linux系统下访问微软的SQL数据库! FreeTDS 是一个开源(如果你喜欢可以称为自由)的程序库,是TDS(表列数据流 )协议的再次实现.它可以被用在Sybase的db-lib或者ct-lib库.它也包含一个ODBC的库.允许许多开源的应用软件比如Perl和PHP(或者你自己的c或C++程序)去连接到Sybase或 Microsoft SQL服务器.FreeTDS 以源码的形式被发布,几乎可以在任何操作系统上编译.意味着U

基于redis.properties文件的配置及说明介绍

在使用到redis连接池时,需要进行一些redis相关配置,redis.properties文件是由编程者自己在项目classpath路径(如eclipse的src)下建立的,并非从redis安装包中获取的. 1.redis.properties文件的建立 在eclipse中找到相应的项目,选择File-->New-->File,选中项目中的src目录,填入文件名称redis.properties,然后Finish就可以了. 2.redis.properties文件的配置与说明 redis.t

Django框架视图介绍与使用详解

本文实例讲述了Django框架视图介绍与使用.分享给大家供大家参考,具体如下: 视图 视图:即一个python函数,可以叫 视图函数,或者简称 视图,定义在 应用/views.py 文件中. 作用:接收并处理请求,调用M和T,响应请求(返回HttpResponse或其子类) 每一个用户请求,都对应着一个视图(和url地址),由视图处理请求后,再返回html页面内容给浏览器显示. URL配置及匹配 作用:建立url地址和视图函数的对应关系,当用户请求某个url地址时,让django能找到对应的视图

Nginx配置同一个域名同时支持http与https两种方式访问实现

Nginx配置同一个域名http与https两种方式都可访问,证书是阿里云上免费申请的 server { listen 80; listen 443 ssl; ssl on; server_name 域名; index index.html index.htm index.php default.html default.htm default.php; ssl_certificate /usr/local/nginx/cert/21402058063066221.pem; //下载申请后阿里s