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

3
我读了马丁·福勒(Martin Fowler)的蓝绿部署文章,非常喜欢它。基本上,这个概念是你有两个生产环境:一个“蓝色”LIVE环境和一个“绿色”LIVE环境。在任何给定时间,你只有一个环境被视为“真正的”LIVE环境。因此,你在这两个LIVE环境前放置某种路由/切换机制(可能是中间件Web应用程序或修改后的软件负载均衡器),来决定用户被路由到哪个环境(我们在这里谈论的是Web应用程序)。
所以你让所有用户路由到,比如说,绿色LIVE环境的http://green.example.com/myapp。然后,当你准备推出一些新的生产变更时,不是将它们部署到绿色LIVE,而是将它们部署到蓝色LIVE,并开始将一小部分(约10%)的用户路由到蓝色LIVE。典型的策略是让路由器使用IP地址或Cookie来确定用户是否应该路由到蓝色或绿色。
当您确信生产更改(应用于蓝色LIVE)没有错误/问题时,您将重新配置路由器,现在将所有流量重定向到http://blue.example.com/myapp上的Blue LIVE。
现在,进入我的问题:
我正在设计一个GWT应用程序,并希望实现这种蓝/绿色切换模式。问题是,GWT应用程序是客户端应用程序,不遵循Spring、Struts、JSP、servlet应用程序所使用的常规服务器端Web应用程序架构。
因此,我想问:如何拥有两个Tomcat实例(Blue Tomcat和Green Tomcat),为用户提供相同GWT应用程序的两个不同版本,从蓝/绿色“路由器”后面服务?通过“路由器”,我可能在谈论http://router.example.com/myapp-router的中间Web应用程序。
以下是该问题的可视化描述:
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(我在这里使用RequestFactory)最终是否知道与bluegreen通信,一旦GWT应用程序下载到客户端。

所以我问:这可能吗?我需要使用任何特殊的配置/代码/库/技术等来使其工作吗?我没有考虑到任何注意事项或陷阱吗?谢谢!


1
你所描述的部署过程实际上是金丝雀部署(增量),而不是蓝绿部署(一次性全部)。这并不否定你的问题,但需要修订。 - Dave Schweisguth
1个回答

1
无论是蓝绿部署、金丝雀发布(有关差异的讨论请参见您的另一个问题金丝雀发布策略 vs. 蓝绿部署)还是升级单个服务器,都需要进行相同的部署准备工作。对于单个客户端浏览器级别的成功升级视图来说,每个请求都会看到旧版本,然后进行部署,每个请求现在都会看到新版本。同样,单个客户端浏览器级别的失败升级和回滚视图也是相同的。
当我几年前使用GWT应用程序时,我们的策略是捕获GWT在与服务器上不兼容的新版本相遇时抛出的异常,并向用户显示消息,要求他们刷新浏览器。这篇文章提供了更多细节:http://codebetter.com/kylebaley/2012/01/06/deploying-a-new-version-of-a-gwt-app-2/它还提到,如果您使用Google App Engine,则可以使用GAE的Channel API来检测您的应用程序是否已发布新版本,然后要求用户刷新。但是,无论使用何种策略,它都适用于任何部署过程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接