1. 程式人生 > >學習筆記:Zookeeper 應用案例(上下線動態感知)

學習筆記:Zookeeper 應用案例(上下線動態感知)

1、Zookeeper 應用案例(上下線動態感知)

8.1 案例1——伺服器上下線動態感知

8.1.1 需求描述

某分散式系統中,主節點可以有多臺,可以動態上下線

任意一臺客戶端都能實時感知到主節點伺服器的上下線

8.1.2 設計思路

8.1.3 程式碼開發

1、客戶端實現

package cn.com.toto.zkonlineoroffline;

import java.util.ArrayList;

import java.util.List;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooKeeper;

public class DistributedClient {

    private static final String connectString = "192.168.106.80:2181,192.168.106.81:2181,192.168.106.82:2181";

    private static final int sessionTimeout = 2000;

     private static final String parentNode = "/servers";

     // 注意:加volatile的意義何在?

     private volatile List<String> serverList;

     private ZooKeeper zk = null;

     /**

      * 建立到zk的客戶端連線

      *

      * @throws Exception

      */

     public void getConnect() throws Exception {

         zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {

              @Override

              public void process(WatchedEvent event) {

                   // 收到事件通知後的回撥函式(應該是我們自己的事件處理邏輯)

                   try {

                       //重新更新伺服器列表,並且註冊了監聽

                       getServerList();

                   } catch (Exception e) {

                   }

              }

         });

     }

     /**

      * 獲取伺服器資訊列表

      *

      * @throws Exception

      */

     public void getServerList() throws Exception {

         // 獲取伺服器子節點資訊,並且對父節點進行監聽

         List<String> children = zk.getChildren(parentNode, true);

         // 先建立一個區域性的list來存伺服器資訊

         List<String> servers = new ArrayList<String>();

         for (String child : children) {

              // child只是子節點的節點名

              byte[] data = zk.getData(parentNode + "/" + child, false, null);

              servers.add(new String(data));

         }

         // 把servers賦值給成員變數serverList,已提供給各業務執行緒使用

         serverList = servers;

         //列印伺服器列表

         System.out.println(serverList);

     }

     /**

      * 業務功能

      *

      * @throws InterruptedException

      */

     public void handleBussiness() throws InterruptedException {

         System.out.println("client start working.....");

         Thread.sleep(Long.MAX_VALUE);

     }

     public static void main(String[] args) throws Exception {

         // 獲取zk連線

         DistributedClient client = new DistributedClient();

         client.getConnect();

         // 獲取servers的子節點資訊(並監聽),從中獲取伺服器資訊列表

         client.getServerList();

         // 業務執行緒啟動

         client.handleBussiness();

     }

}

2、伺服器端實現

package cn.com.toto.zkonlineoroffline;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooKeeper;

import org.apache.zookeeper.Watcher.Event.KeeperState;

import org.apache.zookeeper.ZooDefs.Ids;

import org.apache.zookeeper.data.Stat;

public class DistributedServer {

     private static final String CONNECT_STRING = "192.168.106.80:2181,192.168.106.81:2181,192.168.106.82:2181";

     private static final int SESSION_TIME_OUT = 2000;

     private static final String PARENT_NODE = "/servers";

     private ZooKeeper zk = null;

     CountDownLatch countDownLatch = new CountDownLatch(1);

     /**

      * 建立到zk的客戶端連線

      *

      * @throws Exception

      */

     public void getConnect() throws Exception {

         zk = new ZooKeeper(CONNECT_STRING, SESSION_TIME_OUT, new Watcher() {

              @Override

              public void process(WatchedEvent event) {

                   if(event.getState()==KeeperState.SyncConnected){

                       countDownLatch.countDown();

                   }

              }

         });

         countDownLatch.await();

     }

     /**

      * 向zk叢集註冊伺服器資訊

      *

      * @param hostname

      * @throws Exception

      */

