深入解析dubbo服務(wù)注冊與zookeeper節(jié)點持久化機制
在分布式服務(wù)治理中,Dubbo框架將服務(wù)信息注冊到ZooKeeper,方便服務(wù)消費者進行發(fā)現(xiàn)和調(diào)用。然而,即使Dubbo應(yīng)用已停止運行,甚至ZooKeeper重啟后,仍然能在ZooKeeper中看到之前注冊的服務(wù)信息,這引發(fā)了諸多疑問。
Dubbo并非簡單地創(chuàng)建和刪除ZooKeeper節(jié)點。它實際創(chuàng)建兩種節(jié)點:
- 持久化節(jié)點: 存儲服務(wù)的元數(shù)據(jù)信息,即使服務(wù)關(guān)閉,該節(jié)點也不會自動刪除。
- 臨時節(jié)點: 標識服務(wù)的運行狀態(tài)。Dubbo應(yīng)用關(guān)閉后,ZooKeeper客戶端連接斷開,ZooKeeper會自動清除此節(jié)點。dubbo.registry.retry.period配置項影響客戶端檢測連接斷開和移除節(jié)點的頻率。
關(guān)鍵在于:Dubbo應(yīng)用關(guān)閉時不會主動刪除持久化節(jié)點。ZooKeeper的持久化機制確保了持久化節(jié)點即使在服務(wù)關(guān)閉或ZooKeeper重啟后依然存在于磁盤快照中,并在重啟后恢復(fù)到內(nèi)存。因此,使用ls /dubbo命令仍然可以看到這些信息,因為命令讀取的是ZooKeeper服務(wù)器內(nèi)存中的節(jié)點數(shù)據(jù)。
雖然持久化節(jié)點保留,但臨時節(jié)點已消失,ZooKeeper已感知到服務(wù)不可用。持久化節(jié)點信息的保留,直到管理員手動刪除。
因此,即使Dubbo應(yīng)用關(guān)閉并重啟ZooKeeper,依然能看到之前注冊的服務(wù)信息,是ZooKeeper持久化節(jié)點機制和Dubbo應(yīng)用未主動注銷持久化節(jié)點的共同結(jié)果。這并非錯誤,而是Dubbo和ZooKeeper架構(gòu)設(shè)計使然。