《Zookeeper》源码分析(七)之 NIOServerCnxn的工作原理

NIOServerCnxn

在上一节IOWorkRequest的doWork()方法中提到会将IO就绪的key通过handleIO()方法提交给NIOServerCnxn处理,一个NIOServerCnxn代表客户端与服务端的一个连接,它用于处理两者之间的交互,先看下其类结构:
在这里插入图片描述

从类结构可知,NIOServerCnxn继承了ServerCnxn,实现了StatsWatcher接口,所以说它本质上也是一个Watcher。再看下它的数据结构:
在这里插入图片描述

NIOServerCnxn主要负责客户端与服务端的数据的收发,其中,收到的数据存放于incomingBufferlenBuffer,待发送的存放于outgoingBuffers。接下来我们看下处理IO请求的doIO()方法。
在这里插入图片描述

如果是读就绪,则调用readPayload()处理接收到的数据;如果是写就绪,则调用handleWrite(k)发送数据。

readPayload()

读就绪事件
在这里插入图片描述

最终是将数据提交给服务器实例zkServer进行处理。

handleWrite(k)

写就绪事件
在这里插入图片描述

到这里不禁好奇outgoingBuffers的数据怎么获得的呢?NIOServerCnxn对外提供了sendBuffer(ByteBuffer... buffers)方法,当需要发送数据给客户端时可调用此方法
在这里插入图片描述

process()

NIOServerCnxn实现了Watcher接口,Watcher只有一个方法,即事件的回调方法process()
在这里插入图片描述

接下来我们详细分析下数据的序列化serialize(),从中可以看出zookeeper通信的响应协议。
在这里插入图片描述

至此,NIOServerCnxn的简单介绍就到此为止,总结一下它的功能,它是服务端与客户端通信的最底层处理,此外,它本身也是一个Watcher。

至此,服务端与客户端的通信环境分析就到此,在NIOServerCnxn.readPayload()方法中会把来自客户端的请求传递给服务器实例ZookeeperServer处理,zookeeper集群中有三种角色:LeaderFollowerObserver,不同的角色ZookeeperServer实例类型是不一样的,具体得等到选举结束确定角色后才会创建相应的实例,所以,从下文开始分析zookeeper的选举通信以及选举过程。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值