我读过Martin Fowler的Blue/Green Deployment文章并且非常喜欢它。基本上,这是您拥有2个生产级环境的概念:“蓝色”LIVE环境和“绿色”LIVE环境。在任何给定时间,您只有1个环境被认为是“真正的”LIVE环境。因此,您在这两个LIVE环境的前面放置了某种路由/交换机制(可能是中间Web应用程序或修改过的软件负载均衡器),这些环境决定了用户路由到哪些环境(我们在这里谈论Web应用程序)。
因此,您将所有用户路由到http://green.example.com/myapp
的绿色生活环境。然后,当您准备推出一些新的生产更改,而不是将它们部署到Green LIVE时,您将它们部署到Blue LIVE,并开始将一小部分(约10%)的用户路由到Blue LIVE。典型的策略是让路由器使用IP地址或cookie来确定用户是否应该路由到蓝色或绿色。
当您确信生产更改没有错误/问题(适用于Blue LIVE)时,您需要重新配置路由器,以便将所有流量重定向到http://blue.example.com/myapp
处的Blue LIVE。
现在,关于我的问题:
我正在设计一个GWT应用程序,并希望实现这种蓝/绿开关模式。问题是GWT应用程序是客户端的,并不遵循Spring,Struts,JSP,servlet应用程序使用的常规服务器端Web应用程序架构。
所以我问:我怎么能拥有2个Tomcat实例(Blue Tomcat和Green Tomcat),从蓝色/绿色“路由器”后面为用户提供同一GWT应用程序的两个不同版本?通过“路由器”,我可能正在谈论http://router.example.com/myapp-router
的中间网络应用程序。
从视觉上看,这是问题所在:
green.example.com:8080/opt/tomcat/webapps/myapp.war/ --> Green Tomcat
myModule/
mymodule.nocache.js
mymodule.cache.html } typical GWT app WAR structure...
hosts/ this is currently the "real" LIVE
index.html environment where 90% traffic is routed to
css/
main.css
WEB-INF/
web.xml
lib/
classes/
blue.example.com:8080/opt/tomcat/webapps/myapp.war/ --> Blue Tomcat
myModule/
mymodule.nocache.js
mymodule.cache.html } typical GWT app WAR structure...
hosts/ new production changes have been deployed here
index.html and 10% of users are routed here
css/
main.css
WEB-INF/
web.xml
lib/
classes/
router.example.com:8080/opt/tomcat/webapps/myapp-router.war/ --> Router
WEB-INF/
web.xml
lib/ } simple headless WAR that inspects HTTP Requests and
classes/ determines which environment to redirect user to
这是基本架构:问题是客户端会向router.example.com/myapp-router
发出请求,路由器会将请求转发到blue.example.com/myapp
或green.example.com/myapp
。我不相信一旦将GWT应用程序下载到客户端,GWT(我在这里使用 RequestFactory )最终将知道与blue
或green
进行通信。
所以我问:这可能吗?是否有任何特殊的配置/代码/库/技术等我需要利用才能使这项工作?我没有想到的任何警告或陷阱?提前谢谢!
答案 0 :(得分:0)
无论部署策略如何,都需要进行相同的部署准备:蓝绿色,金丝雀(请参阅您的其他问题,Canary release strategy vs. Blue/Green,讨论差异)或升级单个服务器。单个客户端成功升级的浏览器级视图是相同的:每个请求都看到旧版本,部署发生,每个请求现在都看到新版本。同样,单个客户端的升级和回滚失败的浏览器级视图也是相同的。
几年前,当我使用GWT应用程序时,我们的策略是捕获GWT在服务器上遇到新的不兼容版本时抛出的异常,并向用户显示要求刷新浏览器的消息。本文提供了更多细节:http://codebetter.com/kylebaley/2012/01/06/deploying-a-new-version-of-a-gwt-app-2/它还提到,如果您使用Google App Engine,您可以使用GAE的渠道API来检测您的应用的新版本是否已发布,然后询问用户刷新。但同样,无论您遵循什么策略,它都适用于任何部署过程。