<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Nginx + Spring Boot 實(shí)現(xiàn)負(fù)載均衡

          共 4720字,需瀏覽 10分鐘

           ·

          2020-09-17 04:50

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 4.6 分鐘。

          來自:虛無境的博客
          鏈接:8rr.co/LSUH

          前言

          本篇文章主要介紹的是Nginx如何實(shí)現(xiàn)負(fù)載均衡。

          負(fù)載均衡介紹

          在介紹Nginx的負(fù)載均衡實(shí)現(xiàn)之前,先簡單的說下負(fù)載均衡的分類,主要分為硬件負(fù)載均衡和軟件負(fù)載均衡,硬件負(fù)載均衡是使用專門的軟件和硬件相結(jié)合的設(shè)備,設(shè)備商會提供完整成熟的解決方案,比如F5,在數(shù)據(jù)的穩(wěn)定性以及安全性來說非??煽浚窍啾溶浖栽靸r會更加昂貴;軟件的負(fù)載均衡以Nginx這類軟件為主,實(shí)現(xiàn)的一種消息隊(duì)列分發(fā)機(jī)制。
          簡單來說所謂的負(fù)載均衡就是把很多請求進(jìn)行分流,將他們分配到不同的服務(wù)器去處理。比如我有3個服務(wù)器,分別為A、B、C,然后使用Nginx進(jìn)行負(fù)載均衡,使用輪詢策略,此時如果收到了9個請求,那么會均勻的將這9個請求分發(fā)給A、B、Cf服務(wù)器,每一個服務(wù)器處理3個請求,這樣的話我們可以利用多臺機(jī)器集群的特性減少單個服務(wù)器的壓力。
          Nginx實(shí)現(xiàn)負(fù)載均衡的示例圖:

          負(fù)載均衡策略

          NGINX開源支持四種負(fù)載平衡方法,而NGINX Plus又增加了兩種方法。
          1.Round Robin: 對所有的請求進(jìn)行輪詢發(fā)送請求,默認(rèn)的分配方式。
          nginx.conf 配置示例:
          upstream xuwujing {   server www.panchengming.com;   server www.panchengming2.com;}
          注:上面的域名也可以用IP替代。
          2.Least Connections:以最少的活動連接數(shù)將請求發(fā)送到服務(wù)器,同樣要考慮服務(wù)器權(quán)重。
          nginx.conf 配置示例:
          upstream?xuwujing?{
              least_conn;    server www.panchengming.com;    server www.panchengming2.com;}
          3.IP Hash : 發(fā)送請求的服務(wù)器由客戶機(jī)IP地址決定。在這種情況下,使用IPv4地址的前三個字節(jié)或整個IPv6地址來計算散列值。該方法保證來自相同地址的請求到達(dá)相同的服務(wù)器,除非該服務(wù)器不可用。
          upstream xuwujing {     ip_hash;     server www.panchengming.com;     server www.panchengming2.com;}
          4.Generic Hash: 請求發(fā)送到的服務(wù)器由用戶定義的鍵決定,該鍵可以是文本字符串、變量或組合。
           upstream xuwujing {     hash $request_uri consistent;     server www.panchengming.com;        server www.panchengming2.com; }
          5.Least Time (NGINX Plus only) – 對于每個請求,NGINX Plus選擇具有最低平均延遲和最低活動連接數(shù)的服務(wù)器,其中最低平均延遲是根據(jù)包含least_time指令的下列參數(shù)計算的:
          • header :從服務(wù)器接收第一個字節(jié)的時間。
          • last_byte:從服務(wù)器接收完整響應(yīng)的時間。
          • last_byte inflight:從服務(wù)器接收完整響應(yīng)的時間。

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

          6.Random:每個請求將被傳遞到隨機(jī)選擇的服務(wù)器。如果指定了兩個參數(shù),首先,NGINX根據(jù)服務(wù)器權(quán)重隨機(jī)選擇兩個服務(wù)器,然后使用指定的方法選擇其中一個。

          • least_conn :活動連接的最少數(shù)量
          • least_time=header (NGINX Plus):從服務(wù)器接收響應(yīng)標(biāo)頭的最短平均時間 ($upstream_header_time)。
          • least_time=last_byte (NGINX Plus) :從服務(wù)器接收完整響應(yīng)的最短平均時間($upstream_response_time)。
          upstream xuwujing { random two least_time=last_byte; server www.panchengming.com; server www.panchengming2.com; }

          Nginx+SpringBoot實(shí)現(xiàn)負(fù)載均衡

          環(huán)境準(zhǔn)備

          • 依賴JDK1.8以上的版本;
          • 依賴Nginx環(huán)境;
          這里的項(xiàng)目就用本人之前的一個springboot項(xiàng)目,SpringBoot的項(xiàng)目地址: https://github.com/xuwujing/springBoot-study/tree/master/springboot-thymeleaf
          首先我們下載這個項(xiàng)目,輸入:mvn clean package?將項(xiàng)目進(jìn)行打包為jar文件,然后將application.properties和此jar項(xiàng)目放在一個文件夾中,然后復(fù)制該文件夾(這里為了清晰所以進(jìn)行復(fù)制,實(shí)際不復(fù)制更改端口重啟也行),修改復(fù)制文件夾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: 虛擬主機(jī)的名稱,一個http中可以配置多個server;
          • listen:Nginx默認(rèn)的端口;
          • server_name:Nginx服務(wù)的地址,可以使用域名,多個用空格分隔。
          • proxy_pass:代理路徑,一般配置upstream后面的名稱用于實(shí)現(xiàn)負(fù)載均衡,可以直接配置ip進(jìn)行跳轉(zhuǎn);
          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; } }}

          負(fù)載均衡測試

          在完成Nginx配置之后,我們啟動Nginx。

          linux輸入/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf,如果已經(jīng)啟動可以使用/usr/local/nginx/sbin/nginx -s reload命令進(jìn)行熱加載配置文件,Windows直接點(diǎn)擊Nginx目錄下的nginx.exe或者?cmd運(yùn)行start nginx進(jìn)行啟動,如果啟動了依舊可以使用nginx -s reload進(jìn)行熱加載。

          Nginx啟動完成之后,我們依次啟動剛剛下載的springboot和復(fù)制更改端口的項(xiàng)目,輸入:java -jar springboot-jsp-thymeleaf.jar啟動。

          都啟動成功之后,我們在瀏覽器輸入服務(wù)的ip即可進(jìn)行訪問。

          示例圖:

          注:這里我使用的是windows系統(tǒng)做測試,實(shí)際linux也是一樣的。

          然后我們進(jìn)行操作,并查看控制臺日志!

          從上述示例圖中我們進(jìn)行4次界面刷新請求,最終平均分配到兩個服務(wù)中去了,從上述的測試結(jié)果中我們實(shí)現(xiàn)了負(fù)載均衡。

          這里我在說一下使用Nginx的注意事項(xiàng),在進(jìn)行學(xué)習(xí)和測試的時候,使用nginx默認(rèn)的端口實(shí)現(xiàn)負(fù)載均衡一般沒有什么問題。

          但是當(dāng)我們在項(xiàng)目中使用的時候,特別有登錄界面的并且端口不是80的時候,會出現(xiàn)登錄的界面無法跳轉(zhuǎn),進(jìn)行調(diào)試的話會出現(xiàn)?net::ERR_NAME_NOT_RESOLVED這樣的錯誤。

          出現(xiàn)這個原因的是因?yàn)閚ginx默認(rèn)的端口是80,那么默認(rèn)跳轉(zhuǎn)的也是這個,所以出現(xiàn)這種情況的時候,需要在location 下添加proxy_set_header Host $host:port 這個配置,port 和listen 的端口保持一致就可以了。

          推薦閱讀:

          昨天,百度被綠了?

          SpringBoot + Redis + 注解 + 攔截器來實(shí)現(xiàn)接口冪等性校驗(yàn)

          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號內(nèi)回復(fù)「2048」,即可免費(fèi)獲?。?!

          微信掃描二維碼,關(guān)注我的公眾號

          朕已閱?

          瀏覽 124
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本五十路熟女视频 | 亚洲日韩在线免费观看 | XA片一级日本 | 亚洲最大的黄色网 | 日韩操片 |