1. 程式人生 > >基於Zookeeper服務註冊和發現

基於Zookeeper服務註冊和發現

1、專案的目錄結構


2、基於zk服務註冊和發現的架構圖

      

3、服務端(像zk提供服務的訪問地址)

package cn.zk.distribute;

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

public class DistributedSystemServer {

	private ZooKeeper zk = null;

	private void getZkClient() throws Exception {

		// 伺服器在需求中並不需要做任何監聽
		zk = new ZooKeeper(GlobalConstants.zkhosts,
				GlobalConstants.sessionTimeout, null);

	}

	/**
	 * 向zookeeper中的/servers下建立子節點
	 * 
	 * @throws InterruptedException
	 * @throws KeeperException
	 */
	private void connectZK(String serverName, String port) throws Exception {

		// 先創建出父節點
		if (zk.exists(GlobalConstants.parentZnodePath, false) == null) {
			zk.create(GlobalConstants.parentZnodePath, null,
					Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
		}

		// 連線zk建立znode
		zk.create(GlobalConstants.parentZnodePath + "/",
				(serverName + ":" + port).getBytes(), Ids.OPEN_ACL_UNSAFE,
				CreateMode.EPHEMERAL_SEQUENTIAL);
		System.out.println("server " + serverName + " is online ......");

	}

	// 伺服器的具體業務處理功能
	private void handle(String serverName) throws Exception {
		System.out.println("server " + serverName
				+ " is waiting for task process......");
		Thread.sleep(Long.MAX_VALUE);

	}

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

		DistributedSystemServer server = new DistributedSystemServer();

		// 獲取與zookeeper通訊的客戶端連線
		server.getZkClient();

		// 一啟動就去zookeeper上註冊伺服器資訊,引數1: 伺服器的主機名 引數2:伺服器的監聽埠
		server.connectZK(args[0], args[1]);

		// 進入業務邏輯處理流程
		server.handle(args[0]);

	}

}

2、客戶端(獲取zk提供的服務地址,並呼叫服務)

package cn.zk.distribute;

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

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

public class DistributedSystemClient {

	private volatile List<String> servers = null;
	private ZooKeeper zk = null;

	// 獲取zk連線
	private void getZkClient() throws Exception {

		// 伺服器在需求中並不需要做任何監聽
		zk = new ZooKeeper(GlobalConstants.zkhosts,
				GlobalConstants.sessionTimeout, new Watcher() {

					@Override
					public void process(WatchedEvent event) {

						if (event.getType() == EventType.None)
							return;

						try {
							// 獲取新的伺服器列表,重新註冊監聽
							updateServers();

						} catch (Exception e) {

							e.printStackTrace();
						}

					}
				});

	}

	/**
	 * 從zk中獲取線上伺服器資訊
	 */
	public void updateServers() throws Exception {

		// 從servers父節點下獲取到所有子節點,並註冊監聽
		List<String> children = zk.getChildren(GlobalConstants.parentZnodePath,
				true);

		ArrayList<String> serverList = new ArrayList<String>();

		for (String child : children) {

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

			serverList.add(new String(data));

		}

		// 如果客戶端是一個多執行緒程式,而且各個執行緒都會競爭訪問servers列表,所以,在成員中用volatile修飾了一個servers變數
		// 而在更新伺服器資訊的這個方法中,是用一個臨時List變數來進行更新
		servers = serverList;

		// 將更新之後的伺服器列表資訊列印在控制檯觀察一下
		for (String server : serverList) {

			System.out.println(server);
		}
		System.out.println("===================");

	}

	/**
	 * 業務邏輯
	 * 
	 * @throws InterruptedException
	 */
	private void requestService() throws InterruptedException {
		Thread.sleep(Long.MAX_VALUE);

	}

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

		DistributedSystemClient client = new DistributedSystemClient();

		// 先構造一個zk的連線
		client.getZkClient();

		// 獲取伺服器列表
		client.updateServers();

		// 客戶端進入業務流程,請求伺服器的服務
		client.requestService();

	}

}

3、用到的常量配置資訊

package cn.zk.distribute;

public class GlobalConstants {
	// zk伺服器列表
	public static final String zkhosts = "192.168.2.118:2181";
	// 連線的超時時間
	public static final int sessionTimeout = 2000;
	// 服務在zk下的路徑
	public static final String parentZnodePath = "/servers";

}

4、將服務端,匯出為可以執行的jar檔案

      

      

       

jar的執行

[[email protected] Desktop]# java -jar server.jar 192.168.2.11 4567

5、將客戶端,匯出為可以執行的jar檔案

      步驟與上面的4相同,可以參照上面的步驟過程。

7、原始碼下載

連結:http://pan.baidu.com/s/1eRHHGBK 密碼:9d90


相關推薦

基於Zookeeper服務註冊發現

1、專案的目錄結構 2、基於zk服務註冊和發現的架構圖        3、服務端(像zk提供服務的訪問地址) package cn.zk.distribute; import org.apache.zookeeper.CreateMode; import org.ap

springcloud服務註冊發現

微服務架構中,服務發現元件是一個非常關鍵的元件,服務消費者、服務提供者、服務發現元件的關係大致如下: 各個微服務啟動時,將自己的網路地址等資訊註冊到服務發現元件中,服務發現元件會儲存這些資訊 服務消費者可從服務發現元件查詢服務提供者的網路地址,並使用改地址呼叫服務提供者的介面 各個微服務與服務

服務註冊發現Eureka《五》

eureka 是一個微服務註冊和發現的元件。分為eureka server 和 eureka client 。eureka server 為eureka 服務註冊中心,eureka client 為eureka 客戶端。 eureka 是spring cloud 首推的服務註冊和發現元件,與

