Nginx+SpringBoot實現負載均衡

2021-02-14 SpringForAll社區
前言

本篇文章主要介紹的是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指令的下列參數計算的:

last_byte inflight:從伺服器接收完整響應的時間。

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

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

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實現負載均衡環境準備

這裡的項目就用本人之前的一個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:定義一個名稱,隨意就行;

如果不想使用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;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.htmlSpringBoot+SpringCloud實現負載均衡: https://www.cnblogs.com/xuwujing/p/10273989.html

相關焦點

  • Nginx負載均衡使用心得
    Nginx負載均衡使用心得 前一段時間在負責實施一個項目,利用nginx的七層負載均衡的良好性能做調度器,後端兩臺PHP應用伺服器,實現靜動態分離處理,在整個系統環境全部部署完後,把應用程式放上去測試時,發現一個問題,現把問題和解決辦法寫出來,與大家一起分享和討論。
  • 使用NGINX和NGINX Plus進行Docker Swarm負載均衡
    此外,內置了DNS服務發現和負載均衡,您可以設置覆蓋集群範圍的網絡。Docker Swarm負載均衡拓撲圖6 Docker Swarm負載均衡器將客戶端請求轉發到NGINX Plus用以實現服務實例之間負載均衡類似地,Swarm負載均衡器接收服務間請求,而NGINX Plus實際上在服務之間分發它們(圖7)。
  • Nginx 反向代理、負載均衡圖文教程 !
    當然很多都是隨便一說的玩笑話,聽過一笑便可,不必當真,也不必抱怨了好了,今天就直接來說一下主題吧,前端要了解一些運維的Nginx用法,內容不多,簡單看看就好,這兩個功能在工作當中就夠用了,那麼首先來看個問題,什麼是反向代理與負載均衡什麼是反向代理與負載均衡什麼是反向代理當我們有一個伺服器集群,並且伺服器集群中的每臺伺服器的內容一樣的時候,同樣我們要直接從個人電腦訪問到伺服器集群伺服器的時候無法訪問
  • 負載均衡之LVS與Nginx對比
    LVS負載均衡IP隧道模式原理介紹以及配置實戰LVS負載均衡之DR模式原理介紹以及LVS概要文章:LVS負載均衡理論以及算法概要首先要清楚的一點是,LVS是一個四層的負載均衡器,雖然是四層,但並沒有TCP握手以及分手,只是偷窺了IP等信息,而Nginx是一個七層的負載均衡器,所以效率勢必比四層的LVS低很多,但是可操作性比LVS高
  • 誰說前端不需要懂-Nginx反向代理與負載均衡
    今天就直接來說一下主題吧,前端要了解一些運維的Nginx用法,內容不多,簡單看看就好,這兩個功能在工作當中就夠用了,那麼首先來看個問題,什麼是反向代理與負載均衡什麼是反向代理與負載均衡什麼是反向代理當我們有一個伺服器集群,並且伺服器集群中的每臺伺服器的內容一樣的時候,同樣我們要直接從個人電腦訪問到伺服器集群伺服器的時候無法訪問
  • 基於Docker部署 Tomcat集群、 Nginx負載均衡
    博文主要介紹了Tomcat 集群+ Ngixn 負載的Docker環境部署。兩種實現方式,一種是通過宿主機橋接方式,一種是通過 內部網絡Docker network 的方式Demo相關鏡像以上傳DockerHub:docker pull liruilong/nginx_logdocker pull liruilong/tomcat8當作一百世一樣。
  • 從0開始,在Linux中配置Nginx反向代理、負載均衡、session共享、動靜分離
    反向代理5.1 正向代理伺服器5.2 反向代理伺服器5.3 反向代理之負載均衡5.4 負載均衡進階6. session共享6.1 session共享的解決方案6.2 memcache實現session共享7. 動靜分離1.
  • 分布式系統的負載均衡
    這樣整體系統來看,就比較負載均衡第 1 層:客戶端層 -> 反向代理層 的負載均衡客戶端層 -> 反向代理層的負載均衡如何實現呢?答案是:DNS 的輪詢。 DNS 可以通過 A (Address,返回域名指向的 IP 地址)設置多個 IP 地址。
  • 大型網站架構系列:負載均衡詳解
    http,smtp,pop3協議的反向代理伺服器、緩存、負載均衡;支持FASTCGI(fpm)支持模塊化,過濾器(讓文本可以實現壓縮,節約帶寬),ssl及圖像大小調整。2.4均衡策略 nginx的負載均衡策略可以劃分為兩大類:內置策略和擴展策略。內置策略包含加權輪詢和ip hash,在默認情況下這兩種策略會編譯進nginx內核,只需在nginx配置中指明參數即可。擴展策略有很多,如fair、通用hash、consistent hash等,默認不編譯進nginx內核。
  • 講講億級PV的負載均衡架構!
    負載均衡,大家可能聽過什麼3層負載均衡、4層負載均衡、7層負載均衡什麼的?那這是怎麼分的呢,ok,是根據osi七層網絡模型來分的,例如nginx是工作在應用層,應用層剛好是在第7層,因此nginx又可以稱為7層負載均衡。我本來想一層層慢慢講,從最基礎的網絡協議開始講起,想了想又覺得這種講法不適合速成。
  • [Python3網絡爬蟲開發實戰] 7.3-Splash負載均衡配置
    配置負載均衡接下來,可以選用任意一臺帶有公網IP的主機來配置負載均衡。首先,在這臺主機上裝好Nginx,然後修改Nginx的配置文件nginx.conf,添加如下內容:這樣我們通過upstream欄位定義了一個名字叫作splash的服務集群配置。其中least_conn代表最少連結負載均衡,它適合處理請求處理時間長短不一造成伺服器過載的情況。
  • welcome to nginx|nginx是什麼
    >welcome to nginx,歡迎來到 nginx 的世界,如果你是一個專業網站建設人員你可能接觸最多的就是阿帕奇 apache,現在更多的網站建設人員都開始使用 LINUX 伺服器,那麼 LINUX 伺服器更好的會使用到 nginx,那麼什麼是 nginx,nginx 有什麼用,那麼下面 welcome to nginx 的世界,下面小編將帶大家介紹 nginx
  • 寫給前端快速入門的《Nginx 入門指南》
    除此之外,反向代理也是實現負載均衡的基礎,很多大公司的架構都應用到了反向代理。負載均衡負載均衡是什麼?隨著業務的不斷增長和用戶的不斷增多,一臺服務已經滿足不了系統要求了。這個時候就出現了伺服器 集群。這個就叫做負載均衡。負載均衡的示意圖如下:
  • 【行業資訊】nginxWebUI 1.9.2 發布,nginx 圖形化管理工具
    功能說明 本項目可以使用WebUI配置nginx的各項功能, 包括http協議轉發, tcp協議轉發, 反向代理, 負載均衡, 日誌管理和解析, ssl證書自動申請、續籤、配置等, 最終生成nginx.conf文件並覆蓋nginx的默認配置文件, 完成nginx的最終功能配置.
  • spring cloud中RestTemplate網絡請求框架和Ribbon負載均衡器
    本片主要是介紹spring cloud構建微服務系統的RIbbon負載均衡器和網絡請求框架RestTemplate的介紹。下一篇文章將會通過實例帶領大家如何通過Ribbon和RestTemplate相結合實現負載均衡。
  • Centos上搭建Nginx方法詳解
    Nginx就是性能非常好的反向代理伺服器,用來做負載均衡。 兩者的區別在於代理的對象不一樣:正向代理是為客戶端代理,反向代理是為服務端代理。nginx能實現負載均衡,什麼是負載均衡呢?就是我的項目部署在不同的伺服器上,但是通過統一的域名進入,nginx則對請求進行分發,減輕了伺服器的壓力。
  • 負載均衡、分布式、集群的理解以及多臺伺服器代碼如何同步
    所以負載均衡的概念就出現了。負載均衡負載均衡是指基於反向代理能將現在所有的請求根據指定的策略算法,分發到不同的伺服器上。常用實現負載均衡的可以用nginx,lvs。但是現在也有個問題,如果負載均衡伺服器出現問題了怎麼辦?所有冗餘的概念就出現了。冗餘冗餘其實就是兩個或者多臺伺服器 一個主伺服器,一個從伺服器。
  • Nginx 極簡教程(快速入門)
    Http 反向代理我們先實現一個小目標:不考慮複雜的配置,僅僅是完成一個 http 反向代理。nginx.conf 配置文件如下:註:conf/nginx.conf 是 nginx 的默認配置文件。MD5;      ssl_prefer_server_ciphers  on;      location / {          root   /root;          index  index.html index.htm;      }  }負載均衡前面的例子中,代理僅僅指向一個伺服器。
  • 雲上構建高可用實例——應用負載均衡
    2 概念摘要  京東雲中應用負載均衡的具體概念和描述參見其產品文檔,這裡羅列一些筆者學習時重要的點:3 負載均衡架構圖  這裡並不畫已經存在於京東雲文檔中的架構圖,這裡描述的是本文所搭建的應用負載均衡的具體樣例架構圖,之後的部署、性能測試均已此圖為準。
  • 淺談tomcat 、apache、 nginx的區別及優缺點
    Nginx與Apache比較1) nginx相對於apache的優點 輕量級,同樣起web 服務,比apache佔用更少的內存及資源  抗並發,nginx 處理請求是異步非阻塞的,而apache 則是阻塞型的,在高並發下nginx 能保持低資源低消耗高性能  高度模塊化的設計,編寫模塊相對簡單  提供負載均衡 社區活躍,各種高性能模塊出品迅速