轉自:https://www.jianshu.com/p/86acf1df6cdd
前言:最近工作不是很忙,本應該乘着閑暇的時間看書的,之前每天晚上都要翻翻的,可是自己竟然迷戀上了王曉磊 寫的 卑鄙的小人-曹操傳 剛開始的時候還沒啥 后面迷的無法自控,以前中午吃完飯的時候,都是趴着玩手機,現在是一吃完飯都是拿着kindle看上一會兒,弄的技術書好久都沒翻過 連博客也不寫了,實在不該,罪過罪過 ,一個技術狗 不搞技術,那不是坐着等死嗎。話不多說,回歸正題。
前段時間 我給大家介紹了ZK的一些基礎知識,讓大家對ZK有了一個初步了解,但在實際的過程中 怎么將zk運用到實際的項目中去了 zk的節點有幾種特點,以及如何調整好我們的zk配置 才能達到最優了 今天我給大家簡單的介紹一下。
我們以我們的實際項目為例 給大家介紹一下。 場景:我們有兩個直播房間服務yunva-room,用戶登入房間,根據yunva-room-lvs服務將房間里的用戶分部在不同的服務機器上,即不同的服務器有相同的房間,房間里有不同的用戶。那么這時候問題就來了
1 分布在不同服務器上的相同房間怎么保證用戶數負載均衡 ?
2 一台機器的房間服務掛掉后,另一台服務器怎么感知?
此時ZK的出現 可以很好的解決這兩個問題。
解決方式: 1 將不同服務器上房間用戶的數據都掛在ZK上,根據zk的數據的變化 動態的將用戶分配在合適的機器上。
2 ZK的臨時節點的變化,ZK是可以感知的,可以通知到其他的臨時節點,這樣就很好的解決一台服務掛掉后,很好的通知到另幾台房間服務所在的服務器。將緩存在本地的可用房間服務列表清掉即可。
不同服務器上的房間服務啟動后,向ZK注冊自己的房間服務信息並建立節點 配置的信息寫在配置文件上

服務啟動后向zk注冊 並訂閱監聽子節點時間,接受其他房間服務掛掉的通知:
RoomServerInfo 和 ServiceInfo 是我們房間服務 節點 的基本配置信息

yunva-room 服務啟動后都會向zk注冊,zk里的節點信息如下:

roomServer節點下面都是我們的不同的房間服務 房間里面的數據大家大家也是可以看得到的。
yunva-room-lvs 服務啟動后 會向zk訂閱所有的房間服務 進行用戶的分配 達到負載均衡。訂閱房間服務的時候,全部load到本地緩存中,如果子節點發生變化了,則從本地緩存中移除掛掉的服務數據。也就不進行用戶的分配。

當我們的房間服務掛掉后 我們的節點也就發生了變化,在此之前,我們簡單的介紹一下ZK的節點相關知識,
ZK的節點是有生命周期的,可以分為以下幾種節點:
持久節點(PERSISTENT)
所謂持久節點,是指在節點創建后,就一直存在,直到有刪除操作來主動清除這個節點——不會因為創建該節點的客戶端會話失效而消失。
臨時節點(EPHEMERAL)
和持久節點不同的是,臨時節點的生命周期和客戶端會話綁定。也就是說,如果客戶端會話失效,那么這個節點就會自動被清除掉。注意,這里提到的是會話失效,而非連接斷開。另外,在臨時節點下面不能創建子節點。
我們創建的節點肯定是臨時的,服務掛掉后,子節點也就消失了 ZK感知后 通知到訂閱節點變化的服務yunva-room-lvs 從本地移除到沒有用的服務。
回歸到如何監聽節點 我們用的zk 是用開源的curator框架來進行對zk操作,這個比較成熟,還有一些類似其他的vertx spring-clound 都有對zk的封裝 ,大家如果有時間的話 可以看一下 挺有意思的。
那么curator 監聽的節點三種方式:
1 PathChildrenCache PathChildrenCacheListener 監聽子節點變化
實現類似如下:

2 NodeCache NodeCacheListener 監聽父節點變化 如下:

3 TreeCache TreeCacheListener 監聽父節點和子節點的變化 如下:

在我們的項目中肯定用的是監聽子節點變化 能感知服務是否可用
我們監聽子節點的方式 訂閱子節點變化的時候 我們用了java 的觀察者模式 有變化 通知到實際的服務

上面我們講到了 我們要實現不同服務器的房間用戶負載均衡,房間人數是要掛到ZK服務上去的,並且要實現負載均衡算法。 由於yunva-room-lvs 監聽節點了變化 每次用戶登入房間 zk節點發生變化 並同步到yunva-room-lvs 即不同服務器上的房間人數也同步到了本地緩存 負載均衡 根據yunva-room-lvs 本地緩存的房間數據來進行分配房間的服務器分配即可。
用戶登入房間 yunva-room感知后 向zk偽實時(2分鍾同步一次)同步數據:

yunva-room-lvs 進行用戶服務器的分配

本想給大家繼續介紹在ZK服務實際在生產環境的優化配置 使ZK達到最好的狀態 今天就到這里吧 我都沒吃飯 在公司默默的碼字。 今天簡單的介紹了zk在實際項目中的運用以及zk節點以及如何監聽的基本知識,后面我給大家介紹ZK的生產環境優化我們的配置 以及其他的一些知識 比如分布式鎖 分布式隊列 我們這個項目已經在線上穩定運行。是一個很好的例子 而且我們的並發還很高。
不多說了 該回去吃狗糧了 不然猝死在辦公桌上都沒人收屍,我是小志碼字,一個簡單碼代碼的小人物。如果想了解這個項目和代碼 加我微信 微信號:2B青年 歡迎交流 相互學習。
作者:小志碼字
鏈接:https://www.jianshu.com/p/86acf1df6cdd
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。