Spring Boot + Spring Cloud 實現許可權管理系統 後端篇(十八):服務註冊發現(Consul)

什麼是 Consul Consul 是 HashiCorp 公司推出的開源工具,用於實現分散式系統的服務發現與配置。與其它分散式服務註冊與發現的方案,Consul 的方案更“一站式”,內建了服務註冊與發現框架、分佈一致性協議實現、健康檢查、Key/Value 儲存、多資料中心方案,不再需要依賴其它工具(比如

第二篇:SpringCloud 構建微服務系統之服務註冊發現(nacos)

上一篇我們學習了一下consul在soringcloud中的使用。今天要給大家介紹的阿里巴巴中介軟體團隊出品的Nacos來作為新一代的服務管理中介軟體。 首先學習Nacos之前,我們應該看看Nacos的官網,對它有一個初步的認識。 1. Nacos 官網 (https://nacos

第一篇:SpringCloud 構建微服務系統之服務註冊發現(consul)

今天我們要學習的是consul在soringcloud中的使用。首先學習consul之前,我們應該看看consul的官網,對它有一個初步的認識。 1. consul 官網 (https://www.consul.io) 2. consul 簡介 consul是googl

Java後端愛上SpringCloud 第一節:服務註冊發現 Eureka

Java後端愛上SpringCloud 第一節:服務註冊和發現 Eureka 一些連結 構建服務註冊中心EurekaServer 構建服務提供者EurekaClient 整合SpringBoot做視覺化監控 PS:還是老規矩,一些概念的東

spring-cloud微服務之路(三):服務註冊發現之Eureka、Consul

        在上一篇spring-cloud微服務之路(二):Spring Boot 我們介紹瞭如何快速的使用 Spring Boot 搭建一個微服務專案,這一篇我們演示如何分別使用 Spring Cloud Eureka 和 Spring Cloud Consul 完成

Spring Cloud 服務註冊發現

Spring Cloud 服務註冊和發現 個人部落格 搭建服務註冊中心 匯入maven依賴 <parent> <groupId>org.springframework.boot</groupId> <artifactId&

Spring Cloud Consul 實現服務註冊發現

Spring Cloud 是一個基於 Spring Boot 實現的雲應用開發工具,它為基於 JVM 的雲應用開發中涉及的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等操作提供了一種簡單的開發方式。通過 Spring Boot 風格進行再封裝遮蔽掉了

服務學習筆記(2)——使用Consul 實現 MagicOnion(GRpc) 服務註冊發現

我會 names uid red mes tar art ret public 原文:微服務學習筆記(2)——使用Consul 實現 MagicOnion(GRpc) 服務註冊和發現1.下載打開Consul 筆者是windows下面開發的(也可以使用Docker)。 官

spring cloud 學習(2)核心: Eureka: 提供服務註冊發現 註冊中心,負載均衡,故障轉移

官方描述:雲端服務發現,一個基於 REST 的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移 Eureka 一個服務中心,一個註冊中心,將可以提供的服務都註冊到這個元件中, ,其他呼叫者需要的時候去註冊中心去獲取,然後再呼叫,避免了服務間的直接呼叫,實現了服務間的解耦

SpringCloud——Eureka服務註冊發現

一、SpringCloud和Dubbo SpringCloud整合了一套較為完整的微服務解決方案框架,而Dubbo只是解決了微服務的幾個方面的問題。 content Dubbo SpringCloud 服務註冊中心 zooke

springcloud 最新版本上手教程1及坑——(Eureka)服務註冊發現

1.建個maven工程2.建2個module,一個做service,一個做clientnext <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/PO

【Java】用etcd做服務註冊發現

最近嘗試了一下etcd來做服務的註冊發現 【etcd服務】 從etcd官網下載二進位制檔案即可,分配了三臺機器做叢集 10.0.1.98    etcd-001 10.0.1.205 etcd-002 10.0.1.182  etcd-003 然後用指令碼啟動服務

SpringCloud--Eureka服務註冊發現

Eureka是SpringCloud家族中的一個元件,因為它的有服務註冊和發現的機制,所以很適合用於做註冊中心。Eureka有服務端和客戶端,註冊中心作為服務端,我們提供的服務作為客戶端註冊到服務端上,由Eureka統一管理。 作為註冊中心,它內部

Consul初探-服務註冊發現

前言 經過上一篇的學習,現在已經來到了服務註冊發現環節;Consul 的核心功能就是服務註冊和發現,Consul 客戶端通過將自己註冊到 Consul 伺服器叢集,然後等待呼叫方去發現服務,實現代理轉發到真正的業務系統,還可以基於服務發現做負載均衡,甚至可以在客戶端請求到底服務之前進行攔截,做一些基礎性的工作

Spring Cloud Alibaba(一) 如何使用nacos服務註冊發現

Nacos介紹 Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元資料及流量管理。 Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”為中心的現代應用架構 (例如微服務正規化、雲原生正規化

SpringBoot + Spring Cloud Consul 服務註冊發現

![image.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595433507631-6d8b936d-72dc-4ec2-8148-15ae46e5ee12.png#align=left&display=inline&height=360&marg

Web Api 基於Zookeeper服務註冊發現

差異 基於Nginx的服務提供和消費 基於zookeeper的服務註冊和發現 zk的負載均衡是可以調控,nginx只是能調權重,其他需要可控的都需要自己寫外掛;但是nginx的吞吐量比zk大很多,可以根據業務選擇用哪種方式。 服務端註冊 1.建立WEB A