     public void registerServer(String hostname) throws Exception {

         Stat exists = zk.exists(PARENT_NODE, false);

         if(exists==null) zk.create(PARENT_NODE, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

         String path = zk.create(PARENT_NODE + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);

         System.out.println(hostname + "is online.." + path);

     }

     /**

      * 業務功能

      *

      * @throws InterruptedException

      */

     public void handleBussiness(String hostname) throws InterruptedException {

         System.out.println(hostname + "start working.....");

         Thread.sleep(Long.MAX_VALUE);

     }

     public static void main(String[] args) throws Exception {

         DistributedServer server = new DistributedServer();

         // 獲取zk連線

         server.getConnect();

         // 利用zk連線註冊伺服器資訊(主機名)

         server.registerServer(args[0]);

         // 啟動業務功能

         server.handleBussiness(args[0]);

     }

}

相關推薦

學習筆記Zookeeper 應用案例(下線動態感知)

1、Zookeeper 應用案例(上下線動態感知)8.1 案例1——伺服器上下線動態感知8.1.1 需求描述某分散式系統中,主節點可以有多臺,可以動態上下線任意一臺客戶端都能實時感知到主節點伺服器的上下線8.1.2 設計思路 8.1.3 程式

git學習筆記一臺電腦配置兩個git賬戶

idt ica 項目 auth 開源中國 重復 gmail name 微軟 如何在一臺電腦上配置兩個git賬戶,現在雲端倉庫很多,有開源中國的 gitee.com 微軟的 github.com 還有 gitlab.com 和 bitbucket.org 等等,下面是具體步驟

學習筆記楊輝三角形莫隊(組合數莫隊)(LULU胡策)

與唐林康的決戰在即,麵筋哥需要一件壓場子的終極武器。 麵筋哥手上有 M 個麵筋,能量值分別為 1-M 的整數。現在麵筋哥想要利用這些麵筋制 作他的終極武器:Ex 麵筋棒。Ex 麵筋棒是一種能夠發射強大劍氣的能量武器。它由一些面 筋按次序連線而成。Ex 麵筋棒可能會發射失敗,麵筋哥無法承受

學習筆記beego檔案的傳,包括圖片

檔案的上傳 首先我從官方文件中摘抄了beego上傳檔案的一些內容,可以更好地幫助理解: 在 beego 中你可以很容易的處理檔案上傳,就是別忘記在你的 form 表單中增加這個屬性 enctype="multipart/form-data",否則你的瀏覽器不

Servlet學習筆記 網頁應用Blog的迭代

簡介:跟隨林信良老師的《JSP&Servlet學習筆記》,迭代自己的網頁應用Blog。 一、概括 1 - 功能類 登入 :已有賬戶,登入成功顯示歷史動態。 註冊 :沒有賬戶,組冊成功顯示歡迎介面。 釋出 :登入成功,新增動態資訊。 刪除 :

h5學習筆記 css佈局案例練習

今天練習一下css相關的佈局,沒有寫互動內容。在css佈局中,發現也不少不熟悉的地方。只是沒有形成概念,其次對一些用法比較模糊。日後需要加強一下這些。對平衡的兩個div應該如何處理,還要繼續想想辦法。

(轉載)Zookeeper實現分散式應用系統伺服器下線動態感知

來到一家新公司,要求做zookeeper註冊中心的伺服器上線下線的動態感知。結果把要求看成了zookepper註冊中心的動態感知。哎,好尷尬呀!結果看到這篇文章我才恍然大悟。講的也很細緻!特發表一篇文章做為收藏。 我們現在有一個分散式應用系統提供服務,伺服器有很多臺,伺服器

學習筆記Zookeeper選舉機制

1、Zookeeper選舉機制Zookeeper雖然在配置檔案中並沒有指定master和slave但是,zookeeper工作時,是有一個節點為leader,其他則為followerLeader是通過內部的選舉機制臨時產生的9.1 zookeeper的選舉機制(zk的資料一致性核心演算法paxos)以一個簡

學習筆記案例】財政收入影響因素分析及預測模型

6.0 pearson end 4.5 pandas 問題 特征 ase max() 案例來源:《Python數據分析與挖掘實戰》第13章 案例背景與挖掘目標 輸入數據: 《某市統計年鑒》(1995-2014) 挖掘目標: 梳理影響地方財政收入的關鍵特征,分析、識別影響地

學習筆記案例】中醫證型關聯規則挖掘

order 卡方檢驗 eat 業務 並行 pen fill lin 區分 案例來源:《Python數據分析與挖掘實戰》第8章 案例背景與挖掘目標 輸入數據: 挖掘目標: 借助三陰乳腺癌患者的病理信息,挖掘患者的癥狀與中醫證型之間的關聯關系 對截斷治療提供依據,挖掘潛性證素

第九周學習筆記ADO.Net中DataSet的應用

ADO.Net中DataSet的應用 一.思維導圖       一.相關知識點 三大特性 DataSet物件的三大特性: (1) 獨立性。DataSet獨立於各種資料來源。 (2) 離線(斷開)和連線。 (3) DataSet物件是一個可以用XML形式表示的資

Java技術學習筆記過濾器鏈的實現方法、配置和案例分析

今天給大家分享的是Java技術學習筆記:過濾器鏈的實現方法、配置和案例分析。 過濾器能夠對網站中的各種內容進行過濾(頁面、Servlet、圖片、檔案),可以在網站內容請求和響應時進行一些操作,完成一些通用的功能。 過濾器鏈 在專案中可以建立多個過濾器,網站內容可能會經過多個過濾器,多個過濾器就形成了過濾

moquette改造筆記(五)裝置連線頻繁下線或者相互頂替出現的裝置下線狀態錯亂問題

發現問題 在moquette使用中發現在裝置頻繁上下線和兩個裝置ClientId一樣相互頂替連線的情況下,InterceptHandler的onConnect和onConnectionLost的方法呼叫沒有先後順序,如果在這兩個方法裡面來記錄裝置上下線狀態,會造成狀

學習筆記在android 使用 opencv

這篇筆記我預料肯定會很長,因為他是我學習了賈老師(賈志剛),OpenCV android 開發實戰的記錄筆記,因為怕後面難得找所以肯定會盡量累積在一篇,或者二篇文章。 今天看到一句話,我認為我以後得學習,就應該以他為標準,這是來自李沫《動手學深度學習》中得一句話:電腦科學是一門動手的科學,沒

機器學習筆記tensorflow實現卷積神經網路經典案例--識別手寫數字

從識別手寫數字的案例開始認識神經網路,並瞭解如何在tensorflow中一步步建立卷積神經網路。 安裝tensorflow 資料來源 kaggle新手入門的數字識別案例,包含手寫0-9的灰度值影象的csv檔案,下載地址:https://www.

Flask學習筆記建立一個簡單的Flask應用

1. 做好準備工作進入專案主目錄啟用虛擬環境2. 建立app包:在flask中,含有名為 __init__.py 檔案的子目錄被視為包,可以被匯入。在命令列輸入以下命令,建立一個名為app的目錄:(venv) $ mkdir app在app目錄中建立一個名為__init__.

Zookeeper學習筆記簡單註冊中心

