1. 程式人生 > >zookeeper的java客戶端

zookeeper的java客戶端

需要jar 包:

安裝目錄

zookeeper-3.4.9.jar

lib包下jar包

package com.bigdata.zk;

import java.io.IOException;
import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;

public class SimpleZkClient {
	private static final String connectString = "192.168.169.129:2181,192.168.169.130:2181,192.168.169.131:2181";
	private static final int sessionTimeout = 2000;

	ZooKeeper zkClient = null;

	@Before
	public void init() throws IOException {
		zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {

			@Override
			public void process(WatchedEvent event) {
				// 收到事件通知後的回撥函式(應該是我們自己的事件處理邏輯)
				System.out.println(event.getType() + "---" + event.getPath());

				try {
					zkClient.getChildren("/", true);
				} catch (Exception e) {
				}
			}
		});
	}

	// 獲取子節點
	@Test
	public void getChildren() throws Exception {
		List<String> children = zkClient.getChildren("/", true);
		for (String child : children) {
			System.out.println(child);
		}
		Thread.sleep(Long.MAX_VALUE);
	}

	// 建立資料節點到zk中
	@Test
	public void testCreate() throws KeeperException, InterruptedException {
		// 引數1:要建立的節點的路徑 引數2:節點的資料 引數3:節點的許可權 引數4:節點的型別
		String nodeCreated = zkClient.create("/servers", "hellozk".getBytes(), Ids.OPEN_ACL_UNSAFE,
				CreateMode.PERSISTENT);
		// 上傳的資料可以是任何型別,但都要轉成byte[]
	}

	// 判斷節點是否存在
	@Test
	public void testExist() throws KeeperException, InterruptedException {
		Stat stat = zkClient.exists("/java6", false);
		System.out.println(stat == null ? "not exist" : "exist");
	}

	// 獲取節點的資料
	@Test
	public void getData() throws KeeperException, InterruptedException {
		byte[] data = zkClient.getData("/java6", false, null);
		System.out.println(new String(data));
	}

	// 刪除節點
	@Test
	public void deleteZnode() throws InterruptedException, KeeperException {
		// 引數2:指定要刪除的版本,-1表示刪除所有版本
		zkClient.delete("/java6", -1);
	}

	// 更新節點資料
	@Test
	public void setData() throws KeeperException, InterruptedException {
		zkClient.setData("/java6", "I Miss you".getBytes(), -1);

		byte[] data = zkClient.getData("/java6", false, null);
		System.out.println(new String(data));
	}

}

簡單的分散式應用系統伺服器上下線動態感知程式開發

package com.bigdata.zkdist;

import java.io.IOException;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

public class DistributedServer {
	private static final String connectString = "192.168.169.129:2181,192.168.169.130:2181,192.168.169.131:2181";
	private static final int sessionTimeout = 2000;
	private static final String parentNode = "/servers";

	ZooKeeper zkClient = null;

