Deploy web service via shell

本文介绍了一种在无法中断服务的情况下进行应用更新的方法。通过两台主机与Nginx的巧妙配置,实现零停机的灰度发布。具体步骤包括配置Nginx分发规则、更新服务及验证等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    开发中,由于XXOO原因,测试和生产环境是同一个,而且决策者不推荐使用CI(Jenkins),在开发中,需要较为频繁发布新版本,测试人员提出服务不能间断,此处不谈测试/生产为同一个环境或者需求是多么不合理,针对此需求,总结一个笨方法:

Env:2台host,A部署Nginx + APP,B部署APP

在A的nginx配置目录放三个配置文件:nginx.conf.a,nginx.conf.b,nginx.conf.ab,分别将请求分发到对应的服务提供者a/b/ab。

初始状态:nginx.conf.ab

0. 更新a服务

    |- 用nginx.conf.b替换nginx.conf

    |- 重新加载nginx配置

    |- 更新a

    |- 验证a

1. 更新b服务

    |- 用nginx.conf.a替换nginx.conf

    |- 重新加载nginx配置

    |- 更新b

    |- 验证b

2. ab负载均衡

    |- 用nginx.conf.ab替换nginx.conf

    |- 重新加载nginx配置

脚本如下,部分环境可能有区别,自行适配,如:本文登陆远程host方式为将本机的key放到目标host,如果是user/pass,可以使用sshpass组件来实现 。。。

deploy.sh

#!/bin/bash
server_a="a_ip"
server_b="b_ip"

delay=45

echo "Deploy begin ..."

echo "Redeploy a begin ..."
ssh root@$server_a 'bash -s'< deploy-reloadNginx.sh b

scp -r CoachService root@$server_a:~/projects/
ssh root@$server_a 'bash -s'< deploy-build.sh

echo "Sleep ${delay}s ..."
sleep ${delay}s

a_status=`curl -s -o /dev/null -w "%{http_code}" "http://$server_a:8080/heartbeat"`

if [ $a_status -eq 200 ]
then
  echo "Deploy a success ..."

  echo "Redeploy b begin ..."
  ssh root@$server_a 'bash -s'< deploy-reloadNginx.sh a

  scp -r CoachService root@$server_b:~/projects/
  ssh root@$server_b 'bash -s'< deploy-build.sh

  echo "Sleep ${delay}s ..."
  sleep ${delay}s

  b_status=`curl -s -o /dev/null -w "%{http_code}" "http://$server_b:8080/heartbeat"`

  if [ $b_status -eq 200 ]
    then
      echo "Deploy b success ..."
      ssh root@$server_a 'bash -s'< deploy-reloadNginx.sh ab
      echo "Deploy complete ..."
    else
      echo "Deploy b failed ..."
  fi
else
  echo "Deploy a failed ..."
fi

deploy-reloadNginx.sh 

#!/bin/bash
echo "Overwrite nginx.conf with nginx.conf.$1 ..."
\cp "/etc/nginx/nginx.conf.$1" /etc/nginx/nginx.conf

echo "Reload nginx ..."
nginx -s reload

deploy-build.sh

#!/bin/bash
echo "Package service ..."
export M2_HOME=/maven/home
export PATH=$M2_HOME/bin:$PATH

cd /project/path

mvn clean package -Dmaven.test.skip=true

echo "Replace the old package ..."
cp target/app-0.0.1-SNAPSHOT.jar /var/coach/app.jar

echo "Restart service ..."
service app-service restart --spring.profiles.active=production

 

转载于:https://my.oschina.net/geek4j/blog/876174

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值