  zookeeper可以作為微服務註冊中心,spring cloud也提供了zookeeper註冊中心的支援。   本文介紹如何實現一個簡單的zookeeper註冊中心,主要的實現方式: n個服務提供者對外提供http介面獲取資料,這些服務提供者把自己的主機、埠資訊註冊到zook

《機器學習實戰》學習筆記k-近鄰演算法的兩個應用場景

之前學習了k-近鄰演算法的實現後,參考《機器學習實戰》中的例子進行了k-近鄰演算法的測驗,主要測試了針對約會網站和手寫識別系統的資料分類,這兩個測試使用的是《機器學習實戰》提供的資料集。 在編寫函式前,需在.py檔案中新增以下內容: from numpy

spark機器學習筆記(四)用Spark Python構建分類模型(

因此,當 wTx的估計值大於等於閾值0時,SVM對資料點標記為1,否則標記為0(其中閾值是SVM可以自適應的模型引數)。 SVM的損失函式被稱為合頁損失,定義為:                                                        

Dubbo學習筆記註冊到zookeeper並實現遠端呼叫

我們選擇zookeeper作為註冊中心。 一、首先要下載zookeeper,把程式解壓,進入conf,把zoo_sample.cfg修改為zoo.cfg。進入bin資料夾,在這裡開啟命令列,輸入zkserver.cmd,這樣就啟動了zookeeper。 可以看出,zook