php+nodeJs+thrift协议,实现zookeeper节点数据自动发现-php教程

资源魔 36 0
php是当下最盛行的web效劳器端言语,zookeeper是年夜型散布式协同对象,本文正在这里引见一种架构完成php效劳器关于zookeeper数据变动的主动监听。

一.成绩布景

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

d1c71706429224613b3eea6a8918c45.png

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数据

1c6f99be20b06bd896b021b181a860c.png

修正zookeeper数据,正在启动php效劳,发现能够主动发现

4ed29e62ed40ac26bbb2014fe0c380b.png

总结:

自此,php以及nodeJS相合作,实现php效劳对zk数据的主动发现就实现了。架构的全体思绪是node子过程完成zk的主动发现,node主过程保护一个zk节点数据的同享变量,其余效劳要想应用zk节点数据时,从node主过程中猎取。

以上就是php+nodeJs+thrift协定,完成zookeeper节点数据主动发现的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!