国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

MingjunYang / 2602人閱讀

摘要:可以在主進程中拋出一個子進程,子進程中實現的自動發現,子進程偵察到節點數據變化時,主動通知主進程。架構的整體思路是子進程實現的自動發現,主進程維護一個節點數據的共享變量,其他服務要想使用節點數據時,從主進程中獲取。

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:Users77388AppData	hrift-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節點數據

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 ThriftProtocolTBinaryProtocol;
use ThriftTransportTSocket;
use ThriftTransportTHttpClient;
use ThriftTransportTBufferedTransport;
use ThriftExceptionTException;

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 	utorialzkDataServiceClient($protocol);

  $transport->open();

  $result= $client->zkData();
  print "$result";//打印zk節點數據

  $transport->close();

} catch (TException $tx) {
  print "TException: ".$tx->getMessage()."
";
}

?>

啟動php服務,發現正常獲取zk數據

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25768.html

相關文章

  • PowerDotNet平臺化軟件架構設計與實現系列(04):服務治理平臺

    摘要:的服務治理平臺發源于早期的個人項目。客戶端發現模式要求客戶端負責查詢注冊中心,獲取服務提供者的列表信息,使用負載均衡算法選擇一個合適的服務提供者,發起接口調用請求。系統和系統之間,少不了數據的互聯互通。隨著微服務的流行,一個系統內的不同應用進行互聯互通也是常態。 PowerDotNet的服務治理平臺發源于早期的個人項目Power.Apix。這個項目借鑒了工作過的公司的服務治理方案,站在...

    reclay 評論0 收藏0
  • RPC框架原理及從零實現系列博客(一):思路篇

    摘要:等之所以支持跨語言,是因為他們自己定義了一套結構化數據存儲格式,如的,用于編解碼對象,作為各個語言通信的中間協議。 前段時間覺得自己一直用別人的框架,站在巨人的肩膀上,也該自己造造輪子了 一時興起 就著手寫起了RPC框架 這里寫了系列博客拿給大家分享下 這篇是開篇的思路篇 項目最終的代碼放在了我的github上https://github.com/wephone/Me... 歡迎sta...

    tracy 評論0 收藏0
  • Dubbo 一篇文章就夠了:從入門到實戰

    摘要:啟動容器,加載,運行服務提供者。服務提供者在啟動時,在注冊中心發布注冊自己提供的服務。注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數據給消費者。 一 為什么需要 dubbo 很多時候,其實我們使用這個技術的時候,可能都是因為項目需要,所以,我們就用了,但是,至于為什么我們需要用到這個技術,可能自身并不是很了解的,但是,其實了解技術的來由及背景知識,對...

    tomener 評論0 收藏0

發表評論

0條評論

MingjunYang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<