	/**
	 * 建立到zk的客戶端連線
	 * 
	 * @throws IOException
	 */
	public void getConnect() throws IOException {
		zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {

			@Override
			public void process(WatchedEvent event) {
				// 收到事件通知後的回撥函式(應該是我們自己的事件處理邏輯)
				System.out.println(event.getType() + "---" + event.getPath());

				try {
					zkClient.getChildren("/", true);
				} catch (Exception e) {
				}
			}
		});
	}

	/**
	 * 向zk叢集註冊伺服器資訊
	 * 
	 * @throws InterruptedException
	 * @throws KeeperException
	 * 
	 */
	public void registerServer(String hostname) throws KeeperException, InterruptedException {
		// 建立臨時序號節點
		String create = zkClient.create(parentNode + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE,
				CreateMode.EPHEMERAL_SEQUENTIAL);
		System.out.println(hostname + "is online.." + create);
	}

	/**
	 * 業務功能
	 * 
	 * @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 IOException, KeeperException, InterruptedException {
		// 獲取zk連線
		DistributedServer server = new DistributedServer();
		server.getConnect();
		// 利用zk連線註冊伺服器資訊
		server.registerServer(args[0]);
		// 啟動業務功能
		server.handleBussiness(args[0]);
	}

}

package com.bigdata.zkdist;

import java.util.ArrayList;
import java.util.List;

import org.apache.zookeeper.KeeperException;
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.169.129:2181,192.168.169.130:2181,192.168.169.131: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();
		
	}

}

分別把客戶端和服務端打jar 包

File->Export->Runnable JAR file

執行:java -jar xxx.jar

相關推薦

怎麽看域客戶是否繼承了組策略

計算機配置 組策略 windows 管理員 客戶機 https://jingyan.baidu.com/article/2fb0ba40ac413100f2ec5fde.html現在公司普遍都是域(活動目錄)環境,在域內,管理員會做一些策略對域用戶和域計算機進行管理,那麽我們如何查看域賬號

windows10 配置 華為vpn客戶

安裝客戶端 啟用 客戶 五步 安裝 資源管理器 網卡 cli windows 2017-05-08 1. 安裝客戶端軟件VPNClient_V100R001C02SPC703.exe 2. 新建vpn 安裝完成後,打開客戶端連接vpn,發現未啟用虛擬網卡(

C++傳智筆記(6):socket客戶發送報文接受報文的api接口

內存泄露 rcp 分配內存 strcpy light cpp tac 第三方 _file__ #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" #include "stdlib.h" #include "string.

Java網絡編程【Socket服務客戶

rgs .net aio highlight 如果 org author oid try Socket 編程大家都不陌生,Java 學習中必學的部分,也是 Java網絡編程核心內容之一。Java 網絡編程又包括 TCP、UDP,URL 等模塊。TCP 對應 Socket

js判斷客戶是pc還是手機

dex indexof als true symbian () bre index win function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android",

使用zabbix3.0.4的ICMP Ping模版實現對客戶網絡狀態的監控

host -1 ping 修改 cat onf 設置報警 amp 網絡狀態 一、登陸Zabbix服務器做以下操作: 1.fping安裝 wget http://www.fping.org/dist/fping-3.16.tar.gz tar zxvf fping-3.16.

微信客戶<->騰訊微信服務器<->開發者服務器

生成 格式 一個 csdn 開發 token 增加 tro 記錄 出自 http://blog.csdn.net/hanjingjava/article/details/41653113 首先,通過Token驗證,將公眾號接入開發者服務器,這樣客戶端發給公眾號的信息會被

關於客戶設計之數據分類和存儲 的思考

service his defaults def sqli href 思想 number fault 一、關於數據的分類 在Android 客戶端設計過程中,我將數據分為未知,已知(本地),臨時,三者之間根據需求相互轉化。 未知主要來自用戶輸入和服務端輸入。 已知主

JS移動客戶--觸屏滑動事件

mov net time left 但是 屏幕 觸屏 self 偏移量 移動端觸屏滑動的效果其實就是圖片輪播,在PC的頁面上很好實現,綁定click和mouseover等事件來完成。但是在移動設備上,要實現這種輪播的效果,就需要用到核心的touch事件。處理touch事件能

基於UDT connect連接通信以及文件傳輸--客戶

文章 pan detail break fin 文件名 plain mes oca 上面一篇文章中提出了服務端的,其實這裏沒有嚴格意義的服務端和客戶端之分,因為我在代碼中是基於UDP的,不存在服務端與客戶端,兩個都是對等的,只是我這裏進行一下簡單的區分而已。在這裏,客戶端所

Linux下L2TP VPN客戶的配置

linux下xl2tpd客戶端配置系統環境centos6.81,安裝xl2tpd和pppyum -y install xl2tpd ppp2,配置xl2tpd編輯配置文件xl2tpd.confvim /etc/xl2tpd/xl2tpd.conf[lac testvpn] ;testvpn為lac的名稱n

Web服務器文件傳輸程序客戶程序實現

匹配 admin 復制 賦值 連續 反饋 sock 用戶輸入 mat 1、 客戶端程序--主函數 客戶端主程序的流程圖如下: 主程序主要是分析輸入的命令,根據不同命令調用不同的函數處理或者進行出錯處理,函數代碼如下: #include "common.h" in

如何測試你給客戶app開的接口

請求方式 測試 width 類型 tle 自動 進制數 png left 這裏介紹一款工具用於測試後臺給客戶端開的接口。 采用http或者https 采用表單或者json格式 這款工具之前是谷歌瀏覽器的一款插件,後來出現了各個平臺的客戶端。非常實用。 名叫postm

Java獲取客戶IP

不為 pty 獲取 code 中間 clas 代理服務器 gin servle 在開發工作中,我們常常需要獲取客戶端的IP。一般獲取客戶端的IP地址的方法是:request.getRemoteAddr();但是在通過了Apache,Squid等反向代理軟件就不能獲取到客戶端

WCF系列教程之客戶異步調用服務

1.5 void 添加引用 dsl idt pan important 配置 但是 本文參考自http://www.cnblogs.com/wangweimutou/p/4409227.html,純屬讀書筆記,加深記憶 一、簡介 在前面的隨筆中,詳細的介紹了WCF客戶端服務

python之自定義異步IO客戶

class close sel 封裝 [0 urn 簡單 pytho syn #!/usr/bin/env python # -*- coding: utf8 -*- # __Author: "Skiler Hao" # date: 2017/5/16 15:04

linux編譯安裝mssql客戶和配置php連接mssql

linux 客戶端 凡是連接數據庫,必須安裝客戶端,我一般寫博客都不寫原理,但是後來發現回頭看自己寫的自己都看不懂,所以這章博客會多一點原理性的東西。數據庫的連接一般都是在客戶端上完成的,MySQL也不例外,安裝mysql時一般都會這麽安裝:#yum install mysql mysql-serve

微軟企業級加解密解決方案MBAM客戶部署

mbam 微軟解決方案 加解密 根據部署 Microsoft BitLocker 管理和監控客戶端軟件時,您可以啟用 BitLocker 驅動器加密計算機上您的組織中最終用戶獲得的計算機之前或之後通過配置組策略並使用企業軟件部署系統部署 MBAM 客戶端軟件。將 MBAM 客戶端部署到臺式機或便攜

客戶和服務如何使用Token和Session

cnblogs blank style ssi exception font 統一 判斷 用戶 一、我們先解釋一下他的含義: 1、Token的引入:Token是在客戶端頻繁向服務端請求數據,服務端頻繁的去數據庫查詢用戶名和密碼並進行對比,判斷用戶名和密碼正確與否,並作

如何讓網站判斷是手機客戶訪問,如果是跳到手機版

自動 nsh 發現 代碼 one dir pps 一個 com <script src="http://siteapp.baidu.com/static/webappservice/uaredirect.js" type="text/javascript">&l