百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> php+nodeJs+thrift协定,实现zookeeper节点数据主动发明
分享文章到:

php+nodeJs+thrift协定,实现zookeeper节点数据主动发明

发布时间:09/01 来源:未知 浏览: 关键词:
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节点数据主动发明的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有155人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板