使用Nginx的upstream实现springboot项目的灰度发布

场景:我们在发布springboot项目至生产环境时,常常需要停服并启动,这样会影响客户生产环境上的操作

解决方案:使用Nginx的upstream实现热备,ps:当然也可以用springcloud或实现,这里只讲nginx实现


操作:

1、如现在有一个项目jar包为:project.jar ,放到project目录下,启动端口为4020,将项目启动(配置可自行调整):nohup java -Xms512m -Xmx1024m --server.port=4020 project.jar >log.log 2>&1 &


2、复制一份jar包,命名为project-backup.jar,放到project-backup目录下,启动端口为40209,将项目启动(配置可自行调整):nohup java -Xms512m -Xmx1024m --server.port=40209 project-backup.jar >log.log 2>&1 &


3、编辑Nginx配置文件,增加upstream和修改location:

upstream hotload {
    server 127.0.0.1:4020 max_fails=3 fail_timeout=10s; # 重试3次,超时10秒
    server 127.0.0.1:40209 backup;
}
server {
    # 此处server配置省略
    
	location /project/ {
        proxy_pass   http://hotload/project/;
        proxy_redirect off;
        proxy_set_header  Host $http_host;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}


验证方法:尝试访问项目的某个接口,如curl http://127.0.0.1/project/test,并查看两个服务的日志,当主服务未宕机,会将请求都发到主服务,日志会打印

1、使用命令杀掉主服务ps -ef | grep project.jar | awk '{print $2}' | xargs kill -9

2、尝试访问项目接口,看是否能正常访问,查看服务project-backup的log.log文件是否正常打印