摘要:使用nginx對spring boot項目進行反向代理,並且使用輪詢均衡負載策略
均衡負載與集群
集群和均衡都涉及到多個機器提供的服務的問題
不同點是,集群是互相通信、協同的的多個服務,服務之前能夠狀態共享。而均衡負載一般說的是,服務之間相互獨立,不知道彼此。因此,使用均衡負載最好是提供的無狀態的服務,如果服務有狀態,那么就需要一個統一管理狀態的服務單獨部署
搭建過程
相關工具
- 使用spring boot快速搭建一個web項目
- virtual box作為虛擬機,並安裝docker
- 獨立安裝nginx,對docker容器進行反向代理
spring boot項目
只需要添加spring-boot-starter-web
依賴即可,並且添加如下代碼
package com.luzj.mychdocker10;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author luzj
* @description:
* @date 2018/7/27
*/
@RestController
public class IndexController {
@RequestMapping("/index")
public String index(){
return "hello docker 1";
}
@RequestMapping("/tips")
public String tips(){
return "是莉娜呀!!!";
}
}
然后將項目打包,之后修改上面index()
的代碼,使返回不同的字符串,這樣便於觀察nginx是否將請求分發到每一個服務上面去
服務2代碼
@RequestMapping("/index")
public String index(){
return "hello docker 2";
}
服務3代碼
@RequestMapping("/index")
public String index(){
return "hello docker 3";
}
分別將3個服務打成jar
,待之后部署到docker上,分別是mychdocker10-0.0.1-SNAPSHOT.jar
,mychdocker10-0.0.2-SNAPSHOT.jar
,mychdocker10-0.0.3-SNAPSHOT.jar
docker+nginx部署項目
docker和nginx全部部署在virtual box上。其中docker部署用來部署前面的jar
包,而nginx單獨部署,對三個docker容器代理。
之所以nginx單獨部署,是因為單獨拉取的nginx鏡像無法使用vim編寫配置文件。
使用docker部署jar包
# 在 /home/<username>/目錄下新建 dockerdir目錄
mkdir -p /home/<username>/dockerdir
# 將jar包拷入dockerdir中
# 編寫Dockerfile
vim Dockerfile
# Dockerfile內容
FROM java:8
add mychdocker10-0.0.3-SNAPSHOT.jar app.jar
expose 8080
entrypoint ["java","-jar","/app.jar"]
# 編譯docker鏡像,balancejar 為鏡像名稱, . 表示當前目錄
docker build -t balancejar .
# 運行容器,8081:8080表示將docker內部8080端口映射到宿主機的8081端口,docker的宿主機就是virtual box,之后還需要對virtual box再進行一次映射,映射到本機
docker run -d -p 8081:8080 --name balanceContainer balancejar
另外兩個jar的的部署方式和上面的一樣,分別映射到8082和8083端口
docker鏡像列表:
docker容器列表:
virtual box端口映射
我們的docker是安裝在virtual box上面的,如果想讓本機可以訪問,還需要將虛擬機的端口映射到宿主機的端口
選擇[控制]->[設置]->[網絡]->[端口轉發]
,即可見端口映射配置面板,如下圖
查看docker部署結果
可以看到直接在本機上可以訪問了
配置nginx
nginx打開配置文件
vim /usr/local/nginx/conf/nginx.conf
添加如下配置信息到http模塊里面
# 配置代理server組,標識為Tomcat
upstream tomcat {
server 127.0.0.1:8081 weight=10;
server 127.0.0.1:8082 weight=10;
server 127.0.0.1:8083 weight=10;
}
server {
listen 80; # 默認監聽端口80
server_name cc520.me;# 對外服務名
# ...其他配置信息
# 配置代理路徑
location /docker{
proxy_pass http://tomcat/;
}
# 對“/”路徑轉發 /docker
location = / {
return 302 /docker;
}
# ...其他配置信息
}
映射nginx監聽端口
將virtual box 80端口映射到本機
訪問nginx進行驗證
依次訪問http://cc520.me/docker/index
3次,可以看到如下結果
第一次
第二次
第三次
可以看到nginx使用默認的輪詢策略進行服務分發,訪問3次,依次訪問了代理的3個服務
小結
我們使用docker部署springboot項目,之后使用nginx對3個docker容器進行代理,最后在瀏覽器訪問查看nginx是否對springboot項目進行均衡負載