目录
我们在之前的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