Nginx + Spring Boot 實(shí)現(xiàn)負(fù)載均衡
來(lái)自:虛無(wú)境的博客?| 責(zé)編:樂樂
鏈接:8rr.co/LSUH
前言
本篇文章主要介紹的是Nginx如何實(shí)現(xiàn)負(fù)載均衡。
負(fù)載均衡介紹
在介紹Nginx的負(fù)載均衡實(shí)現(xiàn)之前,先簡(jiǎn)單的說(shuō)下負(fù)載均衡的分類,主要分為硬件負(fù)載均衡和軟件負(fù)載均衡,硬件負(fù)載均衡是使用專門的軟件和硬件相結(jié)合的設(shè)備,設(shè)備商會(huì)提供完整成熟的解決方案,比如F5,在數(shù)據(jù)的穩(wěn)定性以及安全性來(lái)說(shuō)非常可靠,但是相比軟件而言造價(jià)會(huì)更加昂貴;軟件的負(fù)載均衡以Nginx這類軟件為主,實(shí)現(xiàn)的一種消息隊(duì)列分發(fā)機(jī)制。
簡(jiǎn)單來(lái)說(shuō)所謂的負(fù)載均衡就是把很多請(qǐng)求進(jìn)行分流,將他們分配到不同的服務(wù)器去處理。比如我有3個(gè)服務(wù)器,分別為A、B、C,然后使用Nginx進(jìn)行負(fù)載均衡,使用輪詢策略,此時(shí)如果收到了9個(gè)請(qǐng)求,那么會(huì)均勻的將這9個(gè)請(qǐng)求分發(fā)給A、B、Cf服務(wù)器,每一個(gè)服務(wù)器處理3個(gè)請(qǐng)求,這樣的話我們可以利用多臺(tái)機(jī)器集群的特性減少單個(gè)服務(wù)器的壓力。
Nginx實(shí)現(xiàn)負(fù)載均衡的示例圖:

負(fù)載均衡策略
NGINX開源支持四種負(fù)載平衡方法,而NGINX Plus又增加了兩種方法。
1.Round Robin: 對(duì)所有的請(qǐng)求進(jìn)行輪詢發(fā)送請(qǐng)求,默認(rèn)的分配方式。
nginx.conf 配置示例:
upstream?xuwujing?{
???server?www.panchengming.com;
???server?www.panchengming2.com;
}
注:上面的域名也可以用IP替代。
2.Least Connections:以最少的活動(dòng)連接數(shù)將請(qǐng)求發(fā)送到服務(wù)器,同樣要考慮服務(wù)器權(quán)重。
關(guān)注公眾號(hào)程序員小樂回復(fù)關(guān)鍵字“Java”獲取Java面試題和答案。
nginx.conf 配置示例:
upstream?xuwujing?{
????least_conn;
????server?www.panchengming.com;
????server?www.panchengming2.com;
}
3.IP Hash : 發(fā)送請(qǐng)求的服務(wù)器由客戶機(jī)IP地址決定。在這種情況下,使用IPv4地址的前三個(gè)字節(jié)或整個(gè)IPv6地址來(lái)計(jì)算散列值。該方法保證來(lái)自相同地址的請(qǐng)求到達(dá)相同的服務(wù)器,除非該服務(wù)器不可用。
upstream?xuwujing?{
?????ip_hash;
?????server?www.panchengming.com;
?????server?www.panchengming2.com;
}
4.Generic Hash: 請(qǐng)求發(fā)送到的服務(wù)器由用戶定義的鍵決定,該鍵可以是文本字符串、變量或組合。
?upstream?xuwujing?{
?????hash?$request_uri?consistent;
?????server?www.panchengming.com;
????????server?www.panchengming2.com;
?}
5.Least Time (NGINX Plus only) – 對(duì)于每個(gè)請(qǐng)求,NGINX Plus選擇具有最低平均延遲和最低活動(dòng)連接數(shù)的服務(wù)器,其中最低平均延遲是根據(jù)包含least_time指令的下列參數(shù)計(jì)算的:
header :從服務(wù)器接收第一個(gè)字節(jié)的時(shí)間。
last_byte:從服務(wù)器接收完整響應(yīng)的時(shí)間。
last_byte inflight:從服務(wù)器接收完整響應(yīng)的時(shí)間。
upstream xuwujing { least_time header; server www.panchengming.com; server www.panchengming2.com; }
6.Random:每個(gè)請(qǐng)求將被傳遞到隨機(jī)選擇的服務(wù)器。如果指定了兩個(gè)參數(shù),首先,NGINX根據(jù)服務(wù)器權(quán)重隨機(jī)選擇兩個(gè)服務(wù)器,然后使用指定的方法選擇其中一個(gè)。
least_conn :活動(dòng)連接的最少數(shù)量
least_time=header (NGINX Plus):從服務(wù)器接收響應(yīng)標(biāo)頭的最短平均時(shí)間 ($upstream_header_time)。
least_time=last_byte (NGINX Plus) :從服務(wù)器接收完整響應(yīng)的最短平均時(shí)間($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)目就用本人之前的一個(gè)springboot項(xiàng)目,SpringBoot的項(xiàng)目地址: https://github.com/xuwujing/springBoot-study/tree/master/springboot-thymeleaf
首先我們下載這個(gè)項(xiàng)目,輸入:mvn clean package?將項(xiàng)目進(jìn)行打包為jar文件,然后將application.properties和此jar項(xiàng)目放在一個(gè)文件夾中,然后復(fù)制該文件夾(這里為了清晰所以進(jìn)行復(fù)制,實(shí)際不復(fù)制更改端口重啟也行),修改復(fù)制文件夾application.properties的端口,比如改為8086。
Nginx 配置
我們找到nginx的配置文件nginx.conf,該配置在nginx/conf/nginx.conf目錄下,然后我們來(lái)修改該配置,新增如下配置:
upstream?pancm{
???server?127.0.0.1:8085;
???server?127.0.0.1:8086;
}
upstream pancm:定義一個(gè)名稱,隨意就行; 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;
????????}
????}
配置說(shuō)明:
server: 虛擬主機(jī)的名稱,一個(gè)http中可以配置多個(gè)server; listen:Nginx默認(rèn)的端口; server_name:Nginx服務(wù)的地址,可以使用域名,多個(gè)用空格分隔。 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ù)載均衡測(cè)試
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf,如果已經(jīng)啟動(dòng)可以使用/usr/local/nginx/sbin/nginx -s reload命令進(jìn)行熱加載配置文件,Windows直接點(diǎn)擊Nginx目錄下的nginx.exe或者?cmd運(yùn)行start nginx進(jìn)行啟動(dòng),如果啟動(dòng)了依舊可以使用nginx -s reload進(jìn)行熱加載。java -jar springboot-jsp-thymeleaf.jar啟動(dòng)。

參考
相關(guān)文章
推薦閱讀
1.??為什么 char 數(shù)組比 String 更適合存儲(chǔ)密碼?
2.??慌:一次訂單號(hào)重復(fù),差點(diǎn)被開除
3.??Spring的Controller是單例還是多例?怎么保證并發(fā)的安全
之前博主分享了很多資源,有的已經(jīng)刪除了(你懂得),如果有的你當(dāng)時(shí)沒有領(lǐng)到還想領(lǐng)得就可以加我微信
回復(fù)“Nginx反向”獲取nginx反向代理學(xué)習(xí)視頻
點(diǎn)贊是最大的支持?
點(diǎn)贊是最大的支持?

