簡介
採用一個SpringBoot後端服務,在不同的端口啓動,以模擬多個服務,這裏以兩個爲例說明;
- 操作系統:Windows 7
第一步 備好多項服務,啓動
- 代碼
package com.nginx.loadbalance.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* LoadBalanceController
*/
@RestController
public class LoadBalanceController {
@Value("${server.port}")
private String port;
@GetMapping("/api/v1/serve")
public String serve() {
return "This is Server: " + port;
}
}
- 啓動
先打包:mvn clean package
;然後開啓兩個服務。
java -jar loadbalance-0.0.1-SNAPSHOT.jar --server.port=8000
java -jar loadbalance-0.0.1-SNAPSHOT.jar --server.port=9000
第二步 在 Nginx 中完成負載均衡配置
- 編輯 Nginx 配置文件,在 nginx.conf 文件中新增
upstream
,server
節點如下(Linux 一般通過vi /etc/nginx/nginx.conf
修改)
upstream api-server {
server 127.0.0.1:8000;
server 127.0.0.1:9000;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://api-server;
proxy_redirect default;
}
}
第三步 驗證負載均衡
切記,驗證之前先要使用nginx -s reload
刷新 Nginx 配置。
訪問http://localhost/api/v1/serve
,觀察頁面顯示的信息,將在兩個服務之間按照默認的分發方式進行分發:
-
This is Server: 8000
-
This is Server: 9000
Notes:可能遇到的問題
配置負載均衡,瀏覽器請求時報錯 “HTTP Status 400 – Bad Request”,以下是剛開始報錯的配置信息
upstream api_server {
server 127.0.0.1:8000;
server 127.0.0.1:9000;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://api_server;
proxy_redirect default;
}
}
可是,nginx -t 測試結果竟然顯示成功,而在後端服務日誌報錯:
- 原因分析:nginx中upstream後面的名稱不能包含下劃線,與Nginx配置文件中的屬性名衝突(eg:server_name)。
- 解決方法:去掉下劃線或者以-代替_
至此,基於Nginx與SpringBoot,實現了負載均衡。
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!