php + nodeJs +节俭协议如何实现管理员节点数据自动发现

  介绍

这篇文章将为大家详细讲解有关php + nodeJs +节俭协议如何实现管理员节点数据自动发现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

<强>一。问题背景

php可以CLI模式模式连接管理员(下面简称zk),并实现zk节点数据的自动发现,这里不做过多叙述。但web服务器中,php只能主动连接zk以获得节点数据,做不到zk数据的自动发现。其次,php web服务,也难以和php CLI模式下的服务共享数据变量(CLI模式下zk数据做成共享变量)。这就导致如果并发量大的话,每一个http请求php都会去连接zk, zk集群的压力会很大,其次,每一个请求都会连接zk,请求结束又释放zk连接,zk的连接与释放过于频繁。

<强>二。解决思路

nodeJs多进程间可以通信,可以解决php服务难以实现共享变量的问题.nodeJs可以在主进程中抛出一个子进程,子进程中实现zk的自动发现,子进程侦察到zk节点数据变化时,主动通知主进程.node主进程写一个服务,像外界提供zk的数据。php web服务需要zk节点数据时,通过RPC协议(这里使用节俭协议),访问本地节点主进程服务,来获取zk节点数据。

这样做有三点好处:

1。实现zk节点变化的自动发现,

2. php和节点通信在同一台服务器上,不走网管,速度快,稳定性可靠

3.节俭协议直接操作套接字传输数据,比http服务要快,可以近似看作php调用自己的方法

<强>三。具体实现

1。搭建动物园管理员服务,这里我搭了一个5台zk服务的伪集群(zk服务的搭建这里不做过多介绍),测试zk服务是否能正常写入与读取节点数据

分别启动五台zk服务器

/server001/bin/zkServer。sh开始/server002/bin/zkServer。sh开始/server003/bin/zkServer。sh开始/server004/bin/zkServer。sh开始/server005/bin/zkServer。sh开始   ![饲养员集群启动][1]

启动成功后,测试节点是否能够正常写入读取(这里提前创建了一个/zk_test节点)

启动zk客户端

/bin/zkCli.sh/zk_test测试写入123:设置/zk_test 123发现可以正常写入与读取   ! [zk写入与读取][2]

2。创建节点服务

定义节俭提供的服务,新建节俭文件,定义返回zk数据的服务:zkDataService,服务中有一个方法zkData返回节点数据

名称空间php教程   服务zkDataService {   字符串zkData ()   }

根据节俭协议生成服务端可客户端的中间代码(生成中间代码我放在windows上完成),

C: \ 77388 \ \用户AppData \ thrift-0.10.0。exe - r——创js:节点zkData。节俭

此时会在文件夹中生成中间代码,在gen-nodejs文件夹中

![生成节点端中间代码][3]

节点安装饲养员模块:cnpm安装node-zookeeper-client,编写子进程支持。js,自动发现zk节点数据变更

console.log (& # 39; pid工人:& # 39;,process.pid);   至(& # 39;消息# 39;,函数(msg) {   console.log (& # 39; 3: & # 39;, msg);   });   var=0;   var饲养员=要求(& # 39;node-zookeeper-client& # 39;);   var客户=zookeeper.createClient (& # 39; localhost: 2181 & # 39;);=& # 39;var路径/zk_test& # 39;;//节点名称      函数getData(客户端,路径){   client.getData (   路径,   函数(事件){   console.log(& # 39;事件:% & # 39;,事件);   getData(客户端、路径);   },   函数(错误、数据统计){   如果(错误){   console.log(& # 39;获取数据时发生错误:% s # 39;,错误);   返回;   }   process.send(& # 39;管理员节点数据& # 39;+ data.toString (& # 39; use utf8 # 39;));//通知主进程zk节点数据   }   );   }      client.once(& # 39;连接# 39;,函数(){   console.log(& # 39;连接到动物园管理员# 39;公司);   getData(客户端、路径);   });      client.connect ();   process.emit(& # 39;消息# 39;,& # 39;======& # 39;);

编写主进程服务器。js,实现节俭定义的服务,并在主进程中启动子进程

var childprocess=要求(& # 39;child_process& # 39;);   var工人=childprocess.fork (& # 39;。/support.js& # 39;);   console.log (& # 39; pid主:& # 39;,process.pid);   var childMessage=?“;//监听子进程事件   worker.on(& # 39;消息# 39;,函数(msg) {   childMessage=味精;   console.log (& # 39; 1: & # 39;, msg);//监听子进程zk数据,并将zk节点数据打印   })   至(& # 39;消息# 39;,函数(msg) {   console.log (& # 39; 2: & # 39;, msg);   })

php + nodeJs +节俭协议如何实现管理员节点数据自动发现