1. 程式人生 > >一篇有趣的負載均衡演算法實現

一篇有趣的負載均衡演算法實現

> 文章已經收錄在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程式設計師所需要掌握的核心知識,歡迎Star和指教。 > 歡迎關注我的[公眾號](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每週更新。 **負載平衡**(Load balancing)是一種在多個計算機(網路、CPU、磁碟)之間均勻分配資源,以提高資源利用的技術。使用負載均衡可以最大化服務吞吐量,可能最小化響應時間,同時由於使用負載均衡時,會使用多個伺服器節點代單點服務,也提高了服務的可用性。 負載均衡的實現可以軟體可以硬體,硬體如大名鼎鼎的 F5 負載均衡裝置,軟體如 NGINX 中的負載均衡實現,又如 Springcloud Ribbon 元件中的負載均衡實現。 如果看到這裡你還不知道負載均衡是幹嘛的,那麼只能放一張圖了,畢竟沒圖說個啥。 ![正經的負載均衡示例](https://cdn.jsdelivr.net/gh/niumoo/cdn-assets/2020/image-20200527075734086.png) 負載均衡要做到在多次請求下,每臺伺服器被請求的次數大致相同。但是實際生產中,可能每臺機器的效能不同,我們會希望效能好的機器承擔的請求更多一些,這也是正常需求。 如果這樣說下來你看不懂,那我就再舉個例子好了,一排可愛的小熊(伺服器)站好。 ![一排要被訪問的伺服器](https://cdn.jsdelivr.net/gh/niumoo/cdn-assets/2020/image-20200527082251915.png) 這時有人(使用者)要過來打臉(請求訪問)。 ![使用者請求](https://cdn.jsdelivr.net/gh/niumoo/cdn-assets/2020/image-20200527082442214.png) 那麼怎麼樣我們才能讓這每一個可愛的小熊被打的次數大致相同呢? 又或者熊 4 比較胖,抗擊打能力是別人的兩倍,我們怎麼提高熊 4 被打的次數也是別人的兩倍呢? 又或者每次出手的力度不同,有重有輕,恰巧熊 4 總是承受這種大力度啪啪打臉,熊 4 即將不省熊事,還要繼續打它嗎? 這些都是值的思考的問題。 **說了那麼多,口乾舌燥,我雙手已經飢渴難耐了,迫不及待的想要擼起程式碼了。** ## 1. 隨機訪問 上面說了,為了負載均衡,我們必須保證多次出手後,熊 1 到熊 4 被打次數均衡。比如使用隨機訪問法,根據數學上的概率論,隨機出手次數越多,每隻熊被打的次數就會越相近。程式碼實現也比較簡單,使用一個隨機數,隨機訪問一個就可以了。 ```java /** 伺服器列表 */ private sta