GWT应用程序可以部署蓝/绿部署吗?

时间:2013-06-01 14:59:25

标签: java gwt load-balancing requestfactory blue-green-deployment

我读过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/myappgreen.example.com/myapp。我不相信一旦将GWT应用程序下载到客户端,GWT(我在这里使用 RequestFactory )最终将知道与bluegreen进行通信。

所以我问:这可能吗?是否有任何特殊的配置/代码/库/技术等我需要利用才能使这项工作?我没有想到的任何警告或陷阱?提前谢谢!

1 个答案:

答案 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来检测您的应用的新版本是否已发布,然后询问用户刷新。但同样,无论您遵循什么策略,它都适用于任何部署过程。