我读了马丁·福勒(Martin Fowler)的蓝绿部署文章,非常喜欢它。基本上,这个概念是你有两个生产环境:一个“蓝色”LIVE环境和一个“绿色”LIVE环境。在任何给定时间,你只有一个环境被视为“真正的”LIVE环境。因此,你在这两个LIVE环境前放置某种路由/切换机制(可能是中间件Web应用程序或修改后的软件负载均衡器),来决定用户被路由到哪个环境(我们在这里谈论的是Web应用程序)。
所以你让所有用户路由到,比如说,绿色LIVE环境的
当您确信生产更改(应用于蓝色LIVE)没有错误/问题时,您将重新配置路由器,现在将所有流量重定向到
现在,进入我的问题:
我正在设计一个GWT应用程序,并希望实现这种蓝/绿色切换模式。问题是,GWT应用程序是客户端应用程序,不遵循Spring、Struts、JSP、servlet应用程序所使用的常规服务器端Web应用程序架构。
因此,我想问:如何拥有两个Tomcat实例(Blue Tomcat和Green Tomcat),为用户提供相同GWT应用程序的两个不同版本,从蓝/绿色“路由器”后面服务?通过“路由器”,我可能在谈论
以下是该问题的可视化描述:
这是基本的架构:问题在于客户端将向
所以你让所有用户路由到,比如说,绿色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/myapp
或green.example.com/myapp
。我不确定GWT(我在这里使用RequestFactory)最终是否知道与blue
或green
通信,一旦GWT应用程序下载到客户端。
所以我问:这可能吗?我需要使用任何特殊的配置/代码/库/技术等来使其工作吗?我没有考虑到任何注意事项或陷阱吗?谢谢!