用 Nginx 导流,模拟分布式环境下服务节点升级

87 阅读2分钟

任务要求:在负载均衡的条件下,在外部模拟持续访问服务器某个路径,比如  http://服务器ip/api/test ,在不报错的情况下,完成两个节点的升级

比如你们的 jar 包里面 /api/test 接口原本返回内容 v1

//这个是无限循环访问一个 api 的命令,每隔 10 毫秒请求一次,你们可以用行命令去测试节点升级
while truedo 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机制

image.png

导流

导流(Traffic Shifting)是实现无感升级的一种常见技术手段。