Tomcat中的上下文路径路由(服务交换)

时间:2012-06-15 07:25:15

标签: java tomcat deployment

以下是我想要实现的目标:

我有一个Web服务A,我希望能够与其他类型的Web服务 - 不同版本一起部署。现在我假设并排2个实例。我需要它,因为该服务有一个预热阶段,这需要一些时间来从DB构建东西,只有在它准备就绪后它才能开始提供请求......

我正在考虑部署到Tomcat6上下文路径,例如:“/ ServiceA-1.0”“/ ServiceA-2.0” 然后有一个“虚拟”的上下文,如“/ ServiceA”,它将指向所需的物理服务,例如 “/ ServiceA-1.0”。因此外部世界将了解ServiceA,但在内部,我的ServiceA相关堆栈将知道版本化的ServiceA URL(涉及更多组件,但只有ServiceA服务于外部世界)。当新服务准备就绪时,我只需重新配置“虚拟”上下文以指向新服务。

到目前为止,我无法找到如何使用Tomcat执行此操作并开始tkink它是不可能的。我找到了将Apache Server放在Tomcat前面并在那里进行路由的建议,但除非必要,否则我不想再注册其他软件。

我的问题是:
- 这种“虚拟”上下文和路由可能与Tomcat6有关吗? - 任何其他选择,智慧和经验教训如何实现这种服务交换方案?

最佳,
约瑟夫

3 个答案:

答案 0 :(得分:2)

鉴于您提到的预热期,我假设您在切换实施时需要或多或少的不间断服务。这在前面的Apache中很容易处理。

我通常享受从这个额外层获得的灵活性。 Apache对您的系统来说不是太具侵略性。另外 - 如果你在unix上运行 - 它是微不足道的(读取:默认)让Apache在端口80上侦听,同时你需要额外的里程让tomcat侦听端口80 而不是以root身份运行

如果您从未接触过Apache,请放心,它很容易在短时间内学习。特别是当你不需要它带来的全部功率时。配置反向代理(或mod_jk)随处可见。您提到的功能是反向代理和负载均衡器的混合 - 即使您只有一台服务器来平衡“之间”的负载,您将拥有两种不同的上下文/版本。

不要害怕Apache,你正走在正确的道路上:)。

答案 1 :(得分:0)

我不记得Tomcat是否具有本机能力,但你应该能够通过一个简单的Web应用程序servlet轻松地完成你想要的东西。基本上创建一个监听“/ ServiceA”的servlet,并将所有内容重定向到您需要的URL。您可以创建一个简单的管理页面(使用阀门来控制对它的访问?)或JMX服务来控制您想要重定向的端点。

不像在前面使用Apache HTTPDLighttpd之类的东西那么简单,但可能同样有效,并允许你保留Tomcat中的所有内容,如果这真的是你想要的。

Pound也是一个非常快/轻量级的负载均衡器,您可以在服务前运行,但如果内存服务,则无法动态更改配置;必须停止并重新启动它。然而,停止和启动或发送SIGHUP是快速的,所以它不应该太痛苦。当然,这确实意味着除Tomcat之外还必须运行/配置/支持的单独二进制文件。

我只是在重读你原来的问题,并意识到没有人回答你关于切换服务的警告的问题。您没有指明您的服务是否为无状态,但您需要担心/考虑在两种服务之间切换时丢失会话/状态的影响。除此之外,我认为影响微乎其微。

答案 2 :(得分:0)

Tomcat 7支持开箱即用的版本控制。你只是部署,例如服务## 1.war,服务## 2.war等,它们都显示为/ Service,并且现有的最新版本是默认版本,或者您可以与特定版本对话。使用运行mod_proxy的Apache HTTPD前端,你已经完成了。我建议使用mod_proxy_ajp而不是mod_proxy_jk,因为它更容易配置,并且似乎没有任何功能给我。