2

我阅读了 Martin Fowler 的Blue/Green Deployment文章,非常喜欢它。基本上,你有两个生产级环境的概念:一个“蓝色”LIVE 环境和一个“绿色”LIVE 环境。在任何给定时间,您只有 1 个环境被认为是“真实”的 LIVE 环境。因此,您在这两个 LIVE 环境之前放置了某种路由/切换机制(可能是中间 Web 应用程序或修改后的软件负载平衡器),以指示用户被路由到哪个环境(我们在这里谈论 Web 应用程序)。

因此,您的所有用户都被路由到了,例如,位于 的 Green LIVE 环境http://green.example.com/myapp。然后,当您准备好推出一些新的生产更改时,而不是将它们部署到 Green LIVE,而是将它们部署到 Blue LIVE,并开始将一小部分(~10%)的用户路由到 Blue LIVE。典型的策略是让路由器使用 IP 地址或 cookie 来确定用户应该被路由到蓝色还是绿色。

当您确信您的生产更改(应用于 Blue LIVE 上)没有错误错误/问题时,您重新配置路由器,现在将所有流量重定向到 Blue LIVE 的http://blue.example.com/myapp.

现在,关于我的问题:

我正在设计一个 GWT 应用程序,并希望实现这种蓝/绿切换模式。问题是 GWT 应用程序是客户端的,不遵循 Spring、Struts、JSP、servlet 应用程序使用的普通服务器端 Web 应用程序架构。

所以我问:我怎么会有 2 个 Tomcat 实例(蓝色 Tomcat 和绿色 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(我在这里使用RequestFactory)最终会知道与GWT 应用程序下载到客户端中的任何一个blue或一旦进行通信。green

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

4

1 回答 1

0

无论部署策略如何,都需要进行相同的部署准备:蓝绿、金丝雀(请参阅您的另一个问题,金丝雀发布策略与蓝/绿,以了解差异的讨论)或升级单个服务器。单个客户端对成功升级的浏览器级别视图是相同的:每个请求看到旧版本,部署发生,每个请求现在看到新版本。同样,单个客户端对失败升级和回滚的浏览器级别视图是相同的。

几年前我使用 GWT 应用程序时,我们的策略是捕获 GWT 在服务器上遇到新的不兼容版本时抛出的异常,并向用户显示一条消息,要求他们刷新浏览器。这篇文章提供了更多细节:http ://codebetter.com/kylebaley/2012/01/06/deploying-a-new-version-of-a-gwt-app-2/它还提到如果你使用谷歌App Engine 你可以使用 GAE 的 Channel API 来检测你的应用的新版本已经发布,然后要求用户刷新。但同样,无论您遵循什么策略,它都适用于任何部署过程。

于 2014-06-03T13:03:34.040 回答