下图是 provider,consumer 和注册中心之间的拓扑图:

provider,consumer 以及管理控制台都是 zookeeper 的客户端,所以都和 zk 建立了tcp连接。

以接口 com.zhang.HelloService 为例:provider 启动时,会在 /dubbo/com.zhang.HelloService/providers 节点下建立一个临时节点,描述自己的信息。对应的,consumer 启动时,会在 /dubbo/com.zhang.HelloService/consumers 节点下建立一个临时节点,描述自己的信息。consumer 作为 zk 的客户端,它会读取 /dubbo/com.zhang.HelloService/providers 的数据,然后与 provider 建立tcp连接,并发起远程调用。consumer 同时也会 watch /dubbo/com.zhang.HelloService/providers 节点的子节点,/dubbo/com.zhang.HelloService/providers 子节点发生变化时,consumer 会收到 zk 的通知。而管理控制台,负责在 /dubbo/com.zhang.HelloService/configurators 节点下写override 参数,同样 consumer 也会 watch configurators 节点的变化。

 

问题:如果 consumer 已调用过 provider 的服务,且双方处于正常连接状态,关闭 provider 或 consumer 分别会发生什么(假设 kill -9 pid)?

1. 关闭 provider 进程,consumer 会感知到(因为2者之间有 tcp 连接),并且它会重试连接 provider,zk 也会感知到(因为 provider 是 zk 客户端),

provider 和 zk 的会话关闭后,zk 会删除 /dubbo/com.zhang.HelloService/providers 下的瞬时节点,consumer 发现 provider 被删除后,不会再重连。

2. 或者关闭 consumer 进程,provider 也会感知到,但是 provider 不会重连 consumer;当然 zk 也会知道,并且 zk 也会删除 /dubbo/com.zhang.HelloService/consumer 下的瞬时节点。

3. 如果 provider 重新上线,zk 会发现,然后通知 consumer(因为consumer 有watch),consumer 重新连接 provider。

 

posted on 2018-04-14 00:02  偶尔发呆  阅读(839)  评论(1编辑  收藏  举报