dubbo系列之zookeeper创建节点

dubbo系列之zookeeper创建节点

前期准备

先在Idea上安装zookeeper的可视化插件,方便查看节点变化。

启动zk服务端

源码构成

RegistryFactory类

1
registry.register(registedProviderUrl);//创建节点

debug进去看看吧

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
public void register(URL url) {
if (destroyed.get()){
return;
}
super.register(url);
failedRegistered.remove(url);
failedUnregistered.remove(url);
try {
// 向服务器端发送注册请求
doRegister(url);
} catch (Exception e) {
Throwable t = e;

// 如果开启了启动时检测,则直接抛出异常
boolean check = getUrl().getParameter(Constants.CHECK_KEY, true)
&& url.getParameter(Constants.CHECK_KEY, true)
&& !Constants.CONSUMER_PROTOCOL.equals(url.getProtocol());
boolean skipFailback = t instanceof SkipFailbackWrapperException;
if (check || skipFailback) {
if (skipFailback) {
t = t.getCause();
}
throw new IllegalStateException("Failed to register " + url + " to registry " + getUrl().getAddress() + ", cause: " + t.getMessage(), t);
} else {
logger.error("Failed to register " + url + ", waiting for retry, cause: " + t.getMessage(), t);
}

// 将失败的注册请求记录到失败列表,定时重试
failedRegistered.add(url);
}
}

AbstractZookeeperClient()

1
2
3
4
5
6
7
8
9
10
11
public void create(String path, boolean ephemeral) {
int i = path.lastIndexOf('/');
if (i > 0) {
create(path.substring(0, i), false);
}
if (ephemeral) {
createEphemeral(path);//创建临时节点
} else {
createPersistent(path);//创建持久化节点
}
}

AbstractZookeeperClient.create//dubbo/com.alibaba.dubbo.demo.DemoService/providers/ dubbo%3A%2F%2F192.168.100.52%3A20880%2Fcom.alibaba.dubbo.demo.DemoService%3Fanyhost%3Dtrue%26 application%3Ddemo-provider%26dubbo%3D2.0.0%26generic%3Dfalse%26interface%3D com.alibaba.dubbo.demo.DemoService%26loadbalance%3Droundrobin%26methods%3DsayHello%26owner%3 Dwilliam%26pid%3D2416%26side%3Dprovider%26timestamp%3D1474276306353

–>createEphemeral(path);//临时节点 dubbo%3A%2F%2F192.168.100.52%3A20880%2F………….
–>createPersistent(path);//持久化节点 dubbo/com.alibaba.dubbo.demo.DemoService/providers

zk持久化节点 和临时节点有什么区别?

持久化节点:一旦被创建,触发主动删除掉,否则就一直存储在ZK里面。
临时节点:与客户端会话绑定,一旦客户端会话失效,这个客户端端所创建的所有临时节点都会被删除。

  • 服务提供者能实现失效踢出是什么原理(高频题)

  • zookeeper的有哪些节点,他们有什么区别?讲一下应用场景

    答:在分布式系统中,我们常常需要知道某个机器是否可用,传统的开发中,可以通过Ping某个主机来实现,Ping得通说明对方是可用的,相反是不可用的,ZK 中我们让所有的机其都注册一个临时节点,我们判断一个机器是否可用,我们只需要判断这个节点在ZK中是否存在就可以了,不需要直接去连接需要检查的机器,降低系统的复杂度。