?
要執行API操作需要在idea中創建maven項目
(改成自己的阿里倉庫)導入特定依賴
添加日志文件
上邊操作做成后就可以進行一些API的實現了
目錄
?導入maven依賴:
創建日志文件:
創建API客戶端:
(1)創建全局變量:
(2)初始化(init):
(3)創建節點(create):
(4)監聽API:
(5)檢測節點是否存在:
寫數據原理:
(1)寫流程之寫入請求直接發送給Leader節點:
(2)寫流程之寫入請求發送給follower節點
?導入maven依賴:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version>
</dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.7</version> </dependency>
</dependencies>
創建日志文件:
需要在項目的 src/main/resources 目錄下,新建一個文件,命名為“log4j.properties”
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c]
- %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c]
- %m%n
創建API客戶端:
(1)創建全局變量:
String connectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";int sessionTimeout=2000;ZooKeeper zkClient=null;
String connectString---要連接那個zookeeper, int sessionTimeout ---延遲時間 ZooKeeper zkClient ---表示要創建的客戶端 申請為全局變量有助于后邊各方法的調用
(2)初始化(init):
@Before
public void init() throws Exception {// Watcher watcher ---監聽器zkClient= new ZooKeeper(connectString, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent watchedEvent) {List<String> children = null;System.out.println("-------------------------------");try {children = zkClient.getChildren("/", true);} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}for (String child : children) {System.out.println(child);}}});
}
@Befor注解在此不在解釋不會可看本人前面文章(Java注解篇)
首先初始化了一個zookeeper的客戶端對象
重寫了process方法,這個方法在不使用監聽器的時候可以不寫代碼
在開啟監聽器的時候(可以聽后續監聽器API)
由于監聽器是調用一次只能使用一次,不能實時監聽,所以我們要在初始化方法里添加監聽邏輯(process方法),就會在每次所監聽的數據發生改變的時候調用該方法,我們在創建客戶端對象的時候為該對象設置了監聽器,從而在刪除的時候也會觸發監聽
(3)創建節點(create):
@Test
public void create() throws Exception {//String path,---在那個節點下創建節點// byte[] data, ----節點數據// List<ACL> acl,----權限// CreateMode createMode)----創建節點的類型String nodecreate = zkClient.create("/atguigu","tangxiaocong".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}
(4)監聽API:
@Testpublic void getChildren() throws Exception {//String path----監聽路徑, boolean watch---設置監聽器為true//true注冊一次監聽(記不起來就去看監聽原理)就只能生效一次,所以在init哪里就需要添加注冊List<String> children = zkClient.getChildren("/", true);for (String child : children) {System.out.println(child);}// 延時阻塞--實時監控Thread.sleep(Long.MAX_VALUE);}
(5)檢測節點是否存在:
@Test//查看節點是否存在public void exists() throws InterruptedException, KeeperException {//關閉監聽Stat exists = zkClient.exists("/atguigu", false);System.out.println(exists==null?"not exist":"exist");}
寫數據原理:
(1)寫流程之寫入請求直接發送給Leader節點:
? ? ? ? 1.客戶端向leader發出寫請求
? ? ? ? 2.leader接收到寫請求會通知靠近它的follower執行寫請求
? ? ? ? 3.follower回應給leader(三臺服務器現在已經有兩臺做出了回應(大于1/2)就會開始進行寫操作,讓后再處理后續服務器---效率高)
? ? ? ? 4.現在得出的回應大于1/2,則leader對客戶端給出回應
? ? ? ? 5.leader會繼續給其他的follower發送寫請求
? ? ? ? 6.follower得到請求給出回應
(2)寫流程之寫入請求發送給follower節點:
? ? ? ? 1. 客戶端向follower發出寫請求
? ? ? ? 2.寫請求轉發從follower需要轉請求給leader(轉請求后于上述操作相似)
? ? ? ? 3.先通知(轉發請求的)follower執行寫請求
? ? ? ? 4.follower對leader的請求做出回應(已經超過半數服務器做出回應,則執行寫操作)
? ? ? ? 5.leader做出回應返回給轉發請求的follower
? ? ? ? 6.該follower返回給客戶端(Client)
? ? ? ? 7.leader通知其他follower執行寫請求
? ? ? ? 8.做出回應后重復5.6步驟