任务要求:在负载均衡的条件下,在外部模拟持续访问服务器某个路径,比如 http://服务器ip/api/test ,在不报错的情况下,完成两个节点的升级
比如你们的 jar 包里面 /api/test 接口原本返回内容 v1
//这个是无限循环访问一个 api 的命令,每隔 10 毫秒请求一次,你们可以用行命令去测试节点升级
while true; do curl -X GET "http://ip/api"; sleep 0.01; done
1. 准备四个项目 av1,av2,bv1,bv2
项目可实现http://服务器ip地址/api/test
返回对应v1或v2字段
@RestController
@RequestMapping("/api")
public class zl {
@GetMapping("/test")
public String test(){
return "v1";
}
}
利用scp -r C://v1v2/zl-app-0.0.1-SNAPSHOT-v1.jar root@ip地址:/home/project-test
传输四个文件
2. 后台启动两个项目
让输出v1的两个程序运行
nohup java -jar zl-app-0.0.1-SNAPSHOT-v1.jar &
3. 配置文件修改 升级8081端口节点
//修改 upstream 配置,只保留一个节点。
upstream backend {
server 192.168.1.100:8081;
# server 192.168.1.100:8082; # 注释掉这个节点
}
重新加载 Nginx 配置
sudo nginx -s reload
4. 升级节点
现在所有流量都导向 192.168.1.100:8081,你可以安全地升级 192.168.1.100:8082
查看jar相关进程 kill对应pid
ps aux | grep jar
kill 49332 //第一个命令后的第二列
5. 切换流量到升级后的节点
升级完成后,修改 upstream 配置,将流量导向升级后的节点。
upstream backend {
# server 192.168.1.100:8080; # 注释掉这个节点
server 192.168.1.101:8080;
}
重新加载 Nginx 配置
sudo nginx -s reload
6. 升级另一个节点:
现在所有流量都导向 192.168.1.101:8080,你可以安全地升级 192.168.1.100:801。
7. 恢复完整配置
两个节点都升级完成后,恢复完整的 upstream 配置
upstream backend {
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
重新加载 Nginx 配置
sudo nginx -s reload
通过这种方式,你可以逐步升级服务节点,确保在升级过程中服务不会中断。Nginx 的灵活配置使得流量导流变得简单且高效。
Nginx的reload机制
导流
导流(Traffic Shifting)是实现无感升级的一种常见技术手段。