利用zookeeper實現分散式服務故障自動剔除/服務自動註冊的思路
目前常見的web常規的負載均衡大多數是通過nginx的upstream配置將流量轉發到內部的服務機上,來分擔流量過多的情況,但是這裡往往出現的一個問題是,nginx上配置伺服器的ip是固定的,如果某臺機器出現了服務故障,那麼流量有概率會打到這臺機器導致出現服務不可訪問的故障,這時候往往需要人工介入將故障的節點ip剔除掉,那麼有沒有好的辦法發現故障Ip剔除?可以利用zookeeper的特性來幹這個事情的
zookeeper是什麼?
Zookeeper 會維護一個具有層次關係的資料結構,它非常類似於一個標準的檔案系統,目前是基於這個思路去考慮的。大體的結構圖:
具體思路
看到上面的樹狀結構大家應該想到了點上面東西了吧!那麼服務自動發現具體可以這麼做呢,這麼利用zookeeper的這個特性去實現服務自動註冊、故障剔除的原理呢!下面都是基於golang的一些特性去講解。
1)實現一個golang版本的路由層,然後在nginx=》upstream伺服器之間加一層路由服務層,這個路由服務層就是用來維護所有服務的路由表。然後再通過路由層找到相對應服務的IP,最後通過rpc協議去呼叫某個具體的伺服器
2)實現一個golang版本的微服務,每個微服務啟動的時候往zookeeper裡面去註冊自己屬於哪個路由的,這裡只要實現具體的業務邏輯即可。。
下面是一個整體的架構與微服務之間的表現:
zookeeper的樹狀結構: