一.成绩布景
php能够CLI模式模式衔接zookeeper(上面简称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协定(这里应用thrift协定),拜访内陆node主过程效劳,来猎取zk节点数据。
这样做有三点益处:
1.完成zk节点变动的主动发现;
2.php以及node通讯正在同一台效劳器上,没有走网管,速率快,稳固性牢靠
3.thrift协定间接操作套接字传输数据,比http效劳要快,能够近似看做php挪用本人的办法
三.详细完成
1.搭建zookeeper效劳,这里我搭了一个5台zk效劳的伪集群(zk效劳的搭建这里没有做过多引见),测试zk效劳能否能失常写入与读取节点数据
辨别启动五台zk效劳器
./server001/bin/zkServer.sh start ./server002/bin/zkServer.sh start ./server003/bin/zkServer.sh start ./server004/bin/zkServer.sh start ./server005/bin/zkServer.sh start ![zookeeper集群启动][1]
启动胜利后,测试节点能否可以失常写入读取(这里提前创立了一个/zk_test节点)
启动zk客户端
./bin/zkCli.sh /zk_test测试写入123:set /zk_test 123 发现能够失常写入与读取 ![zk写入与读取][2]
2.创立node效劳
界说thrift提供的效劳,新建thrift文件,界说前往zk数据的效劳:zkDataService,效劳中有一个办法zkData前往节点数据
namespace php tutorial service zkDataService { string zkData() }
依据thrift协定天生效劳端可客户真个两头代码(天生两头代码我放正在windows上实现),
C:\Users\77388\AppData\thrift-0.10.0.exe -r --gen js:node zkData.thrift
此时会正在文件夹中天生两头代码,正在gen-nodejs文件夹中
![天生node端两头代码][3]
node装置zookeeper模块:cnpm install node-zookeeper-client,编写子过程support.js,主动发现zk节点数据变卦
console.log('pid in worker:', process.pid); process.on('message', function(msg) { console.log('3:', msg); }); var i=0; var zookeeper = require('node-zookeeper-client'); var client = zookeeper.createClient('localhost:2181'); var path = '/zk_test';//节点称号 function getData(client, path) { client.getData( path, function (event) { console.log('Got event: %s', event); getData(client, path); }, function (error, data, stat) { if (error) { console.log('Error occurred when getting data: %s.', error); return; } process.send('zookeeper节点数据'+data.toString('utf8'));//告诉主过程zk节点数据 } ); } client.once('connected', function () { console.log('Connected to ZooKeeper.'); getData(client, path); }); client.connect(); process.emit('message', '======');
编写主过程server.js,完成thrift界说的效劳,并正在主过程中启动子过程
var childprocess = require('child_process'); var worker = childprocess.fork('./support.js'); console.log('pid in master:', process.pid); var childMessage=""; //监听子过程事情 worker.on('message', function(msg) { childMessage=msg; console.log('1:', msg);//监听子过程zk数据,并将zk节点数据打印 }) process.on('message', function(msg) { console.log('2:', msg); })
worker.send('主过程给子过程通报的数据');
//触发事情 message process.emit('message', '------'); var thrift = require("thrift"); var zkDataService = require("./gen-nodejs/zkDataService"); var ttypes = require("./gen-nodejs/tutorial_types"); var data = {}; var server = thrift.createServer(zkDataService, { zkData: function(result) { result(null, childMessage);//将zk节点数据前往 } }); server.listen(9090);
启动nodeJs主过程:node server.js
3.创立php效劳,正在php效劳中也要天生thrift两头件顺序,与node端相似,php端挪用node主过程server.js的zkData办法,猎取zk节点数据
<?php namespace tutorial\php; error_reporting(E_ALL); require_once __DIR__.'/lib/Thrift/ClassLoader/ThriftClassLoader.php'; require_once __DIR__.'/gen-php/tutorial/zkDataService.php'; use Thrift\ClassLoader\ThriftClassLoader; $GEN_DIR = realpath(dirname(__FILE__).'/..').'/gen-php'; $loader = new ThriftClassLoader(); $loader->registerNamespace('Thrift', __DIR__ . '/lib'); $loader->registerDefinition('shared', $GEN_DIR); $loader->registerDefinition('tutorial', $GEN_DIR); $loader->register(); /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ use Thrift\Protocol\TBinaryProtocol; use Thrift\Transport\TSocket; use Thrift\Transport\THttpClient; use Thrift\Transport\TBufferedTransport; use Thrift\Exception\TException; try { if (array_search('--http', $argv)) { $socket = new THttpClient('localhost', 8080, '/php/PhpServer.php'); } else { $socket = new TSocket('192.168.0.105', 9090); } $transport = new TBufferedTransport($socket, 1024, 1024); $protocol = new TBinaryProtocol($transport); $client = new \tutorial\zkDataServiceClient($protocol); $transport->open(); $result= $client->zkData(); print "$result";//打印zk节点数据 $transport->close(); } catch (TException $tx) { print 'TException: '.$tx->getMessage()."\n"; } ?>
启动php效劳,发现失常猎取zk数据
修正zookeeper数据,正在启动php效劳,发现能够主动发现
总结:
自此,php以及nodeJS相合作,实现php效劳对zk数据的主动发现就实现了。架构的全体思绪是node子过程完成zk的主动发现,node主过程保护一个zk节点数据的同享变量,其余效劳要想应用zk节点数据时,从node主过程中猎取。
以上就是php+nodeJs+thrift协定,完成zookeeper节点数据主动发现的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学
抱歉,评论功能暂时关闭!