使用Nginx Web Server进行Spring应用程序的蓝绿色部署

图片


注意事项 佩雷夫 -在本文中,我们开始进行一系列针对零停机时间部署的翻译。 以下出版物将重点介绍使用数据库部署应用程序的新版本以及在Kubernetes中进行部署。


尽管以下描述的技术解决方案存在争议,但本文的目的是使读者直接熟悉蓝绿色部署方法,顺便说一下,该方法不仅适用于Spring应用程序。


蓝绿色部署的目标是消除在部署新版本的应用程序期间的停机时间。


当安装新版本的应用程序以替换旧版本的服务器时,停机与服务器不可用相关。 蓝色/绿色部署的想法是将新版本的应用程序部署在可以进行测试的单独位置,直到最终决定将其切换为主要版本为止。


图片


在本文中,我们将研究如何配置Spring引导应用程序的蓝绿色部署。 我们将使用Nginx作为主要的Web服务器,将传入的请求重定向到我们的应用程序。


服务器设置


本指南假定您具有服务器和正在运行的Spring Boot应用程序,可以将其部署到该服务器。


在服务器上,转到主目录并创建两个文件夹: bluegreen 。 然后,我们需要两个available符号链接并testing 。 这些链接将指向蓝色或绿色文件夹。 例如,如果available指向green ,则testing指向blue


 mkdir blue mkdir green ln -s ./green ./available ln -s ./blue ./testing 

每个文件夹将包含其自己的Spring应用程序和Nginx配置。 在部署过程中的某个时刻, 两个应用程序将同时运行 (尽管在不同的端口上),并且要从蓝色的应用程序切换为绿色, 我们只需要将Nginx配置更改为绿色或蓝色即可。


图片


Nginx配置


假设我们有一个springsite.com域。 Nginx的绿色配置会将所有对springsite.com/api/的调用重定向到端口8080上的green应用程序,并将所有对springsite.com/api-test/的调用重定向到端口8090上的blue应用程序。


让我们创建这些配置文件。 打开您喜欢的编辑器并添加以下内容。


 http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name mysite.com; location /api { proxy_pass http://localhost:8090/api; } location /api-test { proxy_pass http://localhost:8080/api; } } include servers/*; } 

 http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name mysite.com; location /api { proxy_pass http://localhost:8080/api; } location /api-test { proxy_pass http://localhost:8090/api; } } include servers/*; } 

文件结构应如下所示:


 --root |--- blue |--- nginx.conf.blue |--- app-V2.jar |--- green |--- nginx.conf.green |--- app-V1.jar |--- available -> ./green |--- testing -> ./blue 

假设我们要在一个blue容器中部署一个新版本。 我们可以在以前的版本仍然可用的情况下对其进行测试 。 一旦每个人都对新版本感到满意,我们只需要更改链接!


在包含bluegreen文件夹的文件夹中创建swap.sh文件:


 touch swap.sh chmod +x swap.sh 

将以下内容添加到swap.sh文件中:


 #!/bin/bash testing_now=$(ls -l ./ | grep testing) if [[ "$testing_now" == *blue ]] then testing="blue" active="green" else testing="green" active="blue" fi #remove current links rm ./available rm ./testing rm -f /etc/nginx/nginx.conf #create new links with the active/inactive reversed ln -s ./$inactive ./available ln -s ./$active ./testing ln -s /home/ubuntu/spring/$active/nginx.conf /etc/nginx/nginx.conf #reload the http server service nginx reload echo swap completed $active is now available 

至此,我们可以在端口8090和8080上运行2个Spring应用程序,并通过运行sudo ./swap.sh对其进行更改。


部署


多亏了符号链接,我们知道主应用程序始终由available指示,而被testing则始终由testing指示。 因此,我们应该始终使用符号链接在testing文件夹中部署该应用程序的新版本。 假定我们已经打包了应用程序,现在可以使用scp下载它了。


 scp -r -i ~/.ssh/MyKeyPair.pem <package name.jar> <user>@<ip>:spring/testing 

继续前进


在服务器上设置蓝绿色部署将大大减少停机时间 。 本指南说明了如何部署驻留在同一物理服务器上的应用程序的新版本。 它可以适应具有多个物理服务器和负载平衡器的情况。 但是,这将需要具有两倍数量的生产环境。 对于非常大的基础架构,这是不可能的,或者非常昂贵。


这就引出了一个问题: 大型公司如何在不停机的情况下发布新版本的应用程序? 想想一直可用的Google或Facebook!


由于需要大量服务器,因此在此处使用蓝绿色部署是不现实的。 应用程序更新是逐步进行的:将服务器一一停止运行,并在更新后返回。 此外,新版本也逐渐发布:一开始,只有一小部分服务器可以与新版本一起使用。 然后,如果未发现问题或错误,则越来越多的服务器将使用新代码启动。 此时,将评估重要的性能指标,例如CPU,内存和查询性能。 如果一切顺利,则发行完成,并将在世界各地的每台服务器上启动该应用程序的新版本。


结论


我希望您现在了解通过Blue-Green部署如何解决停机问题。 现在,您可以使用NGINX配置Spring应用程序的基本蓝绿色部署。


您可能已经注意到,当我们使用此解决方案时,您的应用程序的旧版本和当前版本会同时工作,并且都连接到数据库。 在更改数据库的结构时,这可能导致意外的问题。 这篇很棒的文章https://spring.io/blog/2016/05/31/zero-downtime-deployment-with-a-database描述了如何处理这种情况。


最后,您可能对以下事实感兴趣:AWS和Google Cloud Compute都提供了开箱即用的Blue-Green Deployment服务:


https://aws.amazon.com/quickstart/architecture/blue-green-deployment/
https://cloud.google.com/solutions/continuous-delivery/


另请阅读我们博客上的其他文章:


Source: https://habr.com/ru/post/zh-CN470568/


All Articles