1. 程式人生 > >Zookeeper應用:服務端上下線

Zookeeper應用:服務端上下線

需求

客戶端感知伺服器的上下線。

示意圖


步驟

服務端:

1、所有機子向Zookeeper註冊,註冊znode為臨時的。

2、有機子下線,連線斷開後被Zookeeper自動刪除,觸發監聽事件。

3、有機子上線,觸發監聽事件。

客戶端:

1、連線Zookeeper,獲取伺服器註冊的znode,getchildren(),並註冊監聽。

2、當Zookeeper觸發監聽,會rpc遠端呼叫process。

3、process呼叫getchildren().

服務端程式碼

package hello.zookeeper.schange;

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

public class Server {

	private String connUrl = "zk1:2181,zk2:2181,zk3:2181";
	private int outTime = 1000;
	private String parentNode="/servers/";//Zookeeper先建好這個持久節點

	private ZooKeeper zk = null;

	public void getConnection() throws Exception {

		zk = new ZooKeeper(connUrl, outTime, new Watcher() {

			@Override
			public void process(WatchedEvent event) {
				System.out.println("Server Watcher:" + event.getType() + "---" + event.getPath());
			}
		});
	}

	public void registerServer(String server) throws Exception {
		String msg = zk.create(parentNode+server, server.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
		System.out.println("registerServer:" + msg);
	}

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

		String name = "server4";
		Server server = new Server();
		server.getConnection();
		server.registerServer(name);

		System.out.println(name + "----start------");

		Thread.sleep(Long.MAX_VALUE);
	}

}

客戶端程式碼

package hello.zookeeper.schange;

import java.util.List;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;

public class Client {
	
	private String connUrl = "zk1:2181,zk2:2181,zk3:2181";
	private int outTime = 1000;
	private String parentNode="/servers";

	private ZooKeeper zk = null;

