首頁  >  文章  >  Java  >  Nginx+SpringBoot怎麼實現負載平衡

Nginx+SpringBoot怎麼實現負載平衡

WBOY
WBOY轉載
2023-05-29 17:28:061466瀏覽

負載平衡介紹

在介紹nginx的負載平衡實作之前,先簡單的說下負載平衡的分類,主要分為硬體負載平衡和軟體負載平衡,硬體負載平衡是使用專門的軟體和硬體結合的設備,設備商會提供完整成熟的解決方案,例如f5,在資料的穩定性以及安全性來說非常可靠,但是相比軟體而言造價會更加昂貴;軟體的負載平衡以nginx這類軟體為主,實現的一種訊息佇列分發機制。

簡單來說所謂的負載平衡就是把很多請求進行分流,將他們分配到不同的伺服器去處理。例如我有3個伺服器,分別為a、b、c,然後使用nginx進行負載平衡,使用輪詢策略,此時如果收到了9個請求,那麼會均勻的將這9個請求分發給a、b 、cf伺服器,每一個伺服器處理3個請求,這樣的話我們可以利用多台機器叢集的特性減少單一伺服器的壓力。

nginx實作負載平衡的範例圖:

Nginx+SpringBoot怎麼實現負載平衡

#負載平衡策略

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實作負載平衡

#環境準備

  • #依賴jdk1.8以上的版本;


  • 依賴於nginx環境;


  • ##這裡的專案就用本人之前的一個springboot項目,springboot的項目位址: https://github.com/xuwujing/springboot-study/tree/master/springboot-thymeleaf

首先我們下載這個項目,輸入:

mvn clean package

 將項目進行打包為jar檔,然後將application.properties和此jar項目放在一個資料夾中,然後複製該資料夾(這裡為了清晰所以進行複製,實際上不複製更改端口重啟也行),修改複製資料夾application.properties的端口,例如改為8086。

nginx 設定


我們找到nginx的設定檔nginx.conf,該設定在nginx/conf/nginx.conf目錄下,然後我們來修改該配置,新增如下配置:

    upstream pancm:定義一個名稱,隨意就行;
  • server ip:連接埠or 網域名稱;

  • 如果不想使用round robin策略,也可以換其他的。

然後在server新增/修改如下配置:

配置說明:

    #server: 虛擬主機的名稱,一個http中可以配置多個server;
  • listen:nginx預設的連接埠;
  • server_name:nginx服務的位址,可以使用域名,多個用空格分隔。
  • proxy_pass:代理路徑,一般配置upstream後面的名稱用於實現負載平衡,可以直接配置ip進行跳躍;

  • ##nginx.conf 完整的設定:

負載平衡測試

在完成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即可進行存取。

範例圖:

Nginx+SpringBoot怎麼實現負載平衡

註:這裡我使用的是windows系統做測試,實際linux也是一樣的。

然後我們進行操作,並查看控制台日誌!

Nginx+SpringBoot怎麼實現負載平衡

從上述範例圖中我們進行4次介面刷新請求,最終平均分配到兩個服務中去了,從上述的測試結果中我們實現了負載平衡。

這裡我在說一下使用nginx的注意事項,在進行學習和測試的時候,使用nginx預設的連接埠實現負載平衡一般沒有什麼問題,但是當我們在專案中使用的時候,特別有登入介面的且連接埠不是80的時候,會出現登入的介面無法跳轉,進行偵錯的話會出現net::err_name_not_resolved這樣的錯誤,出現這個原因的是因為nginx預設的連接埠是80,那麼預設跳轉的也是這個,所以發生這種情況的時候,需要在location 下新增proxy_set_header host $host:port 這個配置,port 和listen 的連接埠保持一致就可以了。

以上是Nginx+SpringBoot怎麼實現負載平衡的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除