天天看點

keepalive+nginx實作負載均衡高可用_Nginx + SpringBoot 實作負載均衡。

↑ 點選上面 “時代Java”關注我們, 關注新技術,學習新知識!

負載均衡介紹

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

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

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

keepalive+nginx實作負載均衡高可用_Nginx + SpringBoot 實作負載均衡。

負載均衡政策

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

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

nginx.conf 配置示例:

upstream nowjavacom {   server www.nowjava.com;   server link.nowjava.com;}
           

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

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

nginx.conf 配置示例:

upstream nowjavacom {    least_conn;    server www.nowjava.com;    server link.nowjava.com;}
           

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

upstream nowjavacom {     ip_hash;     server www.nowjava.com;     server link.nowjava.com;}
           

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

upstream nowjavacom {    hash $request_uri consistent;    server www.nowjava.com;    server link.nowjava.com;}
           

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

  • header :從伺服器接收第一個位元組的時間。
  • last_byte:從伺服器接收完整響應的時間。
  • last_byte inflight:從伺服器接收完整響應的時間。
upstream nowjavacom {    least_time header;    server www.nowjava.com;    server link.nowjava.com;}
           

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

  • least_conn :活動連接配接的最少數量
  • least_time=header (NGINX Plus):從伺服器接收響應标頭的最短平均時間 ($upstream_header_time)。
  • least_time=last_byte (NGINX Plus) :從伺服器接收完整響應的最短平均時間($upstream_response_time)。
upstream nowjavacom {         random two least_time=last_byte;        server www.nowjava.com;        server link.nowjava.com;    }
           

Nginx+SpringBoot實作負載均衡

環境準備

  • 依賴JDK1.8以上的版本;
  • 依賴Nginx環境;

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

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即可進行通路。

示例圖:

keepalive+nginx實作負載均衡高可用_Nginx + SpringBoot 實作負載均衡。

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

然後我們進行操作,并檢視控制台日志!

keepalive+nginx實作負載均衡高可用_Nginx + SpringBoot 實作負載均衡。

從上述示例圖中我們進行4次界面重新整理請求,最終平均配置設定到兩個服務中去了,從上述的測試結果中我們實作了負載均衡。

這裡我在說一下使用Nginx的注意事項,在進行學習和測試的時候,使用nginx預設的端口實作負載均衡一般沒有什麼問題,但是當我們在項目中使用的時候,特别有登入界面的并且端口不是80的時候,會出現登入的界面無法跳轉,進行調試的話會出現 net::ERR_NAME_NOT_RESOLVED這樣的錯誤,出現這個原因的是因為nginx預設的端口是80,那麼預設跳轉的也是這個,是以出現這種情況的時候,需要在location 下添加proxy_set_header Host  $host:port 這個配置,port 和listen 的端口保持一緻就可以了。

--

知識分享,時代前行!

~~ 時代Java

還有更多好文章……

請檢視曆史文章和官網,

↓有分享,有收獲~

繼續閱讀