負載平衡介紹
在介紹nginx的負載平衡實作之前,先簡單的說下負載平衡的分類,主要分為硬體負載平衡和軟體負載平衡,硬體負載平衡是使用專門的軟體和硬體結合的設備,設備商會提供完整成熟的解決方案,例如f5,在資料的穩定性以及安全性來說非常可靠,但是相比軟體而言造價會更加昂貴;軟體的負載平衡以nginx這類軟體為主,實現的一種訊息佇列分發機制。
簡單來說所謂的負載平衡就是把很多請求進行分流,將他們分配到不同的伺服器去處理。例如我有3個伺服器,分別為a、b、c,然後使用nginx進行負載平衡,使用輪詢策略,此時如果收到了9個請求,那麼會均勻的將這9個請求分發給a、b 、cf伺服器,每一個伺服器處理3個請求,這樣的話我們可以利用多台機器叢集的特性減少單一伺服器的壓力。
nginx實作負載平衡的範例圖:
#負載平衡策略
nginx開源支援四種負載平衡方法,而nginx plus又增加了兩種方法。
1.round robin:
對所有的請求進行輪詢發送請求,預設的分配方式。
nginx.conf 設定範例:
註:上面的網域也可以用ip取代。
2.least connections:
以最少的活動連線數將請求傳送到伺服器,同樣要考慮伺服器權重。
nginx.conf 設定範例:
3.ip hash :
傳送請求的伺服器由客戶機ip位址決定。在這種情況下,使用ipv4位址的前三個位元組或整個ipv6位址來計算雜湊值。此方法保證來自相同位址的請求到達相同的伺服器,除非該伺服器不可用。
4.generic hash:
請求傳送到的伺服器由使用者定義的鍵決定,該鍵可以是文字字串、變數或組合。
5.least time (nginx plus only)
對於每個請求,nginx plus選擇具有最低平均延遲和最低活動連線數的伺服器,其中最低平均延遲是根據包含least_time指令的下列參數計算的:
header : 從伺服器接收第一位元組的時間。
last_byte: 從伺服器接收完整回應的時間。
last_byte inflight:從伺服器接收完整回應的時間。
6.random:
每個請求將傳遞到隨機選擇的伺服器。如果指定了兩個參數,首先,nginx根據伺服器權重隨機選擇兩個伺服器,然後使用指定的方法選擇其中一個。
least_conn :活動連線的最少數量
#least_time=header (nginx plus):從伺服器接收回應標頭的最短平均時間( $upstream_header_time)。
least_time=last_byte (nginx plus) :從伺服器接收完整回應的最短平均時間($upstream_response_time)。
nginx springboot實作負載平衡
#環境準備
首先我們下載這個項目,輸入:
mvn clean package 將項目進行打包為jar檔,然後將application.properties
和此jar項目放在一個資料夾中,然後複製該資料夾(這裡為了清晰所以進行複製,實際上不複製更改端口重啟也行),修改複製資料夾application.properties
的端口,例如改為8086。
我們找到nginx的設定檔nginx.conf,該設定在nginx/conf/nginx.conf目錄下,然後我們來修改該配置,新增如下配置:
然後在server新增/修改如下配置:
配置說明:
負載平衡測試
在完成nginx配置之後,我們啟動nginx。
linux輸入/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
,如果已經啟動可以使用/usr/local/nginx /sbin/nginx -s reload
命令進行熱加載配置文件,windows直接點擊nginx目錄下的nginx.exe
或者 cmd
運行start nginx
進行啟動,如果啟動了依舊可以使用nginx -s reload
#進行熱載入。
nginx啟動完成之後,我們依序啟動剛剛下載的springboot和複製更改連接埠的項目,輸入:java -jar springboot-jsp-thymeleaf.jar
啟動。
都啟動成功之後,我們在瀏覽器輸入服務的ip即可進行存取。
範例圖:
註:這裡我使用的是windows系統做測試,實際linux也是一樣的。
然後我們進行操作,並查看控制台日誌!
從上述範例圖中我們進行4次介面刷新請求,最終平均分配到兩個服務中去了,從上述的測試結果中我們實現了負載平衡。
這裡我在說一下使用nginx的注意事項,在進行學習和測試的時候,使用nginx預設的連接埠實現負載平衡一般沒有什麼問題,但是當我們在專案中使用的時候,特別有登入介面的且連接埠不是80的時候,會出現登入的介面無法跳轉,進行偵錯的話會出現net::err_name_not_resolved這樣的錯誤,出現這個原因的是因為nginx預設的連接埠是80,那麼預設跳轉的也是這個,所以發生這種情況的時候,需要在location 下新增proxy_set_header host $host:port 這個配置,port 和listen 的連接埠保持一致就可以了。
以上是Nginx+SpringBoot怎麼實現負載平衡的詳細內容。更多資訊請關注PHP中文網其他相關文章!