1. 程式人生 > >Nginx+SpringBoot實現負載均衡

Nginx+SpringBoot實現負載均衡

前言

在上一篇中介紹了Nginx的安裝,本篇文章主要介紹的是Nginx如何實現負載均衡。

負載均衡介紹

介紹

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

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

Nginx實現負載均衡的示例圖:

負載均衡策略

NGINX開源支援四種負載平衡方法,而NGINX Plus又增加了兩種方法。

1.Round Robin: 對所有的請求進行輪詢傳送請求,預設的分配方式。

nginx.conf 配置示例:

upstream xuwujing {
   server www.panchengming.com;
   server www.panchengming2.com;
}

注:上面的域名也可以用IP替代。

2.Least Connections: 以最少的活動連線數將請求傳送到伺服器,同樣要考慮伺服器權重。

nginx.conf 配置示例:

upstream xuwujing {
    least_conn;
    server www.panchengming.com;
    server www.panchengming2.com;
}

3.IP Hash : 傳送請求的伺服器由客戶機IP地址決定。在這種情況下,使用IPv4地址的前三個位元組或整個IPv6地址來計算雜湊值。該方法保證來自相同地址的請求到達相同的伺服器,除非該伺服器不可用。

upstream xuwujing {
     ip_hash;
     server www.panchengming.com;
     server www.panchengming2.com;
}

4.Generic Hash: 請求傳送到的伺服器由使用者定義的鍵決定,該鍵可以是文字字串、變數或組合。

    upstream xuwujing {
        hash $request_uri consistent;
        server www.panchengming.com;
        server www.panchengming2.com;
    }

5.Least Time (NGINX Plus only) – 對於每個請求,NGINX Plus選擇具有最低平均延遲和最低活動連線數的伺服器,其中最低平均延遲是根據包含least_time指令的下列引數計算的:

  • header : 從伺服器接收第一個位元組的時間。
  • last_byte: 從伺服器接收完整響應的時間。
  • last_byte inflight:從伺服器接收完整響應的時間。

    upstream xuwujing {
    least_time header;
    server www.panchengming.com;
    server www.panchengming2.com;
    }

6.Random:每個請求將被傳遞到隨機選擇的伺服器。如果指定了兩個引數,首先,NGINX根據伺服器權重隨機選擇兩個伺服器,然後使用指定的方法選擇其中一個。

  • least_conn :活動連線的最少數量
  • least_time=header (NGINX Plus):從伺服器接收響應標頭的最短平均時間 ($upstream_header_time)。
  • least_time=last_byte (NGINX Plus) :從伺服器接收完整響應的最短平均時間($upstream_response_time)。

    upstream xuwujing {
    random two least_time=last_byte;
    server www.panchengming.com;
    server www.panchengming2.com;
    }

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 127.0.0.1:8085;
   server 127.0.0.1:8086;
}
  • upstream pancm:定義一個名稱,隨意就行;
  • server + ip:埠 or 域名;

如果不想使用Round Robin策略,也可以換成其他的。

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

 server {
        listen       80;
        server_name  127.0.0.1;


        location / {
            root   html;
            proxy_pass http://pancm;
            proxy_connect_timeout 3s;
            proxy_read_timeout 5s;
            proxy_send_timeout 3s;  
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

配置說明:

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

nginx.conf 完整的配置:

events {
    worker_connections  1024;
}

error_log nginx-error.log info;
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

      upstream pancm{
       server 127.0.0.1:8085;
       server 127.0.0.1:8086;
    }
    
    server {
        listen       80;
        server_name  127.0.0.1;


        location / {
            root   html;
            proxy_pass http://pancm;
            proxy_connect_timeout 3s;
            proxy_read_timeout 5s;
            proxy_send_timeout 3s;  
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

負載均衡測試

在完成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 的埠保持一致就可以了。

其他

參考

https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
http://nginx.org/en/

相關文章

Nginx Linux和Windows安裝教程:https://www.cnblogs.com/xuwujing/p/11899890.html
SpringBoot+SpringCloud實現負載均衡: https://www.cnblogs.com/xuwujing/p/10273989.html

音樂推薦

原創不易,如果感覺不錯,希望點贊或推薦!您的支援是我寫作的最大動力!
版權宣告:
作者:虛無境
部落格園出處:http://www.cnblogs.com/xuwujing
CSDN出處:http://blog.csdn.net/qazwsxpcm 
掘金出處:https://juejin.im/user/5ae45d5bf265da0b8a6761e4   
個人部落格出處:http://www.panchengming.