购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

6.5 案例分析:监听服务器动态上下线

本例中,我们使用ZooKeeper来监听多个服务器的动态上下线(服务器启动代表上线,服务器宕机或停止运行代表下线),监听的流程如图6-7所示。

图6-7 ZooKeeper监听服务器流程

监听的原理是:客户端通过向ZooKeeper指定的节点注册一个Watcher监听来获得该指定节点的状态变化情况。所有服务器启动的时候都连接ZooKeeper集群,每一个服务器都需要在ZooKeeper集群指定的节点(与客户端指定同一个节点)下注册一个属于自己的临时节点,节点关联的元数据为节点所属服务器的主机名。当服务器启动(上线)与停止(下线)时,会触发ZooKeeper的Watcher机制,从而通知客户端。客户端得到节点状态变化通知后,获取指定节点的所有子节点的元数据信息,即为当前在线服务器的主机名信息。

1.代码编写

客户端类的完整代码如下:

上述代码解析如下:

客户端通过实例化ZooKeeper对象连接到ZooKeeper集群,需要向ZooKeeper类的构造方法传入三个参数:连接字符串、连接超时时间和Watcher监听对象。Watcher是一个接口,此处的new Watcher(){}是一个匿名内部类,Watcher接口中有一个未实现的方法process(),因此必须对其实现。

当客户端与ZooKeeper服务器成功建立连接后,会立刻触发第一次Watcher事件,客户端会执行process()回调方法。此时,回调方法中的事件类型EventType为None(即event.getType()的值),事件路径为字符串null(即event.getPath()的值)。因此下方的if条件不成立,跳过if,执行最后的以获取当前在线服务器列表的getServerList()方法。

通过调用ZooKeeper对象的getChildren()方法,获取指定节点/serverGroup下的子节点列表,参数true代表对该节点注册Watcher监听(ZooKeeper的Watcher监听成功回调后立即失效,不会持续监听,若想持续对节点进行监听,则需要重复注册)。当该节点及其子节点的状态改变(该节点的删除和子节点的增加或删除)时,会触发Watcher,从而执行客户端连接ZooKeeper时注册的回调方法process()。

服务端类的完整代码如下:

上述代码解析如下:

服务器通过实例化对象ZooKeeper,连接ZooKeeper集群,此处Watcher对象设置为null,不需要监听。

服务器连接ZooKeeper成功后,会调用方法create()在指定的节点/serverGroup下创建一个属于自己的临时子节点,临时子节点创建成功后会触发客户端设置的Watcher监听(客户端监听到子节点状态发生变化,在回调方法中获取当前在线的子节点)。当服务器与ZooKeeper的连接会话断开时,子节点将被ZooKeeper删除,从而再次触发客户端的Watcher监听。子节点的名称前缀统一为“server”,ZooKeeper将根据子节点的创建顺序,在前缀的基础上追加相应的序号,例如“server0000000001”。子节点绑定的元数据为服务器的主机名。

2.程序运行

客户端与服务端的启动,在Eclipse中直接运行上述程序相应的main()方法即可。当然也可以将程序项目导出为jar包,发布到服务器上运行,此处直接在Eclipse中运行。

启动服务端时,为了方便观察,每次启动需要修改服务端main()方法中的变量hostname,以便在ZooKeeper中记录不同的主机名。具体运行步骤如下:

01 在ZooKeeper中创建一个用于注册监听的节点“/serverGroup”:

     [zk: localhost:2181(CONNECTED) 1] create /serverGroup
     Created /serverGroup

02 启动客户端,观察控制台输出信息如下:

     暂无服务器在线
     客户端正在处理业务逻辑...

03 启动主机名为serverHostName01的服务器,观察客户端控制台输出信息如下:

     服务器列表被更新:[serverHostName01]

04 启动主机名为serverHostName02的服务器,观察客户端控制台输出信息如下:

     服务器列表被更新:[serverHostName02, serverHostName01]

05 关闭主机名为serverHostName02的服务器,观察客户端控制台输出信息如下:

     服务器列表被更新:[serverHostName01]

整个客户端控制台输出信息如图6-8所示。

图6-8 客户端监听到的输出信息

到此,动态监听服务器上下线的例子就完成了。在实际开发中,根据自己的业务需求,在上述代码中添加相应的业务处理逻辑即可。 mulJcm5Q6SIs3aMPHrtqE+s5n+G/lXYPKtFRDxXS8G4rwuQA36sBkZ9UTqJYLx6t

点击中间区域
呼出菜单
上一章
目录
下一章
×