用nginx這個反向代理伺服器實現負載均衡,集群幾台伺服器,同時協作完成一個任務,這樣的情景下就是分散式嗎?
先說結論,可以利用Nginx的反向代理能力,集合幾個負責不同功能的server節點,從而實現分散式;也可以利用Nginx的負載均衡能力,集合幾個相同功能的server節點,從而實現服務的高穩定性。
目前Nginx已經逐漸成為平台服務必不可少的一環,就是因為它的反向代理與負載均衡能力滿足了開發者對產品服務高可用性以及模塊解耦的需求。
接下來我們分別來解釋反向代理與負載均衡。
反向代理反向代理是針對伺服器端。對於用戶來說,他只知道反向代理伺服器的地址,但是反向代理伺服器後面通常指向了多個伺服器,負責了相同或者不同的模塊。Nginx會根據conf文件中配置的正則表達式來解析用戶實際請求的url path,然後再將請求轉發至不同的伺服器進行處理,最後再將請求結果返回給用戶。這個過程就叫做反向代理,因此可以看做將不同的能力,不同的server整合到一個host和ip,從而減少用戶的使用負擔,也是對用戶更加友好。
與反向代理相對應的是負載均衡。
我通過一個例子來解釋,當一台伺服器能夠承受的qps只有2000,但是當前用戶量激增,qps達到了3500,在不修改代碼不優化的情況下如何解決呢。
我們可以再布置一台server,兩台伺服器一起處理請求,從整體上來看,qps就達到了4000。但是兩台伺服器有不同的ip,我們總不能在擴容後和用戶說,你的第奇數個請求發到8080埠,第偶數個請求發送到8082吧。
如何處理這個問題呢?這就用到了負載均衡。
我們可以在Nginx的conf文件中為同一個類型的path配置指向兩台伺服器地址,這樣對於用戶來說,他依然只需要請求Nginx的地址即可,Nginx會根據當前兩台伺服器的情況決定將請求轉發給哪一個。這樣布置還有一個好處,就是如果其中一個節點宕機了,只要另一個節點還活著,從用戶的角度,整個服務就還能夠運轉,因為Nginx會將請求轉給有正常反饋的server。
我曾經嘗試過,在兩台伺服器一樣壓力的情況下,請求是均勻分給兩個不同的伺服器的。
基於我相信大家已經對我說的「利用Nginx的反向代理能力,集合幾個負責不同功能的server節點,從而實現分散式;也可以利用Nginx的負載均衡能力,集合幾個相同功能的server節點,從而實現服務的高穩定性」有了進一步的了解了。
以上是我的淺見,歡迎大家在下方評論留言。
我是蘇蘇思量,來自BAT的Java開發工程師,每天分享科技類見聞,歡迎關注我,與我共同進步。
同時協作這個概念是不是題主理解錯了?
nginx作為反向代理使用負載均衡連接應用伺服器,嚴格來說這幾個應用伺服器的對外功能是一樣的!
譬如說整個業務系統是一個電商系統,那麼伺服器上部署的應用服務匯總了會員註冊登錄,購物車,訂單,積分,支付等等服務,作為一個單一的服務軟體部署在伺服器上,但是單一系統並發能力有限,所以才用nginx作為中介,連接多台應用伺服器,搭建了服務集群,對外提供統一的業務服務!這都是由nginx作為負載均衡中間層根據不同的均衡策略分發到不同的伺服器上,不同的伺服器之間可以有session,資料庫連接,緩存共享,但並不屬於相互協作範疇!
而如果是幾台伺服器之間的服務各自不同,比如說一台伺服器上是積分服務,一台是訂單服務,一台是SSO等等,這樣相互協同工作組成的系統叫分散式系統!而這樣的分散式服務,單純依靠nginx是做不到的,因為nginx的功能主要是做負載均衡分發,而不是作為各系統之間的數據中介!
一般分散式服務(微服務),使用dubbo,spring boot形式的框架開發,相互之間通過某種協議(tcp,http等)相互調用,形成一種對外高度透明,統一的應用系統!而服務的註冊和發現通常使用zookeeper,eureka等伺服器!
當然題目中提到的,使用nginx集成多台業務系統服務得到的應用集群也屬於分散式範疇,因為其中一台機器宕機不影響整個系統的對外服務,應用分布在不同的伺服器節點上,形成一個高可用,穩定的系統!
分散式系統作為大型高並發,高可用性的系統,一定會成為以後的架構主流,所以好好掌握分散式才能不被out!
分散式系統(distributed system)是建立在網路之上的軟體系統。正是因為軟體的特性,所以分散式系統具有高度的內聚性和透明性。因此,網路和分散式系統之間的區別更多的在於高層軟體(特別是操作系統),而不是硬體。內聚性是指每一個資料庫分布節點高度自治,有本地的資料庫管理系統。透明性是指每一個資料庫分布節點對用戶的應用來說都是透明的,看不出是本地還是遠程。在分散式資料庫系統中,用戶感覺不到數據是分布的,即用戶不須知道關係是否分割、有無副本、數據存於哪個站點以及事務
推薦閱讀: