中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php+nodeJs+thrift協議如何實現zookeeper節點數據自動發現

發布時間:2020-10-16 14:21:47 來源:億速云 閱讀:193 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關php+nodeJs+thrift協議如何實現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

php+nodeJs+thrift協議如何實現zookeeper節點數據自動發現

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數據

php+nodeJs+thrift協議如何實現zookeeper節點數據自動發現

修改zookeeper數據,在啟動php服務,發現可以自動發現

php+nodeJs+thrift協議如何實現zookeeper節點數據自動發現

總結:

自此,php和nodeJS相協作,完成php服務對zk數據的自動發現就完成了。架構的整體思路是node子進程實現zk的自動發現,node主進程維護一個zk節點數據的共享變量,其他服務要想使用zk節點數據時,從node主進程中獲取。

關于php+nodeJs+thrift協議如何實現zookeeper節點數據自動發現就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

封开县| 隆德县| 广安市| 门源| 清水河县| 麟游县| 彭阳县| 柳州市| 雷山县| 长宁县| 罗山县| 晋中市| 富平县| 万盛区| 寿宁县| 堆龙德庆县| 白朗县| 邵阳市| 北辰区| 双峰县| 宜兰县| 句容市| 湖州市| 桐柏县| 永丰县| 淮南市| 道真| 正定县| 镇康县| 措勤县| 松阳县| 元氏县| 镇雄县| 霍山县| 静宁县| 涟水县| 甘肃省| 惠州市| 合作市| 鄂托克前旗| 信宜市|