Zookeeper(三)注册内容,发现内容

在这里插入图片描述
我们在之前的RMI实现RPC中,

RMI实现RPC: https://blog.csdn.net/u014565127/article/details/113583536

是由一个应用直接访问另一个应用中的方法,其中的请求路径也都是写死的:
在这里插入图片描述
其实我们应该使用Zookeeper来作为我们的注册中心,服务的提供方把自己的服务注册在Zookeeper上,而服务的消费方去请求Zookeeper来获得服务的地址,也就是:
在这里插入图片描述
接下来,我们就使用Zookeeper类完成服务的注册,以及内容的发现。

一、向Zookeeper中注册内容

1. 新建项目ZookeeperClient

在这里插入图片描述

2. 导入依赖

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.5.5</version>
</dependency>

3. 在Zookeeper中创建目录

使用zookeeper的客户端命令工具创建/demo:

[zk: localhost:2181(CONNECTED) 25] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 26] create /demo
Created /demo
[zk: localhost:2181(CONNECTED) 27] ls /
[demo, zookeeper]

4. 编写代码

package com.veeja;

import org.apache.zookeeper.*;

import java.io.IOException;

/**
 * @Author veeja
 * 2021/2/4 9:49
 */
public class SendContent {
    public static void main(String[] args) {

        try {
            /*
             * 创建Zookeeper对象:
             * 参数1 :Zookeeper ip+端口号
             * 参数2 :访问超时设置
             * 参数3 :通过观察者模式发出访问回复:当连接成功后,编写成功信息
             */
            ZooKeeper zookeeper = new ZooKeeper("192.168.152.128:2181", 100 * 1000, new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    System.out.println("获取连接");
                }
            });

            /**
             * 发送内容 向Zookeeper服务器中
             *      参数1:发送的文件
             *      参数2:发送的内容
             *      参数3:权限
             *      参数4:内容的模式
             */
            String content = zookeeper.create(
                    "/demo/rmi-address",
                    "rmi:localhost:8080/demoService".getBytes(),
                    ZooDefs.Ids.OPEN_ACL_UNSAFE,
                    CreateMode.PERSISTENT_SEQUENTIAL);

            System.out.println("content = " + content);

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

5. 运行

我们运行一下,如果报错——org.apache.zookeeper.KeeperException$ConnectionLossException
就参考这个文章:
https://blog.csdn.net/u014565127/article/details/113629576

运行结果:

获取连接
content = /demo/rmi-address0000000000

我们进入Zookeeper的终端,看一下有没有新的内容和节点ls -R /

[zk: localhost:2181(CONNECTED) 30] ls -R /
/
/demo
/zookeeper
/demo/rmi-address0000000000
/zookeeper/config
/zookeeper/quota

我们可以看到/demo下面是多了rmi-address0000000000的。
我们get一下它的内容get /demo/rmi-address0000000000

[zk: localhost:2181(CONNECTED) 31] get /demo/rmi-address0000000000
rmi:localhost:8080/demoService

我们把上面的代码运行一遍,然后查看Zookeeper的目录,可以看到,它是会递增的添加一条的,但是其中的内容都是一样的。

[zk: localhost:2181(CONNECTED) 32] ls -R /
/
/demo
/zookeeper
/demo/rmi-address0000000000
/demo/rmi-address0000000001
/zookeeper/config
/zookeeper/quota

二、获取内容

1. 新建类

package com.veeja;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;

import java.io.IOException;
import java.util.List;

/**
 * @Author veeja
 * 2021/2/4 11:15
 */
public class ReciveContent {
    public static void main(String[] args) {

        try {
            // 1. 创建Zookeeper对象
            ZooKeeper zookeeper = new ZooKeeper("192.168.152.128:2181", 100 * 1000, new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    System.out.println("获取连接...");
                }
            });

            /**
             * 2. 从Zookeeper中获取内容
             */
            // 2.1 获取节点内容
            List<String> list = zookeeper.getChildren("/demo", false);
            System.out.println(list);
            // 2.2
            for (String child : list) {
                byte[] result = zookeeper.getData("/demo/" + child, false, null);
                System.out.println(new String(result));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        }
    }
}

2. 运行结果:

获取连接...
[rmi-address0000000000, rmi-address0000000001]
rmi:localhost:8080/demoService
rmi:localhost:8080/demoService
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值