在实际项目中,灰度发布和回滚是非常常见的需求。灰度发布指在生产环境中逐步发布新版本,而不是一次性全部发布,以降低线上问题的风险;回滚则是在发现问题时快速恢复上一个可用版本,以保证业务的可用性。本文将介绍如何使用 PM2 工具实现 Node.js 应用程序的灰度发布和回滚。
准备工作
首先,需要安装 PM2 工具。如果您还没有安装,可以使用以下命令进行安装:
npm install -g pm2
接下来,需要准备两个版本的 Node.js 应用程序代码,分别为旧版本和新版本。两个版本的代码应该处于不同的目录中。
灰度发布
配置文件
在使用 PM2 进行灰度发布之前,需要先创建一个配置文件。在旧版本的代码目录中创建一个 pm2_config.json 文件,填写以下内容:
-- -------------------- ---- ------- - ------ - ------- ---------- --------- ----------- ------ - ----------- ------------ - -- --------- - ------------- - ------- ----------- ------- -------------- ------ ---------------- ------- -------------------------------------- ------- ------------------- -------------- ---- ------- -- --- ------------- --------------- ----- ----------- - - -
这里的配置中,name 表示应用程序的名称,script 表示应用程序的启动文件,env 表示环境变量,这里设置为 production。deploy 中的 production 部分表示生产环境的部署信息,user 和 host 分别表示服务器登录的用户名和 IP 地址,ref 表示 Git 的分支,repo 表示 Git 仓库的地址,path 表示应用程序部署的目录,post-deploy 表示在部署完成后需要执行的命令,这里是安装依赖并启动应用程序。
发布新版本
在新版本的代码目录中,切换到 Git 分支,并提交代码。然后在旧版本的代码目录中使用以下命令进行发布:
pm2 deploy pm2_config.json production
这里的 pm2_config.json 是配置文件的路径,production 表示需要部署到生产环境。
在部署过程中,PM2 会自动启动新版本的应用程序,并在后台监听和记录日志。此时可以通过以下命令查看应用程序的状态:
pm2 list
可以看到,应用程序的状态为 online,表示已经成功启动。
观察流量
在发布新版本后,建议等待一段时间后,再根据业务情况逐步将流量切换到新版本。可以通过以下方式来实现:
- 在负载均衡器上设置某个比例的请求流量转到新版本的服务器上。
- 在 DNS 解析中,针对某些域名或者地区,将新版本的服务器设置为首选的 IP。
具体实现方式可以根据具体业务情况来决定。如果观察到新版本在生产环境的表现良好,可以逐步提高流量的转发比例,直到全部流量转到新版本上。
回滚
如果在灰度发布的过程中,发现了问题,需要立即回滚到上一个可用版本。这时,可以使用 PM2 提供的 rollback 命令进行回滚。具体操作如下:
- 使用如下命令列出发布的版本:
pm2 deploy pm2_config.json production list
会显示所有发布的版本,包括其 Git 分支、Commit ID、发布时间等信息。
找到需要回滚的版本的 Commit ID。
使用如下命令进行回滚:
pm2 deploy pm2_config.json production revert COMMIT_ID
这里的 pm2_config.json、production 分别是配置文件和部署环境的标识,COMMIT_ID 是需要回滚的版本的 Git Commit ID。
回滚成功后,PM2 会自动重启旧版本的应用程序,并自动删除新版本的应用程序。可以通过以下命令进行验证:
pm2 list
此时可以看到旧版本的应用程序已经恢复在线上。
总结
灰度发布和回滚是保证生产环境稳定可靠的关键技术。使用 PM2 工具可以非常方便地实现 Node.js 应用程序的灰度发布和回滚。希望本文能够对大家在日常工作中实现灰度发布和回滚有所帮助。
示例代码:https://github.com/pm2-hive/pm2-deploy-example
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65a7da37add4f0e0ff0fd535