实现一个自己的RPC框架6.0

前言


此版本加入了ZooKeeper作为服务治理的方法。整体的流程很简单,服务者通过Zookeeper注册服务,消费者通过ZooKeeper来获取提供服务的服务者,从而实现对应方法调用。

一、ZooKeeper简介

ZooKeeper是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

这边我用的是ZK的Java客户端实现相关模块的编码,通过代码简单介绍一下相关的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

public class myTest {

private String connectString = "10.66.104.159:2181";
private Integer sessionTimeout = 2000;
ZooKeeper zkClient;


/**
* 初始化
* @throws IOException
*/
public void init() throws IOException {
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
public void process(WatchedEvent watchedEvent) {
try {
getDataAndWatch();
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}

/**
* 创建结点
*/
public void createNode() throws KeeperException, InterruptedException {
String path = zkClient.create("/myTest", "hello".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(path);
}

/**
* 获取子节点并监控结点的变化
*/
public void getDataAndWatch() throws KeeperException, InterruptedException {
List<String> children = zkClient.getChildren("/", true);
for (String child : children) {
System.out.println(child);
}
}

/**
* 判断结点是否存在
*/
public void exist() throws KeeperException, InterruptedException {
Stat exists = zkClient.exists("/myTest", false);
System.out.println(exists);
}
}

所以回到RPC中,服务端只要向ZK中进行服务注册,而客户端当需要调用对应的服务时,进行负载均衡选择一台服务器进行服务的调用。

二、代码实现

实现很简单,我已经将相应的版本上传到github中,这边就不贴实现了。其实在dubbo中,注册中心不仅仅可以使用ZK的方法,还能使用Multicast、Nacos、Redis、Simple等,可访问其官网来查看具体的使用。但是ZK是其默认的注册中心方法。