	public void getConnection() throws Exception {

		zk = new ZooKeeper(connUrl, outTime, new Watcher() {

			@Override
			public void process(WatchedEvent event) {
				System.out.println("Client Watcher:" + event.getType() + "---" + event.getPath());
				try {
					getServerList();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	
	public void getServerList() throws Exception{
		
		List<String> children = zk.getChildren(parentNode, true);
		if(children!=null&&children.size()>0){
			System.out.println("伺服器列表如下:");
			for(String child:children){
				System.out.println(child);
			}
		}
	}
	
	
	public static void main(String[] args) throws Exception {
		Client client=new Client();
		client.getConnection();
		client.getServerList();
		
		Thread.sleep(Long.MAX_VALUE);
	}
	
	
}


執行結果

開了4臺服務端,3臺客戶端


Zookeeper裡/servers節點下有4臺註冊線上的伺服器


客戶端執行獲取服務端列表


伺服器下線一臺,三個客戶端都受到通知


-------------

更多的Java,Angular,Android大資料,J2EE,Python資料庫Linux,Java架構師,:


相關推薦

Zookeeper應用服務下線

需求 客戶端感知伺服器的上下線。 示意圖 步驟 服務端: 1、所有機子向Zookeeper註冊,註冊znode為臨時的。 2、有機子下線,連線斷開後被Zookeeper自動刪除,觸發監聽事件。

Docker下Java檔案服務三部曲之二服務開發

本章是《Docker下Java檔案上傳服務三部曲》的第二篇,上一章《Docker下Java檔案上傳服務三部曲之一:準備環境》我們把客戶端準備好了,Tomcat容器也部署好了,今天就來開發和部署檔案服務的後臺應用吧; 本章實戰內容概要 本章要建立三個w

ZooKeeper系列之(十二)服務實現機制

服務端有3種執行方式:leader,follower,observer。leader是領導者,一個ZooKeeper叢集同一時刻最

Netty入門一服務應用搭建 & 啟動過程原始碼分析

最近週末也沒啥事就學學Netty,同時打算寫一些部落格記錄一下(寫的過程理解更加深刻了) 本文主要從三個方法來呈現:Netty核心元件簡介、Netty服務端建立、Netty啟動過程原始碼分析 如果你對Netty有一定的瞭解, 那閱讀起來應該會比較愉快 ## Netty核心元件簡介 ### ByteBu

Token服務身份驗證的流行方案

rst 服務 方案 app 過程 組件圖 wav hit margin 01- 身份認證 服務端提供資源給客戶端,但是某些資源是有條件的。所以服務端要能夠識別請求者的身份,然後再判斷所請求的資源是否可以給請求者。 token是一種身份驗證的機制,初始時用戶提交賬號數據

在CentOS7安裝ftp服務器用於保存服務傳的圖片。

如果 mef get 匿名用戶 使用 list 文件 led 添加 1、CentOS卸載vsftpd的方法 如果服務器上已經安裝了vsftpd服務,配置出錯需要卸載vsftpd服務。 1.1 查找vsftpd服務 [root@localhost /]# rpm -a

EMQ 學習---訂閱$SYS主題,捕獲客戶下線消息

str 發出 .config 客戶端 ddr config文件 禁止 打開 dashboard acl.config文件定義了可訂閱$SYS主題的權限。 {allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}. {allo

java_客戶服務傳mp3檔案資料

客戶端: package cn.itcast.uploadpicture.demo; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import j

LDAP基礎10服務工具使用phpLDAPadmin進行操作

在上篇文章中介紹瞭如何使用Apache Directory Studio的客戶端來操作LDAP,但是這種方式需要安裝客戶端工具。在這篇文章裡將介紹伺服器端的工具phpLDAPadmin,這樣使用者通過瀏覽器即可獲得對於OpenLdap操作的能力。 事前準備 docker-comp

使用TCP協議,分別編寫服務和客戶,要求客戶服務傳檔案。(使用字元流完成)

package Test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.IOException; import java.io

EasyDarwin開源流媒體伺服器Golang版本服務錄影功能釋出

EasyDarwin開源流媒體伺服器(www.easydarwin.org)現在使用Go版本實現了。最新的程式碼提交,已經支援了推流(或者拉流)的同時進行本地儲存。 本地儲存的原理,是在推流的同時啟動ffmpeg作為一路Client來做儲存。ffmpeg在demux和mux的工作方面已經

三週學會小程式第三講服務搭建和部署

通過第二講我們已經知道了怎麼快速搭建一個小程式客戶端,當然服務端也是必不可少的。登入驗證,內容儲存等等都離不開服務端。 本章節主要講解怎麼快速搭建一個服務端框架和免費部署。因為好多同學僅僅為了學習小程式,為此購買一個伺服器成本還是蠻高的,所以小編特此找了一種免費的服務資源提供給大家,等到你真正要部署小程式的時

關於Spring Cloud Eureka對服務下線監控(重點),續約,註冊,啟動等

關於Spring Cloud Eureka對服務的上下線監控(重點),續約,註冊,啟動等 專案上監聽各個服務宕機後的資訊,提供eureka的5個監聽器 EurekaInstanceCanceledEvent 服務下線事件 EurekaInstanceRegisteredEvent 服務註

Java之TCP傳輸小Demo(無執行緒)服務

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public c

Netty4.x原始碼分析服務接受客戶Channel連線

引包 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> &l

zookeeper 原始碼客戶連線過程

可能我們直接使用 zookeeper 的機會並不多,甚至都不會直接去使用,但是 zookeeper 作為分散式協調框架,在如今分散式系統領域有著非常大的作用,很多流行框架都有使用它,如分散式治理框架 dubbo,大資料領域中的 hbase,所以瞭解 zookee

MFC——socket程式設計(淺出+深度服務和客戶埠問題)

要寫網路程式就必須用Socket,這是程式設計師都知道的。而且,面試的時候,我們也會問對方會不會Socket程式設計?一般來說,很多人都會說,Socket程式設計基本就是listen,accept以及send,write等幾個基本的操作。是的,就跟常見的檔案操作一樣,只要寫過就一定知道。 對於網路程式設計,

JavaNIO Java進階知識點5服務高併發的基石 - NIO與Reactor模式以及AIO與Proactor模式

javaNIO對於多路複用io(同步非阻塞io)的實現 package test; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.SelectionKey; import

Android訪問網路服務返回XML或JSON格式資料,Android 進行解析並使用ListView顯示

剛剛入門學習了Android的ListView,也是看了傳智播客黎活明老師的視訊學習了,但是一直執行不了,還報錯了。報的錯誤是:at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.jav

Android音訊實時傳輸與播放(二)服務

我偷懶就用java寫了個簡單的伺服器,大家明白原理就好。 服務端共開放兩個埠,一個udp上行埠用來接收amr音訊流,另一個tcp下行埠用來發送amr音訊流。 我這裡寫的服務端實現了組播的功能,即一個人在錄音,可以同時讓很多人同時聽到。 簡而言之,服務端做的唯一一件