用zookeeper實現配置中心
核心程式碼如下:
package com.zsj.zkclient.test;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.ZkConnection;
import org.I0Itec.zkclient.exception.ZkMarshallingError;
import org.I0Itec.zkclient.serialize.ZkSerializer;
public class ZkClientBase {
static final String CONNECT_ADDR = "localhost:2181";
static final int SESSION_TIMEOUT = 5000;
static ZkClient zkClient = new ZkClient(new ZkConnection(CONNECT_ADDR), SESSION_TIMEOUT, new CustomSerializer());
public static void main(String[] args) throws InterruptedException {
// 3.更新和判斷節點是否存在
zkClient.createPersistent("/super/c2", true);
zkClient.createPersistent("/super/c2/xxf", true);
zkClient.createPersistent("/super/c2/xxf/xds", true);
zkClient.createPersistent("/super/c2/xxf/sss", true);
zkClient.createPersistent("/super/c2/xxf/xds/sdfs", true);
zkClient.createPersistent("/super", true);
zkClient.writeData("/super/c1", "新內ssss容452werf6"); // 修改指定節點的值
printChilds("/super");
addListener("/super");
zkClient.writeData("/super/c1", "新qqq52werf6"); // 修改指定節點的值
new Thread(()->{
while(true){
//printConfigs();
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();;
TimeUnit.HOURS.sleep(5);
zkClient.close();
}
static Map<String, String> configs = new HashMap<String, String>();
static void printConfigs() {
for (String key : configs.keySet()) {
System.out.format("map--->node=%s,data=%s \n", key, configs.get(key));
}
}
static void printChilds(String path) {
List<String> childs = zkClient.getChildren(path);
for (String child : childs) {
String childPath = path + "/" + child;
if (zkClient.countChildren(childPath) > 0) {
printChilds(childPath);
}
String cData = zkClient.readData(childPath);
configs.put(childPath, cData);
System.out.format("node=%s,data=%s \n", childPath, cData);
}
}
static void addListener(String path) {
List<String> childs = zkClient.getChildren(path);
for (String child : childs) {
final String childPath = path + "/" + child;
if (zkClient.countChildren(childPath) > 0) {
addListener(childPath);
}
subscribe(childPath);
}
}
private static void subscribe(final String childPath) {
System.out.println("subscribeDataChanges-->" + childPath);
zkClient.subscribeDataChanges(childPath, new IZkDataListener() {
public void handleDataDeleted(String s) throws Exception {
System.out.println("刪除的節點為:" + s);
configs.remove(s);
}
public void handleDataChange(String s, Object o) throws Exception {
System.out.println("變更節點為:" + s + ",變更資料為:" + o);
if (o == null) {
configs.remove(s);
return;
}
configs.put(s, o.toString());
}
});
zkClient.subscribeChildChanges(childPath, new IZkChildListener() {
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
if(currentChilds==null) {
return ;
}
for(String cd:currentChilds) {
subscribe(parentPath+"/"+cd);//重新訂閱
}
}
});
}
}
class CustomSerializer implements ZkSerializer {
/** default utf 8 */
private String charset = "UTF-8";
public CustomSerializer() {
}
public CustomSerializer(String charset) {
this.charset = charset;
}
public byte[] serialize(Object data) throws ZkMarshallingError {
try {
byte[] bytes = String.valueOf(data).getBytes(charset);
return bytes;
} catch (UnsupportedEncodingException e) {
throw new ZkMarshallingError("Wrong Charset:" + charset);
}
}
public Object deserialize(byte[] bytes) throws ZkMarshallingError {
String result = null;
try {
result = new String(bytes, charset);
} catch (UnsupportedEncodingException e) {
throw new ZkMarshallingError("Wrong Charset:" + charset);
}
return result;
}
}
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zsj.zkclient</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>test</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
</project>
執行效果如下:
變更節點為:/super/c2/xxf/sassaa/saassaas/assaas/aaa/assaa,變更資料為:assaasasas
parentPath: /super/c2/xxf/sassaa/saassaas/assaas/aaa/assaa
currentChilds: null
刪除的節點為:/super/c2/xxf/sassaa/saassaas/assaas/aaa/assaa
parentPath: /super/c2/xxf/sassaa/saassaas/assaas/aaa
currentChilds: []
相關推薦
用zookeeper實現配置中心
核心程式碼如下:package com.zsj.zkclient.test;import java.io.UnsupportedEncodingException;import java.util.HashMap;import java.util.List;import ja
通過zookeeper實現配置中心熱更新
程式碼意思是首先從系統配置中如tomcat配置中找到zkHost宣告zookeeper地址如“192.168.0.23:2181”,構建zookeeper連線客戶端,根據ZookeeperPropertiesConfigure中配置的初始引數locationList到zookeeper找到名稱為該值的
zookeeper實現配置中心
最近做新系統,搞了個配置中心。本地用ehcache,配置最終儲存在zookeeper上。系統啟動連線zk,檢查指定節點目錄是否存在。若不存在,則建立。隨後設定監聽。節點內容變化則觸發監聽程式,更新資料到本地快取。讀資料時本地快取不命中,則讀取zk對應路徑節點內容到本地。
pring-cloud-config+spring-cloud-bus(實現配置中心動態重新整理配置檔案)
前置條件 rabbitmq安裝 使用maven構建專案 安裝postman(方便傳送請求重新整理配置) 環境:springboot 2.0.6版本 建立專案config-server 專案結構
Spring Cloud Config + Spring Cloud Bus + kafka實現配置中心配置動態更新
一、架構圖 當在 Git 倉庫中某個應用配置檔案中的引數更新後,只需要通過 POST方法訪問 config Server 的 /actuator/bus-refresh 介面,就可以讓所以的微服務節點更新配置。 在我們的 DEMO 中有一個 Config Server
SOA研究-用zookeeper實現服務的註冊和發現
註冊中心 一般具有以下功能: 註冊服務 訂閱服務 失敗重新註冊和訂閱 本地快取服務資訊列表 大體過程如下: 1.服務提供者暴露服務後向註冊中心註冊,如果多個註冊中心的話,需要分別註冊到多個註冊中心;註冊資訊包含自己主機名,埠號,服務名,其他
巧用zookeeper實現分散式平行計算
雲端計算的技術話題中少不了“分散式”,“平行計算” 這些個關鍵詞,我們知道硬體擴充套件的條件(Scale-up)始終是有限制的,將計算分散到網路中更多機器的CPU上提供更高的計算效能(Scale-out),並在這基礎上能將計算同時進行,那麼總體計算瓶頸會減小,計算的效能會
Zookeeper(3)-使用ZooKeeper作為配置中心
ZooKeeper作為配置中心 現在我們大多數應用都是採用的是分散式開發的應用,搭建到不同的伺服器上,我們的配置檔案,同一個應用程式的配置檔案一樣,還有就是多個程式存在相同的配置。當我們配置檔案中有個配置屬性需要改變,我們需要改變每個程式的配置屬性,這樣會很麻
idea建立springcloud專案圖文教程(config 實現配置中心)(十一)
1,先建立config-server 專案配置如下 package com.hcmony; import org.springframework.boot.SpringApplication; im
spring cloud下用nacos做配置中心的初步探究,替換spring config server
一, 背景: 1, 引入nacos來做配置中心 專案現在用的是spring cloud netflix,沒有用到s
Spring Cloud Config 實現配置中心,看這一篇就夠了
Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,雖然後來又釋出了 Consul 可以代替配置中心功能,但是 Config 依然適用於 Spring Cloud 專案,通過簡單的配置即可實現功能。 配置檔案是我們再熟悉不過的了,尤其是 Spring Boot 專案
用Zookeeper作為Spring cloud的配置中心(轉)
本文轉自https://blog.csdn.net/CSDN_Stephen/article/details/78856323 Spring Cloud 配置中心的主流實現方式 Spring cloud configSpring cloud zookeeper config以下是這兩者的簡介 Srpin
基於ZooKeeper實現簡單的配置中心
ZooKeeper節點的型別分為以下幾類: 1. 持久節點:節點建立後就一直存在,直到有刪除操作來主動刪除該節點 2. 臨時節點:臨時節點的生命週期和建立該節點的客戶端會話繫結,即如果客戶端會話失效(客戶端宕機或下線),這個節點自動刪除 3. 時序節點:建立節點是可以設定這個屬性,Z
Zookeeper 實現分散式配置中心
個人備忘 前言: zookeeper 五個功能點 1. master的管理,如amq 叢集,kafka叢集。 2. 分散式鎖(悲觀、樂觀) 3. 分散式配置中心。 4. 叢集的監管。 5. 釋出與訂閱(佇列)。 以上五點,都是zookeeper的
用Zookeeper作為Spring cloud的配置中心
網上對於Spring cloud zookeeper config的資料不是太多,而且工作需要,特此記錄一下對這些天的學習成果,如有錯誤,請大家指正。 Spring Cloud 配置中心的主流實現方式 Spring cloud config Spr
SpringBoot+ZooKeeper+ZKUI+Drools 實現應用配置中心及業務規則動態載入
本文目的: 使用ZooKeeper作為SpringBoot應用的配置中心 應用中使用到的業務規則儲存在Zookeeper中,規則更新後在不重啟應用的情況下通知應用動態過載規則 1.zookeeper簡介 Zookeeper是一個高效能,分散式的,開源分
Zookeeper 配置中心服務治理實現
Zookeeper配置中心服務治理實現 背景 上一篇部落格詳細講解了為什麼我們要選擇Zookeeper作為服務發現框架而不是使用Eureka。 參考 這篇部落格將繼續講解怎麼實現的,裡面會有大量的程式碼的拷貝,具體的架構可以參考上一篇部落格的架構演進圖
基於zookeeper實現分散式配置中心(二)
上一篇(基於zookeeper實現分散式配置中心(一))講述了zookeeper相關概念和工作原理。接下來根據zookeeper的特性,簡單實現一個分散式配置中心。 配置中心的優勢 1、各環境配置集中管理。 2、配置更改,實時推送,jvm環境變數及時生效。 3、依靠配置變更,動態擴充套件功能,
巧用冗余圖層實現元件中心點與註冊點的合一
巧用冗余圖層實現元件中心點與註冊點的合一在Flash中,創建的每個元件都有一個註冊點和一個中心點。這兩個點都可以用於定位和作用參照點使用,其中,中心點還是元件旋轉的參照點。在元件進行以自身中心點旋轉時,中心點的位置就決定了元件堂堂正正的旋轉,還是歪歪扭扭的旋轉。文字的描述不如直接使用實例來得詳細,下面就通過一
攜程Apollo(阿波羅)配置中心用戶管理和部門管理
cor local 參考 portal 認證 title .com one 都是 Apollo是配置管理系統,會提供權限管理(Authorization),理論上是不負責用戶登錄認證功能的實現(Authentication)。所以Apollo定義了一些SPI用來解耦,Apo